[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sun Feb 15 19:21:14 PST 2004
Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.152 -> 1.153
---
Log message:
Implement Transforms/InstCombine/xor.ll:test19
---
Diffs of the changes: (+13 -2)
Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.152 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.153
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.152 Sat Feb 14 23:55:10 2004
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Sun Feb 15 19:20:27 2004
@@ -1002,15 +1002,26 @@
return Changed ? &I : 0;
}
+// XorSelf - Implements: X ^ X --> 0
+struct XorSelf {
+ Value *RHS;
+ XorSelf(Value *rhs) : RHS(rhs) {}
+ bool shouldApply(Value *LHS) const { return LHS == RHS; }
+ Instruction *apply(BinaryOperator &Xor) const {
+ return &Xor;
+ }
+};
Instruction *InstCombiner::visitXor(BinaryOperator &I) {
bool Changed = SimplifyCommutative(I);
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
- // xor X, X = 0
- if (Op0 == Op1)
+ // xor X, X = 0, even if X is nested in a sequence of Xor's.
+ if (Instruction *Result = AssociativeOpt(I, XorSelf(Op1))) {
+ assert(Result == &I && "AssociativeOpt didn't work?");
return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
+ }
if (ConstantIntegral *RHS = dyn_cast<ConstantIntegral>(Op1)) {
// xor X, 0 == X
More information about the llvm-commits
mailing list