From: Xinliang David Li Date: Wed, 7 Jun 2017 18:32:24 +0000 (+0000) Subject: Fix builin_expect lowering bug X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7ce64309f9937817bcfbdf23e7a0d782d1645bc9;p=llvm Fix builin_expect lowering bug PR33346 Skip cases when expected value is not constant int. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304933 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp b/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp index 7d8da9b453f..46f8a356426 100644 --- a/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp +++ b/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(Expect->getArgOperand(1)); + ConstantInt *ExpectedValue = dyn_cast(Expect->getArgOperand(1)); + if (!ExpectedValue) + return; const APInt &ExpectedPhiValue = ExpectedValue->getValue(); // Walk up in backward a list of instructions that diff --git a/test/Transforms/LowerExpectIntrinsic/PR33346.ll b/test/Transforms/LowerExpectIntrinsic/PR33346.ll new file mode 100644 index 00000000000..ca962fbdc8f --- /dev/null +++ b/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)"}