[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