[llvm] r208434 - Add ExtractValue instruction to SimplifyCFG's ComputeSpeculationCost

Louis Gerbarg lgg at apple.com
Fri May 9 10:02:46 PDT 2014


Author: louis
Date: Fri May  9 12:02:46 2014
New Revision: 208434

URL: http://llvm.org/viewvc/llvm-project?rev=208434&view=rev
Log:
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

Added:
    llvm/trunk/test/Transforms/SimplifyCFG/extract-cost.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=208434&r1=208433&r2=208434&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Fri May  9 12:02:46 2014
@@ -213,6 +213,7 @@ static unsigned ComputeSpeculationCost(c
     if (!cast<GEPOperator>(I)->hasAllConstantIndices())
       return UINT_MAX;
     return 1;
+  case Instruction::ExtractValue:
   case Instruction::Load:
   case Instruction::Add:
   case Instruction::Sub:

Added: llvm/trunk/test/Transforms/SimplifyCFG/extract-cost.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/extract-cost.ll?rev=208434&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/extract-cost.ll (added)
+++ llvm/trunk/test/Transforms/SimplifyCFG/extract-cost.ll Fri May  9 12:02:46 2014
@@ -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
+}





More information about the llvm-commits mailing list