[llvm] r248390 - [Inline] Use AssumptionCache from the right Function
Vedant Kumar via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 08:49:09 PDT 2015
Author: vedantk
Date: Wed Sep 23 10:49:08 2015
New Revision: 248390
URL: http://llvm.org/viewvc/llvm-project?rev=248390&view=rev
Log:
[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
Added:
llvm/trunk/test/Transforms/Inline/inline-assume.ll
Modified:
llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=248390&r1=248389&r2=248390&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Wed Sep 23 10:49:08 2015
@@ -741,7 +741,7 @@ static void AddAlignmentAssumptions(Call
// 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;
Added: llvm/trunk/test/Transforms/Inline/inline-assume.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/inline-assume.ll?rev=248390&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/Inline/inline-assume.ll (added)
+++ llvm/trunk/test/Transforms/Inline/inline-assume.ll Wed Sep 23 10:49:08 2015
@@ -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)
More information about the llvm-commits
mailing list