mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 22:17:47 +00:00
InstCombine: call FoldOpIntoSelect for all floating binops, not just fmul
llvm-svn: 186759
This commit is contained in:
parent
47a9a42835
commit
5a583ae2f7
@ -1186,10 +1186,16 @@ Instruction *InstCombiner::visitFAdd(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyFAddInst(LHS, RHS, I.getFastMathFlags(), TD))
|
||||
return ReplaceInstUsesWith(I, V);
|
||||
|
||||
if (isa<Constant>(RHS) && isa<PHINode>(LHS))
|
||||
if (isa<Constant>(RHS)) {
|
||||
if (isa<PHINode>(LHS))
|
||||
if (Instruction *NV = FoldOpIntoPhi(I))
|
||||
return NV;
|
||||
|
||||
if (SelectInst *SI = dyn_cast<SelectInst>(LHS))
|
||||
if (Instruction *NV = FoldOpIntoSelect(I, SI))
|
||||
return NV;
|
||||
}
|
||||
|
||||
// -A + B --> B - A
|
||||
// -A + -B --> -(A + B)
|
||||
if (Value *LHSV = dyn_castFNegVal(LHS))
|
||||
@ -1517,6 +1523,11 @@ Instruction *InstCombiner::visitFSub(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyFSubInst(Op0, Op1, I.getFastMathFlags(), TD))
|
||||
return ReplaceInstUsesWith(I, V);
|
||||
|
||||
if (isa<Constant>(Op0))
|
||||
if (SelectInst *SI = dyn_cast<SelectInst>(Op1))
|
||||
if (Instruction *NV = FoldOpIntoSelect(I, SI))
|
||||
return NV;
|
||||
|
||||
// If this is a 'B = x-(-A)', change to B = x+A...
|
||||
if (Value *V = dyn_castFNegVal(Op1))
|
||||
return BinaryOperator::CreateFAdd(Op0, V);
|
||||
|
@ -990,10 +990,19 @@ Instruction *InstCombiner::visitFDiv(BinaryOperator &I) {
|
||||
if (Value *V = SimplifyFDivInst(Op0, Op1, TD))
|
||||
return ReplaceInstUsesWith(I, V);
|
||||
|
||||
if (isa<Constant>(Op0))
|
||||
if (SelectInst *SI = dyn_cast<SelectInst>(Op1))
|
||||
if (Instruction *R = FoldOpIntoSelect(I, SI))
|
||||
return R;
|
||||
|
||||
bool AllowReassociate = I.hasUnsafeAlgebra();
|
||||
bool AllowReciprocal = I.hasAllowReciprocal();
|
||||
|
||||
if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) {
|
||||
if (SelectInst *SI = dyn_cast<SelectInst>(Op0))
|
||||
if (Instruction *R = FoldOpIntoSelect(I, SI))
|
||||
return R;
|
||||
|
||||
if (AllowReassociate) {
|
||||
ConstantFP *C1 = 0;
|
||||
ConstantFP *C2 = Op1C;
|
||||
|
71
test/Transforms/InstCombine/fold-fops-into-selects.ll
Normal file
71
test/Transforms/InstCombine/fold-fops-into-selects.ll
Normal file
@ -0,0 +1,71 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
define float @test1(i1 %A) {
|
||||
EntryBlock:
|
||||
%cf = select i1 %A, float 1.000000e+00, float 0.000000e+00
|
||||
%op = fsub float 1.000000e+00, %cf
|
||||
ret float %op
|
||||
; CHECK-LABEL: @test1(
|
||||
; CHECK: select i1 %A, float 0.000000e+00, float 1.000000e+00
|
||||
}
|
||||
|
||||
define float @test2(i1 %A, float %B) {
|
||||
EntryBlock:
|
||||
%cf = select i1 %A, float 1.000000e+00, float %B
|
||||
%op = fadd float 2.000000e+00, %cf
|
||||
ret float %op
|
||||
; CHECK-LABEL: @test2(
|
||||
; CHECK: [[OP:%.*]] = fadd float %B, 2.000000e+00
|
||||
; CHECK: select i1 %A, float 3.000000e+00, float [[OP]]
|
||||
}
|
||||
|
||||
define float @test3(i1 %A, float %B) {
|
||||
EntryBlock:
|
||||
%cf = select i1 %A, float 1.000000e+00, float %B
|
||||
%op = fsub float 2.000000e+00, %cf
|
||||
ret float %op
|
||||
; CHECK-LABEL: @test3(
|
||||
; CHECK: [[OP:%.*]] = fsub float 2.000000e+00, %B
|
||||
; CHECK: select i1 %A, float 1.000000e+00, float [[OP]]
|
||||
}
|
||||
|
||||
define float @test4(i1 %A, float %B) {
|
||||
EntryBlock:
|
||||
%cf = select i1 %A, float 1.000000e+00, float %B
|
||||
%op = fmul float 2.000000e+00, %cf
|
||||
ret float %op
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK: [[OP:%.*]] = fmul float %B, 2.000000e+00
|
||||
; CHECK: select i1 %A, float 2.000000e+00, float [[OP]]
|
||||
}
|
||||
|
||||
define float @test5(i1 %A, float %B) {
|
||||
EntryBlock:
|
||||
%cf = select i1 %A, float 1.000000e+00, float %B
|
||||
%op = fdiv float 2.000000e+00, %cf
|
||||
ret float %op
|
||||
; CHECK-LABEL: @test5(
|
||||
; CHECK: [[OP:%.*]] = fdiv float 2.000000e+00, %B
|
||||
; CHECK: select i1 %A, float 2.000000e+00, float [[OP]]
|
||||
}
|
||||
|
||||
define float @test6(i1 %A, float %B) {
|
||||
EntryBlock:
|
||||
%cf = select i1 %A, float 1.000000e+00, float %B
|
||||
%op = fdiv float %cf, 2.000000e+00
|
||||
ret float %op
|
||||
; CHECK-LABEL: @test6(
|
||||
; CHECK: [[OP:%.*]] = fmul float %B, 5.000000e-01
|
||||
; CHECK: select i1 %A, float 5.000000e-01, float [[OP]]
|
||||
}
|
||||
|
||||
define float @test7(i1 %A, float %B) {
|
||||
EntryBlock:
|
||||
%cf = select i1 %A, float 1.000000e+00, float %B
|
||||
%op = fdiv float %cf, 3.000000e+00
|
||||
ret float %op
|
||||
; CHECK-LABEL: @test7(
|
||||
; CHECK: [[OP:%.*]] = fdiv float %B, 3.000000e+00
|
||||
; CHECK: select i1 %A, float 0x3FD5555560000000, float [[OP]]
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user