[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:
Vedant Kumar 2015-09-23 15:49:08 +00:00
parent aab93b59d4
commit ff08e926ba
2 changed files with 32 additions and 1 deletions

View File

@ -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;

View File

@ -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)