[llvm-commits] [llvm] r169043 - /llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
Pedro Artigas
partigas at apple.com
Fri Nov 30 15:55:02 PST 2012
Just a clarification, this has been addressed already, check TOT.
Thanks
Pedro
On Nov 30, 2012, at 3:40 PM, Sean Silva <silvas at purdue.edu> wrote:
> + }
> + }
> + }
> + }
> + }
> + }
> + }
> + }
> +}
>
> This may be a record in the LLVM codebase. Please follow echristo's
> advice and use early returns to reduce this. See
> <http://llvm.org/docs/CodingStandards.html#use-early-exits-and-continue-to-simplify-code>
>
> -- Sean Silva
>
> On Fri, Nov 30, 2012 at 5:07 PM, Pedro Artigas <partigas at apple.com> wrote:
>> Author: partigas
>> Date: Fri Nov 30 16:07:05 2012
>> New Revision: 169043
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=169043&view=rev
>> Log:
>> Addresses many style issues with prior checkin (r169025)
>>
>>
>> Modified:
>> llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
>>
>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=169043&r1=169042&r2=169043&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)
>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Fri Nov 30 16:07:05 2012
>> @@ -252,6 +252,42 @@
>> 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<IntrinsicInst>(Op)) {
>> + if (II->getIntrinsicID() == Intrinsic::log2 &&
>> + II->hasUnsafeAlgebra()) {
>> + Log2 = II;
>> + Value *OpLog2Of = II->getArgOperand(0);
>> + if (OpLog2Of->hasOneUse()) {
>> + if (Instruction *I = dyn_cast<Instruction>(OpLog2Of)) {
>> + if (I->getOpcode() == Instruction::FMul &&
>> + I->hasUnsafeAlgebra()) {
>> + ConstantFP *CFP = dyn_cast<ConstantFP>(I->getOperand(0));
>> + if (CFP && CFP->isExactlyValue(0.5)) {
>> + Y = I->getOperand(1);
>> + } else {
>> + CFP = dyn_cast<ConstantFP>(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 @@
>> Value *OpX = NULL;
>> Value *OpY = NULL;
>> IntrinsicInst *Log2;
>> - if (Op0->hasOneUse()) {
>> - if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op0)) {
>> - if (II->getIntrinsicID() == Intrinsic::log2 &&
>> - II->hasUnsafeAlgebra())
>> - {
>> - Log2 = II;
>> - Value *OpLog2Of = II->getArgOperand(0);
>> - if (OpLog2Of->hasOneUse()) {
>> - if (Instruction *I = dyn_cast<Instruction>(OpLog2Of)) {
>> - if (I->getOpcode() == Instruction::FMul &&
>> - I->hasUnsafeAlgebra())
>> - {
>> - ConstantFP *CFP = dyn_cast<ConstantFP>(I->getOperand(0));
>> - if (CFP && CFP->isExactlyValue(0.5)) {
>> - OpY = I->getOperand(1);
>> - OpX = Op1;
>> - } else {
>> - CFP = dyn_cast<ConstantFP>(I->getOperand(1));
>> - if (CFP && CFP->isExactlyValue(0.5)) {
>> - OpY = I->getOperand(0);
>> - OpX = Op1;
>> - }
>> - }
>> - }
>> - }
>> - }
>> - }
>> - }
>> - }
>> - if (Op1->hasOneUse()) {
>> - if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op1)) {
>> - if (II->getIntrinsicID() == Intrinsic::log2 &&
>> - II->hasUnsafeAlgebra())
>> - {
>> - Log2 = II;
>> - Value *OpLog2Of = II->getArgOperand(0);
>> - if (OpLog2Of->hasOneUse()) {
>> - if (Instruction *I = dyn_cast<Instruction>(OpLog2Of)) {
>> - if (I->getOpcode() == Instruction::FMul &&
>> - I->hasUnsafeAlgebra())
>> - {
>> - ConstantFP *CFP = dyn_cast<ConstantFP>(I->getOperand(0));
>> - if (CFP && CFP->isExactlyValue(0.5)) {
>> - OpY = I->getOperand(1);
>> - OpX = Op0;
>> - } else {
>> - CFP = dyn_cast<ConstantFP>(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<Instruction>(FMulVal);
>> - assert(FMul && "Must be instruction as Log2 is instruction");
>> + Instruction *FMul = cast<Instruction>(FMulVal);
>> FMul->copyFastMathFlags(Log2);
>> Instruction *FSub = BinaryOperator::CreateFSub(FMulVal, OpX);
>> FSub->copyFastMathFlags(Log2);
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list