From ba70a53103db1bfbcad3074eb24881919aa6b9fb Mon Sep 17 00:00:00 2001 From: Pedro Artigas Date: Fri, 30 Nov 2012 22:07:05 +0000 Subject: [PATCH] Addresses many style issues with prior checkin (r169025) llvm-svn: 169043 --- .../InstCombine/InstCombineMulDivRem.cpp | 102 ++++++++---------- 1 file changed, 44 insertions(+), 58 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index dc41e16469e..b0b9bac8f75 100644 --- a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -252,6 +252,42 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) { return Changed ? &I : 0; } +// +// Detect pattern: +// +// log2(Y*0.5) +// +// And check for corresponding fast math flags +// + +static void detectLog2OfHalf(Value *&Op, Value *&Y, IntrinsicInst *&Log2) { + if (Op->hasOneUse()) { + if (IntrinsicInst *II = dyn_cast(Op)) { + if (II->getIntrinsicID() == Intrinsic::log2 && + II->hasUnsafeAlgebra()) { + Log2 = II; + Value *OpLog2Of = II->getArgOperand(0); + if (OpLog2Of->hasOneUse()) { + if (Instruction *I = dyn_cast(OpLog2Of)) { + if (I->getOpcode() == Instruction::FMul && + I->hasUnsafeAlgebra()) { + ConstantFP *CFP = dyn_cast(I->getOperand(0)); + if (CFP && CFP->isExactlyValue(0.5)) { + Y = I->getOperand(1); + } else { + CFP = dyn_cast(I->getOperand(1)); + if (CFP && CFP->isExactlyValue(0.5)) { + Y = I->getOperand(0); + } + } + } + } + } + } + } + } +} + Instruction *InstCombiner::visitFMul(BinaryOperator &I) { bool Changed = SimplifyAssociativeOrCommutative(I); Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); @@ -290,70 +326,20 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) { Value *OpX = NULL; Value *OpY = NULL; IntrinsicInst *Log2; - if (Op0->hasOneUse()) { - if (IntrinsicInst *II = dyn_cast(Op0)) { - if (II->getIntrinsicID() == Intrinsic::log2 && - II->hasUnsafeAlgebra()) - { - Log2 = II; - Value *OpLog2Of = II->getArgOperand(0); - if (OpLog2Of->hasOneUse()) { - if (Instruction *I = dyn_cast(OpLog2Of)) { - if (I->getOpcode() == Instruction::FMul && - I->hasUnsafeAlgebra()) - { - ConstantFP *CFP = dyn_cast(I->getOperand(0)); - if (CFP && CFP->isExactlyValue(0.5)) { - OpY = I->getOperand(1); - OpX = Op1; - } else { - CFP = dyn_cast(I->getOperand(1)); - if (CFP && CFP->isExactlyValue(0.5)) { - OpY = I->getOperand(0); - OpX = Op1; - } - } - } - } - } - } - } - } - if (Op1->hasOneUse()) { - if (IntrinsicInst *II = dyn_cast(Op1)) { - if (II->getIntrinsicID() == Intrinsic::log2 && - II->hasUnsafeAlgebra()) - { - Log2 = II; - Value *OpLog2Of = II->getArgOperand(0); - if (OpLog2Of->hasOneUse()) { - if (Instruction *I = dyn_cast(OpLog2Of)) { - if (I->getOpcode() == Instruction::FMul && - I->hasUnsafeAlgebra()) - { - ConstantFP *CFP = dyn_cast(I->getOperand(0)); - if (CFP && CFP->isExactlyValue(0.5)) { - OpY = I->getOperand(1); - OpX = Op0; - } else { - CFP = dyn_cast(I->getOperand(1)); - if (CFP && CFP->isExactlyValue(0.5)) { - OpY = I->getOperand(0); - OpX = Op0; - } - } - } - } - } - } + detectLog2OfHalf(Op0, OpY, Log2); + if (OpY) { + OpX = Op1; + } else { + detectLog2OfHalf(Op1, OpY, Log2); + if (OpY) { + OpX = Op0; } } // if pattern detected emit alternate sequence if (OpX && OpY) { Log2->setArgOperand(0, OpY); Value *FMulVal = Builder->CreateFMul(OpX, Log2); - Instruction *FMul = dyn_cast(FMulVal); - assert(FMul && "Must be instruction as Log2 is instruction"); + Instruction *FMul = cast(FMulVal); FMul->copyFastMathFlags(Log2); Instruction *FSub = BinaryOperator::CreateFSub(FMulVal, OpX); FSub->copyFastMathFlags(Log2);