[llvm] r287709 - [SCCP] Remove code in visitBinaryOperator (and add tests).
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 22 14:11:25 PST 2016
Author: davide
Date: Tue Nov 22 16:11:25 2016
New Revision: 287709
URL: http://llvm.org/viewvc/llvm-project?rev=287709&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
llvm/trunk/test/Transforms/SCCP/logical-nuke.ll
Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=287709&r1=287708&r2=287709&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Tue Nov 22 16:11:25 2016
@@ -928,25 +928,17 @@ void SCCPSolver::visitBinaryOperator(Ins
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());
}
}
Modified: llvm/trunk/test/Transforms/SCCP/logical-nuke.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SCCP/logical-nuke.ll?rev=287709&r1=287708&r2=287709&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SCCP/logical-nuke.ll (original)
+++ llvm/trunk/test/Transforms/SCCP/logical-nuke.ll Tue Nov 22 16:11:25 2016
@@ -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
+}
More information about the llvm-commits
mailing list