diff options
| author | Xinliang David Li <davidxl@google.com> | 2017-06-07 18:32:24 +0000 |
|---|---|---|
| committer | Xinliang David Li <davidxl@google.com> | 2017-06-07 18:32:24 +0000 |
| commit | 4f49bee764da46d7d30408d8b3ff63e1127270dd (patch) | |
| tree | f479872fefc744ede3a4bcd8c51ac5cb498eb8d8 | |
| parent | c1e7a0dde551ff7778e38ce6a7c813958b220186 (diff) | |
| download | bcm5719-llvm-4f49bee764da46d7d30408d8b3ff63e1127270dd.tar.gz bcm5719-llvm-4f49bee764da46d7d30408d8b3ff63e1127270dd.zip | |
Fix builin_expect lowering bug
PR33346
Skip cases when expected value is not constant int.
llvm-svn: 304933
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/LowerExpectIntrinsic/PR33346.ll | 22 |
2 files changed, 25 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp b/llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp index 7d8da9b453f..46f8a356426 100644 --- a/llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp +++ b/llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp @@ -93,7 +93,9 @@ static bool handleSwitchExpect(SwitchInst &SI) { /// the branch probability info for the originating branch can be inferred. static void handlePhiDef(CallInst *Expect) { Value &Arg = *Expect->getArgOperand(0); - ConstantInt *ExpectedValue = cast<ConstantInt>(Expect->getArgOperand(1)); + ConstantInt *ExpectedValue = dyn_cast<ConstantInt>(Expect->getArgOperand(1)); + if (!ExpectedValue) + return; const APInt &ExpectedPhiValue = ExpectedValue->getValue(); // Walk up in backward a list of instructions that diff --git a/llvm/test/Transforms/LowerExpectIntrinsic/PR33346.ll b/llvm/test/Transforms/LowerExpectIntrinsic/PR33346.ll new file mode 100644 index 00000000000..ca962fbdc8f --- /dev/null +++ b/llvm/test/Transforms/LowerExpectIntrinsic/PR33346.ll @@ -0,0 +1,22 @@ +; RUN: opt -lower-expect -S < %s +; RUN: opt -passes='function(lower-expect)' -S < %s + +define i64 @foo(i64 %arg) #0 { +bb: + %tmp = alloca i64, align 8 + store i64 %arg, i64* %tmp, align 8 + %tmp1 = load i64, i64* %tmp, align 8 + %tmp2 = load i64, i64* %tmp, align 8 + %tmp3 = call i64 @llvm.expect.i64(i64 %tmp1, i64 %tmp2) + ret i64 %tmp3 +} + +; Function Attrs: nounwind readnone +declare i64 @llvm.expect.i64(i64, i64) + + +!llvm.module.flags = !{!0} +!llvm.ident = !{!1} + +!0 = !{i32 1, !"wchar_size", i32 4} +!1 = !{!"clang version 5.0.0 (trunk 304723)"} |

