[llvm-commits] [llvm] r169043 - /llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp

Sean Silva silvas at purdue.edu
Fri Nov 30 15:40:45 PST 2012


+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}

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