mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-05 02:07:16 +00:00
Teach ScalarEvolution to recognize x^-1 in the case where non-demanded
bits have been stripped out by instcombine. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72010 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0bac95e2e2
commit
10978bd591
@ -2203,6 +2203,19 @@ SCEVHandle ScalarEvolution::createSCEV(Value *V) {
|
||||
// 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;
|
||||
|
||||
|
8
test/Analysis/ScalarEvolution/and-xor.ll
Normal file
8
test/Analysis/ScalarEvolution/and-xor.ll
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user