InstCombine: Make the (fmul X, -1.0) -> (fsub -0.0, X) transform handle vectors too.

PR18532.

llvm-svn: 199553
This commit is contained in:
Benjamin Kramer 2014-01-18 16:43:14 +00:00
parent 5d2ff221f6
commit fea9ac99b0
2 changed files with 13 additions and 6 deletions

View File

@ -425,17 +425,15 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) {
if (Instruction *NV = FoldOpIntoPhi(I))
return NV;
ConstantFP *C = dyn_cast<ConstantFP>(Op1);
// (fmul X, -1.0) --> (fsub -0.0, X)
if (C && C->isExactlyValue(-1.0)) {
Instruction *RI = BinaryOperator::CreateFSub(
ConstantFP::getNegativeZero(C->getType()),
Op0);
if (match(Op1, m_SpecificFP(-1.0))) {
Constant *NegZero = ConstantFP::getNegativeZero(Op1->getType());
Instruction *RI = BinaryOperator::CreateFSub(NegZero, Op0);
RI->copyFastMathFlags(&I);
return RI;
}
ConstantFP *C = dyn_cast<ConstantFP>(Op1);
if (C && AllowReassociate && C->getValueAPF().isFiniteNonZero()) {
// Let MDC denote an expression in one of these forms:
// X * C, C/X, X/C, where C is a constant.

View File

@ -104,3 +104,12 @@ define float @test9(float %x) {
; CHECK: fsub
}
; PR18532
define <4 x float> @test10(<4 x float> %x) {
%mul = fmul <4 x float> %x, <float -1.0, float -1.0, float -1.0, float -1.0>
ret <4 x float> %mul
; CHECK-LABEL: @test10(
; CHECK-NOT: fmul
; CHECK: fsub
}