[llvm-commits] SHR Patch (For Review)

Chris Lattner clattner at apple.com
Tue Nov 7 19:58:53 PST 2006


On Nov 7, 2006, at 5:33 PM, Reid Spencer wrote:

> Attached is the 3rd attempt to get the SHR patch right. This one  
> passes
> all the tests and eliminates many more casts than previous versions.
>
> NOTE: Please don't commit this!
>
> Reid.

Overall, the patch looks excellent.  There is some minor  
typographical cruft like "return  new ShiftInst" in various places.   
Please grep for that (turning two spaces before new into one).



In this hunk:

@@ -5250,12 +5230,16 @@ Instruction *InstCombiner::FoldShiftByCo
          Amt = Op0->getType()->getPrimitiveSizeInBits();

        Value *Op = ShiftOp->getOperand(0);
        if (isShiftOfSignedShift != isSignedShift)
          Op = InsertNewInstBefore(new CastInst(Op, I.getType(),  
"tmp"), I);
-      return new ShiftInst(I.getOpcode(), Op,
+      ShiftInst* ShiftResult = new ShiftInst(I.getOpcode(), Op,
                             ConstantInt::get(Type::UByteTy, Amt));
+      if (I.getType() == ShiftResult->getType())
+        return ShiftResult;
+      InsertNewInstBefore(ShiftResult, I);
+      return new CastInst(ShiftResult, I.getType());
      }

Why do you need the two casts?  If you don't, please remove them.




In this hunk:
@@ -5790,33 +5768,28 @@ Instruction *InstCombiner::visitCastInst
...
-            // Insert the new shift, which is now unsigned.
-            N1 = InsertNewInstBefore(new ShiftInst(Instruction::Shr,  
N1,
-                                                   Op1, Src->getName 
()), CI);
-            return new CastInst(N1, CI.getType());
+            // Insert the new logical shift right.
+            return new ShiftInst(Instruction::LShr, Op0, Op1, Src- 
 >getName());

You shouldn't pass Src->getName() to the instruction ctor.




RCS file: /var/cvs/llvm/llvm/lib/VMCore/Instructions.cpp,v
retrieving revision 1.45
diff -t -d -u -p -5 -r1.45 Instructions.cpp
--- lib/VMCore/Instructions.cpp	2 Nov 2006 01:53:58 -0000	1.45
+++ lib/VMCore/Instructions.cpp	8 Nov 2006 00:31:58 -0000
@@ -1228,11 +1228,11 @@ bool BinaryOperator::swapOperands() {
  // 
===--------------------------------------------------------------------- 
-===//

  /// isLogicalShift - Return true if this is a logical shift left or  
a logical
  /// shift right.
  bool ShiftInst::isLogicalShift() const {
-  return getOpcode() == Instruction::Shl || getType()->isUnsigned();
+  return getOpcode() == Instruction::Shl || getOpcode() ==  
Instruction::LShr;
  }

isLogicalShift can now be an inline method in the header for  
ShiftInst, now that it isn't touching getType().  Please move it to  
the header.




After making the changes above and retesting, please commit this!   
After this goes in, please remember to do the next patch which turns  
ConstantExpr::getUShr -> ConstantExpr::getLShr etc.  Thanks guys,

-Chris




More information about the llvm-commits mailing list