[llvm-commits] [llvm] r72010 - in /llvm/trunk: lib/Analysis/ScalarEvolution.cpp test/Analysis/ScalarEvolution/and-xor.ll
Dan Gohman
gohman at apple.com
Mon May 18 09:29:05 PDT 2009
Author: djg
Date: Mon May 18 11:29:04 2009
New Revision: 72010
URL: http://llvm.org/viewvc/llvm-project?rev=72010&view=rev
Log:
Teach ScalarEvolution to recognize x^-1 in the case where non-demanded
bits have been stripped out by instcombine.
Added:
llvm/trunk/test/Analysis/ScalarEvolution/and-xor.ll
Modified:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=72010&r1=72009&r2=72010&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Mon May 18 11:29:04 2009
@@ -2203,6 +2203,19 @@
// If the RHS of xor is -1, then this is a not operation.
if (CI->isAllOnesValue())
return getNotSCEV(getSCEV(U->getOperand(0)));
+
+ // Model xor(and(x, C), C) as and(~x, C), if C is a low-bits mask.
+ // This is a variant of the check for xor with -1, and it handles
+ // the case where instcombine has trimmed non-demanded bits out
+ // of an xor with -1.
+ if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U->getOperand(0)))
+ if (ConstantInt *LCI = dyn_cast<ConstantInt>(BO->getOperand(1)))
+ if (BO->getOpcode() == Instruction::And &&
+ LCI->getValue() == CI->getValue())
+ if (const SCEVZeroExtendExpr *Z =
+ dyn_cast<SCEVZeroExtendExpr>(getSCEV(U->getOperand(0))))
+ return getZeroExtendExpr(getNotSCEV(Z->getOperand()),
+ U->getType());
}
break;
Added: llvm/trunk/test/Analysis/ScalarEvolution/and-xor.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/and-xor.ll?rev=72010&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/and-xor.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/and-xor.ll Mon May 18 11:29:04 2009
@@ -0,0 +1,8 @@
+; RUN: llvm-as < %s | opt -scalar-evolution -analyze -disable-output \
+; RUN: | grep {\\--> (zext} | count 2
+
+define i32 @foo(i32 %x) {
+ %n = and i32 %x, 255
+ %y = xor i32 %n, 255
+ ret i32 %y
+}
More information about the llvm-commits
mailing list