diff --git a/llvm/lib/Analysis/AssumeBundleQueries.cpp b/llvm/lib/Analysis/AssumeBundleQueries.cpp --- a/llvm/lib/Analysis/AssumeBundleQueries.cpp +++ b/llvm/lib/Analysis/AssumeBundleQueries.cpp @@ -88,9 +88,11 @@ Result[Key][&Assume] = {0, 0}; continue; } - unsigned Val = cast( - getValueFromBundleOpInfo(Assume, Bundles, ABA_Argument)) - ->getZExtValue(); + auto *CI = dyn_cast( + 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}; diff --git a/llvm/unittests/Analysis/AssumeBundleQueriesTest.cpp b/llvm/unittests/Analysis/AssumeBundleQueriesTest.cpp --- a/llvm/unittests/Analysis/AssumeBundleQueriesTest.cpp +++ b/llvm/unittests/Analysis/AssumeBundleQueriesTest.cpp @@ -383,6 +383,15 @@ "(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(I), Map); + + ASSERT_TRUE(Map.empty()); + })); RunTest(Head, Tail, Tests); }