[llvm] 1d6f919 - [SCCP] Explicitly mark values as overdefined (NFC).
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 17 05:15:03 PDT 2020
Author: Florian Hahn
Date: 2020-03-17T12:13:30Z
New Revision: 1d6f919df2c52b35d2508d5b6cdffd1d0a665739
URL: https://github.com/llvm/llvm-project/commit/1d6f919df2c52b35d2508d5b6cdffd1d0a665739
DIFF: https://github.com/llvm/llvm-project/commit/1d6f919df2c52b35d2508d5b6cdffd1d0a665739.diff
LOG: [SCCP] Explicitly mark values as overdefined (NFC).
This was part of D60582 but can be committed separately.
Added:
llvm/test/Transforms/SCCP/ip-ranges-select.ll
Modified:
llvm/lib/Transforms/Scalar/SCCP.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp
index dcdc3483a908..e1a2ec2b93f0 100644
--- a/llvm/lib/Transforms/Scalar/SCCP.cpp
+++ b/llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -352,7 +352,7 @@ class SCCPSolver : public InstVisitor<SCCPSolver> {
// pushToWorkList - Helper for markConstant/markOverdefined
void pushToWorkList(LatticeVal &IV, Value *V) {
- if (isOverdefined(IV))
+ if (IV.isOverdefined())
return OverdefinedInstWorkList.push_back(V);
InstWorkList.push_back(V);
}
@@ -361,7 +361,7 @@ class SCCPSolver : public InstVisitor<SCCPSolver> {
// prints a debug message with the updated value.
void pushToWorkListMsg(LatticeVal &IV, Value *V) {
LLVM_DEBUG(dbgs() << "updated " << IV << ": " << *V << '\n');
- if (isOverdefined(IV))
+ if (IV.isOverdefined())
return OverdefinedInstWorkList.push_back(V);
InstWorkList.push_back(V);
}
@@ -779,7 +779,7 @@ void SCCPSolver::visitReturnInst(ReturnInst &I) {
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
if (isOverdefined(ValueState[&I]))
- return;
+ return (void)markOverdefined(&I);
Function *F = I.getParent()->getParent();
Value *ResultOp = I.getOperand(0);
@@ -820,7 +820,7 @@ void SCCPSolver::visitCastInst(CastInst &I) {
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
if (isOverdefined(ValueState[&I]))
- return;
+ return (void)markOverdefined(&I);
LatticeVal OpSt = getValueState(I.getOperand(0));
if (Constant *OpC = getConstant(OpSt)) {
@@ -838,7 +838,7 @@ void SCCPSolver::visitExtractValueInst(ExtractValueInst &EVI) {
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
if (isOverdefined(ValueState[&EVI]))
- return;
+ return (void)markOverdefined(&EVI);
// If this returns a struct, mark all elements over defined, we don't track
// structs in structs.
@@ -868,7 +868,7 @@ void SCCPSolver::visitInsertValueInst(InsertValueInst &IVI) {
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
if (isOverdefined(ValueState[&IVI]))
- return;
+ return (void)markOverdefined(&IVI);
// If this has more than one index, we can't handle it, drive all results to
// undef.
@@ -906,8 +906,8 @@ void SCCPSolver::visitSelectInst(SelectInst &I) {
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
- if (isOverdefined(ValueState[&I]))
- return;
+ if (ValueState[&I].isOverdefined())
+ return (void)markOverdefined(&I);
LatticeVal CondValue = getValueState(I.getCondition());
if (CondValue.isUnknownOrUndef())
@@ -944,7 +944,8 @@ void SCCPSolver::visitUnaryOperator(Instruction &I) {
LatticeVal &IV = ValueState[&I];
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
- if (isOverdefined(IV)) return;
+ if (isOverdefined(IV))
+ return (void)markOverdefined(&I);
if (isConstant(V0State)) {
Constant *C = ConstantExpr::get(I.getOpcode(), getConstant(V0State));
@@ -968,10 +969,8 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) {
LatticeVal V2State = getValueState(I.getOperand(1));
LatticeVal &IV = ValueState[&I];
- if (isOverdefined(IV)) {
- markOverdefined(&I);
- return;
- }
+ if (isOverdefined(IV))
+ return (void)markOverdefined(&I);
if (isConstant(V1State) && isConstant(V2State)) {
Constant *C = ConstantExpr::get(I.getOpcode(), getConstant(V1State),
@@ -1032,10 +1031,8 @@ void SCCPSolver::visitBinaryOperator(Instruction &I) {
void SCCPSolver::visitCmpInst(CmpInst &I) {
// Do not cache this lookup, getValueState calls later in the function might
// invalidate the reference.
- if (isOverdefined(ValueState[&I])) {
- markOverdefined(&I);
- return;
- }
+ if (isOverdefined(ValueState[&I]))
+ return (void)markOverdefined(&I);
Value *Op1 = I.getOperand(0);
Value *Op2 = I.getOperand(1);
@@ -1066,7 +1063,8 @@ void SCCPSolver::visitCmpInst(CmpInst &I) {
// Handle getelementptr instructions. If all operands are constants then we
// can turn this into a getelementptr ConstantExpr.
void SCCPSolver::visitGetElementPtrInst(GetElementPtrInst &I) {
- if (isOverdefined(ValueState[&I])) return;
+ if (isOverdefined(ValueState[&I]))
+ return (void)markOverdefined(&I);
SmallVector<Constant*, 8> Operands;
Operands.reserve(I.getNumOperands());
@@ -1107,7 +1105,7 @@ void SCCPSolver::visitStoreInst(StoreInst &SI) {
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
if (isOverdefined(ValueState[&SI]))
- return;
+ return (void)markOverdefined(&SI);
GlobalVariable *GV = cast<GlobalVariable>(SI.getOperand(1));
DenseMap<GlobalVariable*, LatticeVal>::iterator I = TrackedGlobals.find(GV);
@@ -1130,7 +1128,7 @@ void SCCPSolver::visitLoadInst(LoadInst &I) {
// ResolvedUndefsIn might mark I as overdefined. Bail out, even if we would
// discover a concrete value later.
if (isOverdefined(ValueState[&I]))
- return;
+ return (void)markOverdefined(&I);
LatticeVal PtrVal = getValueState(I.getOperand(0));
if (PtrVal.isUnknownOrUndef())
@@ -1267,7 +1265,7 @@ void SCCPSolver::visitCallSite(CallSite CS) {
}
if (isOverdefined(getValueState(I)))
- return;
+ return (void)markOverdefined(I);
// If we can constant fold this, mark the result of the call as a
// constant.
@@ -1365,7 +1363,7 @@ void SCCPSolver::Solve() {
// since all of its users will have already been marked as overdefined.
// Update all of the users of this instruction's value.
//
- if (I->getType()->isStructTy() || !isOverdefined(getValueState(I)))
+ if (I->getType()->isStructTy() || !getValueState(I).isOverdefined())
markUsersAsChanged(I);
}
diff --git a/llvm/test/Transforms/SCCP/ip-ranges-select.ll b/llvm/test/Transforms/SCCP/ip-ranges-select.ll
new file mode 100644
index 000000000000..b19dc4335262
--- /dev/null
+++ b/llvm/test/Transforms/SCCP/ip-ranges-select.ll
@@ -0,0 +1,37 @@
+; RUN: opt -ipsccp -S %s -o -| FileCheck %s
+
+define void @caller.1(i8* %arg) {
+; CHECK-LABEL: define void @caller.1(i8* %arg) {
+; CHECK-NEXT: %r.1 = tail call i32 @callee.1(i32 4)
+; CHECK-NEXT: %r.2 = tail call i32 @callee.1(i32 2)
+; CHECK-NEXT: call void @use(i32 20)
+; CHECK-NEXT: ret void
+;
+ %r.1 = tail call i32 @callee.1(i32 4)
+ %r.2 = tail call i32 @callee.1(i32 2)
+ %r.3 = add i32 %r.1, %r.2
+ call void @use(i32 %r.3)
+ ret void
+}
+
+define internal i32 @callee.1(i32 %arg) {
+; CHECK-LABEL: define internal i32 @callee.1(i32 %arg) {
+; CHECK-NEXT: %sel = select i1 false, i32 16, i32 %arg
+; CHECK-NEXT: br label %bb10
+;
+; CHECK-LABEL: bb10:
+; CHECK-NEXT: ret i32 undef
+;
+ %c.1 = icmp slt i32 %arg, 0
+ %sel = select i1 %c.1, i32 16, i32 %arg
+ %c.2 = icmp eq i32 %sel, 0
+ br i1 %c.2, label %bb12, label %bb10
+
+bb10: ; preds = %bb8
+ ret i32 10
+
+bb12: ; preds = %bb8, %bb3, %bb
+ ret i32 12
+}
+
+declare void @use(i32)
More information about the llvm-commits
mailing list