[FIX] Allow non-constant assume operand bundle operands.

Fixes PR49545

Reviewed By: zequanwu, fhahn, lebedev.ri

Differential Revision: https://reviews.llvm.org/D98444
This commit is contained in:
Johannes Doerfert 2021-03-11 13:43:09 -06:00
parent cdb42a4cc4
commit d22fbccfe2
2 changed files with 14 additions and 3 deletions

View File

@ -88,9 +88,11 @@ void llvm::fillMapFromAssume(CallInst &AssumeCI, RetainedKnowledgeMap &Result) {
Result[Key][&Assume] = {0, 0};
continue;
}
unsigned Val = cast<ConstantInt>(
getValueFromBundleOpInfo(Assume, Bundles, ABA_Argument))
->getZExtValue();
auto *CI = dyn_cast<ConstantInt>(
getValueFromBundleOpInfo(Assume, Bundles, ABA_Argument));
if (!CI)
continue;
unsigned Val = CI->getZExtValue();
auto Lookup = Result.find(Key);
if (Lookup == Result.end() || !Lookup->second.count(&Assume)) {
Result[Key][&Assume] = {Val, Val};

View File

@ -383,6 +383,15 @@ TEST(AssumeQueryAPI, fillMapFromAssume) {
"(nonnull|align|dereferenceable)"));
ASSERT_TRUE(FindExactlyAttributes(Map, Old, ""));
}));
Tests.push_back(std::make_pair(
"call void @llvm.assume(i1 true) [\"align\"(i8* undef, i32 undef)]",
[](Instruction *I) {
// Don't crash but don't learn from undef.
RetainedKnowledgeMap Map;
fillMapFromAssume(*cast<IntrinsicInst>(I), Map);
ASSERT_TRUE(Map.empty());
}));
RunTest(Head, Tail, Tests);
}