From c0adfbb49d674dc04f39536151f05cc6a5e9e5fb Mon Sep 17 00:00:00 2001 From: Louis Gerbarg Date: Fri, 9 May 2014 17:02:46 +0000 Subject: Add ExtractValue instruction to SimplifyCFG's ComputeSpeculationCost Since ExtractValue is not included in ComputeSpeculationCost CFGs containing ExtractValueInsts cannot be simplified. In particular this interacts with InstCombineCompare's tendency to insert add.with.overflow intrinsics for certain idiomatic math operations, preventing optimization. This patch adds ExtractValue to the ComputeSpeculationCost. Test case included rdar://14853450 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208434 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 1 + test/Transforms/SimplifyCFG/extract-cost.ll | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 test/Transforms/SimplifyCFG/extract-cost.ll diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index cb747f6f51..bfc7f4ace7 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -213,6 +213,7 @@ static unsigned ComputeSpeculationCost(const User *I) { if (!cast(I)->hasAllConstantIndices()) return UINT_MAX; return 1; + case Instruction::ExtractValue: case Instruction::Load: case Instruction::Add: case Instruction::Sub: diff --git a/test/Transforms/SimplifyCFG/extract-cost.ll b/test/Transforms/SimplifyCFG/extract-cost.ll new file mode 100644 index 0000000000..9c867256e7 --- /dev/null +++ b/test/Transforms/SimplifyCFG/extract-cost.ll @@ -0,0 +1,22 @@ +; RUN: opt -simplifycfg -S < %s | FileCheck %s + +declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) #1 + +define i32 @f(i32 %a, i32 %b) #0 { +entry: + %uadd = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a, i32 %b) + %cmp = extractvalue { i32, i1 } %uadd, 1 + br i1 %cmp, label %return, label %if.end + +if.end: ; preds = %entry + %0 = extractvalue { i32, i1 } %uadd, 0 + br label %return + +return: ; preds = %entry, %if.end + %retval.0 = phi i32 [ %0, %if.end ], [ 0, %entry ] + ret i32 %retval.0 + +; CHECK-LABEL: @f( +; CHECK-NOT: phi +; CHECK: select +} -- cgit v1.2.3