forked from OSchip/llvm-project
[Inline] Use AssumptionCache from the right Function
This changes the behavior of AddAligntmentAssumptions to match its comment. I.e, prove the asserted alignment in the context of the caller, not the callee. Thanks to Mehdi Amini for seeing the issue here! Also to Artur Pilipenko who also saw a fix for the issue. rdar://22521387 Differential Revision: http://reviews.llvm.org/D12997 llvm-svn: 248390
This commit is contained in:
parent
aab93b59d4
commit
ff08e926ba
|
@ -741,7 +741,7 @@ static void AddAlignmentAssumptions(CallSite CS, InlineFunctionInfo &IFI) {
|
|||
// caller, then don't bother inserting the assumption.
|
||||
Value *Arg = CS.getArgument(I->getArgNo());
|
||||
if (getKnownAlignment(Arg, DL, CS.getInstruction(),
|
||||
&IFI.ACT->getAssumptionCache(*CalledFunc),
|
||||
&IFI.ACT->getAssumptionCache(*CS.getCaller()),
|
||||
&DT) >= Align)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
; RUN: opt -inline -S -o - < %s | FileCheck %s
|
||||
|
||||
%0 = type opaque
|
||||
%struct.Foo = type { i32, %0* }
|
||||
|
||||
; Test that we don't crash when inlining @bar (rdar://22521387).
|
||||
define void @foo(%struct.Foo* align 4 %a) {
|
||||
entry:
|
||||
call fastcc void @bar(%struct.Foo* nonnull align 4 undef)
|
||||
|
||||
; CHECK: call void @llvm.assume(i1 undef)
|
||||
; CHECK: unreachable
|
||||
|
||||
ret void
|
||||
}
|
||||
|
||||
define fastcc void @bar(%struct.Foo* align 4 %a) {
|
||||
; CHECK-LABEL: @bar
|
||||
entry:
|
||||
%b = getelementptr inbounds %struct.Foo, %struct.Foo* %a, i32 0, i32 1
|
||||
br i1 undef, label %if.end, label %if.then.i.i
|
||||
|
||||
if.then.i.i:
|
||||
call void @llvm.assume(i1 undef)
|
||||
unreachable
|
||||
|
||||
if.end:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @llvm.assume(i1)
|
Loading…
Reference in New Issue