diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/Transforms/Inline/inline-assume.ll | 31 |
2 files changed, 32 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 638dfde7903..15cb26fbbd6 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -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; diff --git a/llvm/test/Transforms/Inline/inline-assume.ll b/llvm/test/Transforms/Inline/inline-assume.ll new file mode 100644 index 00000000000..4a7dc3edb22 --- /dev/null +++ b/llvm/test/Transforms/Inline/inline-assume.ll @@ -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) |

