[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
Chris Lattner
lattner at cs.uiuc.edu
Fri Mar 12 18:13:01 PST 2004
Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.170 -> 1.171
---
Log message:
Implement sub.ll:test14
---
Diffs of the changes: (+29 -8)
Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.170 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.171
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.170 Fri Mar 12 17:53:13 2004
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Fri Mar 12 18:11:49 2004
@@ -549,6 +549,21 @@
return Ty == Type::BoolTy ? 1 : Ty->getPrimitiveSize()*8;
}
+/// RemoveNoopCast - Strip off nonconverting casts from the value.
+///
+static Value *RemoveNoopCast(Value *V) {
+ if (CastInst *CI = dyn_cast<CastInst>(V)) {
+ const Type *CTy = CI->getType();
+ const Type *OpTy = CI->getOperand(0)->getType();
+ if (CTy->isInteger() && OpTy->isInteger()) {
+ if (CTy->getPrimitiveSize() == OpTy->getPrimitiveSize())
+ return RemoveNoopCast(CI->getOperand(0));
+ } else if (isa<PointerType>(CTy) && isa<PointerType>(OpTy))
+ return RemoveNoopCast(CI->getOperand(0));
+ }
+ return V;
+}
+
Instruction *InstCombiner::visitSub(BinaryOperator &I) {
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
@@ -572,17 +587,18 @@
ConstantInt::get(I.getType(), 1)));
// -((uint)X >> 31) -> ((int)X >> 31)
// -((int)X >> 31) -> ((uint)X >> 31)
- if (C->isNullValue())
- if (ShiftInst *SI = dyn_cast<ShiftInst>(Op1))
+ if (C->isNullValue()) {
+ Value *NoopCastedRHS = RemoveNoopCast(Op1);
+ if (ShiftInst *SI = dyn_cast<ShiftInst>(NoopCastedRHS))
if (SI->getOpcode() == Instruction::Shr)
if (ConstantUInt *CU = dyn_cast<ConstantUInt>(SI->getOperand(1))) {
const Type *NewTy;
- if (C->getType()->isSigned())
- NewTy = getUnsignedIntegralType(C->getType());
+ if (SI->getType()->isSigned())
+ NewTy = getUnsignedIntegralType(SI->getType());
else
- NewTy = getSignedIntegralType(C->getType());
+ NewTy = getSignedIntegralType(SI->getType());
// Check to see if we are shifting out everything but the sign bit.
- if (CU->getValue() == C->getType()->getPrimitiveSize()*8-1) {
+ if (CU->getValue() == SI->getType()->getPrimitiveSize()*8-1) {
// Ok, the transformation is safe. Insert a cast of the incoming
// value, then the new shift, then the new cast.
Instruction *FirstCast = new CastInst(SI->getOperand(0), NewTy,
@@ -590,10 +606,15 @@
Value *InV = InsertNewInstBefore(FirstCast, I);
Instruction *NewShift = new ShiftInst(Instruction::Shr, FirstCast,
CU, SI->getName());
- InV = InsertNewInstBefore(NewShift, I);
- return new CastInst(NewShift, I.getType());
+ if (NewShift->getType() == I.getType())
+ return NewShift;
+ else {
+ InV = InsertNewInstBefore(NewShift, I);
+ return new CastInst(NewShift, I.getType());
+ }
}
}
+ }
}
if (BinaryOperator *Op1I = dyn_cast<BinaryOperator>(Op1))
More information about the llvm-commits
mailing list