[llvm-commits] SETCC InstructionCombining.cpp [#1/n]

Reid Spencer rspencer at reidspencer.com
Fri Dec 22 14:57:56 PST 2006


Just confirming .. all changes incorporated.

Reid.

On Wed, 2006-12-20 at 18:22 -0800, Chris Lattner wrote:
> On Dec 17, 2006, at 3:35 PM, Reid Spencer wrote:
> 
> > Chris,
> >
> > Attached is the patch to InstructionCombining.cpp for SETCC conversion
> > to ICmpInst. This passes all tests.
> >
> > All your previous feedback has been incorporated and confirmed. The  
> > test
> > just completed includes all those changes as well.
> >
> > I'm looking forward to finally committing the SETCC patch so we can
> > finish it off and then start removing unnecessary casts and  
> > unifying the
> > integer types.
> 
> +// SimplifyCompare - For a CmpInst this function just orders the  
> operands
> +// so that theyare listed from right (least complex) to left (most  
> complex).
> +// This puts constants before unary operators before binary operators.
> +//
> +bool InstCombiner::SimplifyCompare(CmpInst &I) {
> 
> Please doxygenify the comment.
> 
> +  bool Changed = false;
> +  if (getComplexity(I.getOperand(0)) < getComplexity(I.getOperand 
> (1))) {
> +    I.swapOperands();
> +    Changed = true;
> +  }
> +  // Compare instructions are not associative so there's nothing  
> else we can do.
> +  return Changed;
> +}
> 
> Why not:
> 
>    if (getComplexity(I.getOperand(0)) >= getComplexity(I.getOperand(1)))
>      return false;
>    I.swapOperands();
>    return true;
> 
> ?
> 
> 
> 
>   // isTrueWhenEqual - Return true if the specified setcondinst  
> instruction is
>   // true when both operands are equal...
>   //
>   static bool isTrueWhenEqual(Instruction &I) {
> +  if (ICmpInst *ICI = dyn_cast<ICmpInst>(&I))
> +    return ICI->getPredicate() == ICmpInst::ICMP_EQ  ||
> +           ICI->getPredicate() == ICmpInst::ICMP_UGE ||
> +           ICI->getPredicate() == ICmpInst::ICMP_SGE ||
> +           ICI->getPredicate() == ICmpInst::ICMP_ULE ||
> +           ICI->getPredicate() == ICmpInst::ICMP_SLE;
>     return I.getOpcode() == Instruction::SetEQ ||
>            I.getOpcode() == Instruction::SetGE ||
>            I.getOpcode() == Instruction::SetLE;
>   }
> 
> This should be split into two functions, one for ICmpInst and one for  
> FCmpInst/SetCondInst.  Since your touching it, plz doxygenify also. :)
> 
> 
> 
> @@ -1580,21 +1607,31 @@ static Value *FoldOperationIntoSelectOpe
>     // Figure out if the constant is the left or the right argument.
>     bool ConstIsRHS = isa<Constant>(I.getOperand(1));
>     Constant *ConstOperand = cast<Constant>(I.getOperand(ConstIsRHS));
> 
>     if (Constant *SOC = dyn_cast<Constant>(SO)) {
> -    if (ConstIsRHS)
> -      return ConstantExpr::get(I.getOpcode(), SOC, ConstOperand);
> -    return ConstantExpr::get(I.getOpcode(), ConstOperand, SOC);
> +    if (CmpInst *CI = dyn_cast<CmpInst>(&I)) {
> +      unsigned short pred = CI->getPredicate();
> +      if (ConstIsRHS)
> +        return ConstantExpr::getCompare(pred, SOC, ConstOperand);
> +      return ConstantExpr::getCompare(pred, ConstOperand, SOC);
> 
> This code doesn't appear to be called for compares.  Is it?  If so,  
> the code is broken, you can't just swap the LHS/RHS of a compare like  
> that without breaking things.
> 
> 
> +/// isSignBitCheck - Given an exploded icmp instruction, return true  
> if it
>   /// really just returns true if the most significant (sign) bit is  
> set.
> +static bool isSignBitCheck(ICmpInst::Predicate pred, Value *LHS,
> +                           ConstantInt *RHS) {
> 
> There is no reason to pass LHS into this function (this is an  
> absolute statement, not a bug in your patch) please remove LHS.
> 
> 
> +    case ICmpInst::ICMP_UGE:
> +      // True if LHS u>= RHS and RHS == high-bit-mask (2^7, 2^15,  
> 2^31, etc)
> +      return RHS->getZExtValue() == 1ULL <<
> +        RHS->getType()->getPrimitiveSizeInBits()-1;
> 
> Please add parens to make the precedence more explicit, even though  
> it is right.
> 
> 
> More tomorrow,
> 
> -Chris
> 
> 




More information about the llvm-commits mailing list