forked from OSchip/llvm-project
[SCCP] Remove code in visitBinaryOperator (and add tests).
We visit and/or, we try to derive a lattice value for the instruction even if one of the operands is overdefined. If the non-overdefined value is still 'unknown' just return and wait for ResolvedUndefsIn to "plug in" the correct value. This simplifies the logic a bit. While I'm here add tests for missing cases. llvm-svn: 287709
This commit is contained in:
parent
7f423442d1
commit
e7ffae9dea
|
@ -928,25 +928,17 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) {
|
|||
NonOverdefVal = &V2State;
|
||||
|
||||
if (NonOverdefVal) {
|
||||
if (NonOverdefVal->isUnknown()) {
|
||||
// Could annihilate value.
|
||||
if (I.getOpcode() == Instruction::And)
|
||||
markConstant(IV, &I, Constant::getNullValue(I.getType()));
|
||||
else if (VectorType *PT = dyn_cast<VectorType>(I.getType()))
|
||||
markConstant(IV, &I, Constant::getAllOnesValue(PT));
|
||||
else
|
||||
markConstant(IV, &I,
|
||||
Constant::getAllOnesValue(I.getType()));
|
||||
if (NonOverdefVal->isUnknown())
|
||||
return;
|
||||
}
|
||||
|
||||
if (I.getOpcode() == Instruction::And) {
|
||||
// X and 0 = 0
|
||||
if (NonOverdefVal->getConstant()->isNullValue())
|
||||
return markConstant(IV, &I, NonOverdefVal->getConstant());
|
||||
} else {
|
||||
// X or -1 = -1
|
||||
if (ConstantInt *CI = NonOverdefVal->getConstantInt())
|
||||
if (CI->isAllOnesValue()) // X or -1 = -1
|
||||
if (CI->isAllOnesValue())
|
||||
return markConstant(IV, &I, NonOverdefVal->getConstant());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,31 @@
|
|||
; RUN: opt < %s -sccp -S | grep "ret i32 0"
|
||||
; RUN: opt < %s -sccp -S | FileCheck %s
|
||||
|
||||
; Test that SCCP has basic knowledge of when and/or nuke overdefined values.
|
||||
|
||||
define i32 @test(i32 %X) {
|
||||
%Y = and i32 %X, 0 ; <i32> [#uses=1]
|
||||
ret i32 %Y
|
||||
; CHECK-LABEL: test
|
||||
; CHECK: ret i32 0
|
||||
define i32 @test(i32 %X) {
|
||||
%Y = and i32 %X, 0
|
||||
ret i32 %Y
|
||||
}
|
||||
|
||||
; CHECK-LABEL: test2
|
||||
; CHECK: ret i32 -1
|
||||
define i32 @test2(i32 %X) {
|
||||
%Y = or i32 -1, %X
|
||||
ret i32 %Y
|
||||
}
|
||||
|
||||
; CHECK-LABEL: test3
|
||||
; CHECK: ret i32 0
|
||||
define i32 @test3(i32 %X) {
|
||||
%Y = and i32 undef, %X
|
||||
ret i32 %Y
|
||||
}
|
||||
|
||||
; CHECK-LABEL: test4
|
||||
; CHECK: ret i32 -1
|
||||
define i32 @test4(i32 %X) {
|
||||
%Y = or i32 %X, undef
|
||||
ret i32 %Y
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue