[llvm-commits] SETCC InstructionCombining.cpp [#1/n]
Chris Lattner
clattner at apple.com
Wed Dec 20 18:22:44 PST 2006
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