mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 05:32:28 +08:00
[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:
@@ -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 =
|
||||
|
||||
23
llvm/test/Transforms/FunctionAttrs/misc.ll
Normal file
23
llvm/test/Transforms/FunctionAttrs/misc.ll
Normal 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*)*)
|
||||
Reference in New Issue
Block a user