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
This commit is contained in:
Louis Gerbarg 2014-05-09 17:02:46 +00:00
parent 3f26d366a4
commit c0adfbb49d
2 changed files with 23 additions and 0 deletions

View File

@ -213,6 +213,7 @@ static unsigned ComputeSpeculationCost(const User *I) {
if (!cast<GEPOperator>(I)->hasAllConstantIndices())
return UINT_MAX;
return 1;
case Instruction::ExtractValue:
case Instruction::Load:
case Instruction::Add:
case Instruction::Sub:

View File

@ -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
}