[Attributor] Fix: Gracefully handle non-instruction users

Function can have users that are not instructions, e.g., bitcasts. For
now, we simply give up when we see them.

llvm-svn: 369588
This commit is contained in:
Johannes Doerfert
2019-08-21 21:48:56 +00:00
parent bf9ee07afa
commit d98f975089
2 changed files with 28 additions and 1 deletions

View File

@@ -2321,7 +2321,11 @@ bool Attributor::checkForAllCallSites(const function_ref<bool(CallSite)> &Pred,
}
for (const Use &U : AssociatedFunction->uses()) {
Instruction *I = cast<Instruction>(U.getUser());
Instruction *I = dyn_cast<Instruction>(U.getUser());
// TODO: Deal with abstract call sites here.
if (!I)
return false;
Function *Caller = I->getFunction();
const auto &LivenessAA =

View File

@@ -0,0 +1,23 @@
; RUN: opt -S -attributor -attributor-disable=false < %s | FileCheck %s
define void @external() {
entry:
%a = alloca i32, align 4
%tmp = bitcast i32* %a to i8*
call void @foo(i32* nonnull %a)
; Check we do not crash on these uses
; CHECK: call void @callback1(void (i32*)* nonnull @foo)
call void @callback1(void (i32*)* nonnull @foo)
; CHECK: call void @callback2(void (i8*)* nonnull bitcast (void (i32*)* @foo to void (i8*)*))
call void @callback2(void (i8*)* bitcast (void (i32*)* @foo to void (i8*)*))
%tmp1 = bitcast i32* %a to i8*
ret void
}
define internal void @foo(i32* %a) {
entry:
ret void
}
declare void @callback1(void (i32*)*)
declare void @callback2(void (i8*)*)