mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
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 llvm-svn: 208434
This commit is contained in:
parent
1a986ede50
commit
011e17086c
@ -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:
|
||||
|
22
test/Transforms/SimplifyCFG/extract-cost.ll
Normal file
22
test/Transforms/SimplifyCFG/extract-cost.ll
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user