forked from OSchip/llvm-project
[InstCombine] limit X - (cast(-Y) --> X + cast(Y) with hasOneUse()
llvm-svn: 329821
This commit is contained in:
parent
0195469a23
commit
ff98682c9c
|
@ -1731,16 +1731,16 @@ Instruction *InstCombiner::visitFSub(BinaryOperator &I) {
|
|||
if (match(Op1, m_FNeg(m_Value(Y))))
|
||||
return BinaryOperator::CreateFAddFMF(Op0, Y, &I);
|
||||
|
||||
if (FPTruncInst *FPTI = dyn_cast<FPTruncInst>(Op1)) {
|
||||
if (Value *V = dyn_castFNegVal(FPTI->getOperand(0))) {
|
||||
Value *NewTrunc = Builder.CreateFPTrunc(V, I.getType());
|
||||
return BinaryOperator::CreateFAddFMF(Op0, NewTrunc, &I);
|
||||
}
|
||||
} else if (FPExtInst *FPEI = dyn_cast<FPExtInst>(Op1)) {
|
||||
if (Value *V = dyn_castFNegVal(FPEI->getOperand(0))) {
|
||||
Value *NewExt = Builder.CreateFPExt(V, I.getType());
|
||||
return BinaryOperator::CreateFAddFMF(Op0, NewExt, &I);
|
||||
}
|
||||
// Similar to above, but look through a cast of the negated value:
|
||||
// X - (fptrunc(-Y)) --> X + fptrunc(Y)
|
||||
if (match(Op1, m_OneUse(m_FPTrunc(m_FNeg(m_Value(Y)))))) {
|
||||
Value *TruncY = Builder.CreateFPTrunc(Y, I.getType());
|
||||
return BinaryOperator::CreateFAddFMF(Op0, TruncY, &I);
|
||||
}
|
||||
// X - (fpext(-Y)) --> X + fpext(Y)
|
||||
if (match(Op1, m_OneUse(m_FPExt(m_FNeg(m_Value(Y)))))) {
|
||||
Value *ExtY = Builder.CreateFPExt(Y, I.getType());
|
||||
return BinaryOperator::CreateFAddFMF(Op0, ExtY, &I);
|
||||
}
|
||||
|
||||
// Handle specials cases for FSub with selects feeding the operation
|
||||
|
|
|
@ -189,14 +189,13 @@ define double @neg_ext_op1_fast(float %a, double %b) {
|
|||
ret double %t3
|
||||
}
|
||||
|
||||
; FIXME: Extra use should prevent the transform.
|
||||
; Extra use should prevent the transform.
|
||||
|
||||
define float @neg_ext_op1_extra_use(half %a, float %b) {
|
||||
; CHECK-LABEL: @neg_ext_op1_extra_use(
|
||||
; CHECK-NEXT: [[T1:%.*]] = fsub half 0xH8000, [[A:%.*]]
|
||||
; CHECK-NEXT: [[T2:%.*]] = fpext half [[T1]] to float
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = fpext half [[A]] to float
|
||||
; CHECK-NEXT: [[T3:%.*]] = fadd float [[TMP1]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[T3:%.*]] = fsub float [[B:%.*]], [[T2]]
|
||||
; CHECK-NEXT: call void @use(float [[T2]])
|
||||
; CHECK-NEXT: ret float [[T3]]
|
||||
;
|
||||
|
@ -226,15 +225,13 @@ define float @neg_trunc_op1_extra_use(double %a, float %b) {
|
|||
ret float %t3
|
||||
}
|
||||
|
||||
; FIXME: But the bug is visible when both preceding values have other uses.
|
||||
; Extra uses should prevent the transform.
|
||||
|
||||
define float @neg_trunc_op1_extra_uses(double %a, float %b) {
|
||||
; CHECK-LABEL: @neg_trunc_op1_extra_uses(
|
||||
; CHECK-NEXT: [[T1:%.*]] = fsub double -0.000000e+00, [[A:%.*]]
|
||||
; CHECK-NEXT: [[T2:%.*]] = fptrunc double [[T1]] to float
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = fptrunc double [[A]] to float
|
||||
; CHECK-NEXT: [[T3:%.*]] = fadd float [[TMP1]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[T3:%.*]] = fsub float [[B:%.*]], [[T2]]
|
||||
; CHECK-NEXT: call void @use2(float [[T2]], double [[T1]])
|
||||
; CHECK-NEXT: ret float [[T3]]
|
||||
;
|
||||
|
|
Loading…
Reference in New Issue