Index: llvm/lib/Transforms/Utils/SCCPSolver.cpp =================================================================== --- llvm/lib/Transforms/Utils/SCCPSolver.cpp +++ llvm/lib/Transforms/Utils/SCCPSolver.cpp @@ -208,8 +208,6 @@ if (!Elt) LV.markOverdefined(); // Unknown sort of constant. - else if (isa(Elt)) - ; // Undef values remain unknown. else LV.markConstant(Elt); // Constants are constant. } @@ -356,8 +354,7 @@ // We only track the contents of scalar globals. if (GV->getValueType()->isSingleValueType()) { ValueLatticeElement &IV = TrackedGlobals[GV]; - if (!isa(GV->getInitializer())) - IV.markConstant(GV->getInitializer()); + IV.markConstant(GV->getInitializer()); } } @@ -822,9 +819,6 @@ if (Constant *OpC = getConstant(OpSt)) { // Fold the constant as we build. Constant *C = ConstantFoldCastOperand(I.getOpcode(), OpC, I.getType(), DL); - if (isa(C)) - return; - // Propagate constant value markConstant(&I, C); } else if (I.getDestTy()->isIntegerTy()) { auto &LV = getValueState(&I); @@ -961,10 +955,6 @@ if (isConstant(V0State)) { Constant *C = ConstantExpr::get(I.getOpcode(), getConstant(V0State)); - - // op Y -> undef. - if (isa(C)) - return; return (void)markConstant(IV, &I, C); } @@ -999,9 +989,6 @@ Value *R = simplifyBinOp(I.getOpcode(), V1, V2, SimplifyQuery(DL)); auto *C = dyn_cast_or_null(R); if (C) { - // X op Y -> undef. - if (isa(C)) - return; // Conservatively assume that the result may be based on operands that may // be undef. Note that we use mergeInValue to combine the constant with // the existing lattice value for I, as different constants might be found @@ -1050,6 +1037,7 @@ Constant *C = V1State.getCompare(I.getPredicate(), I.getType(), V2State); if (C) { + // TODO: getCompare() currently has incorrect handling for unknown/undef. if (isa(C)) return; ValueLatticeElement CV; @@ -1095,8 +1083,6 @@ auto Indices = makeArrayRef(Operands.begin() + 1, Operands.end()); Constant *C = ConstantExpr::getGetElementPtr(I.getSourceElementType(), Ptr, Indices); - if (isa(C)) - return; markConstant(&I, C); } @@ -1174,11 +1160,8 @@ } // Transform load from a constant into a constant if possible. - if (Constant *C = ConstantFoldLoadFromConstPtr(Ptr, I.getType(), DL)) { - if (isa(C)) - return; + if (Constant *C = ConstantFoldLoadFromConstPtr(Ptr, I.getType(), DL)) return (void)markConstant(IV, &I, C); - } } // Fall back to metadata. @@ -1223,12 +1206,8 @@ // If we can constant fold this, mark the result of the call as a // constant. - if (Constant *C = ConstantFoldCall(&CB, F, Operands, &GetTLI(*F))) { - // call -> undef. - if (isa(C)) - return; + if (Constant *C = ConstantFoldCall(&CB, F, Operands, &GetTLI(*F))) return (void)markConstant(&CB, C); - } } // Fall back to metadata. Index: llvm/test/Transforms/SCCP/undef-resolve.ll =================================================================== --- llvm/test/Transforms/SCCP/undef-resolve.ll +++ llvm/test/Transforms/SCCP/undef-resolve.ll @@ -246,8 +246,7 @@ define i64 @test10() { ; CHECK-LABEL: @test10( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[E:%.*]] = extractvalue { i64, i64 } undef, 1 -; CHECK-NEXT: ret i64 [[E]] +; CHECK-NEXT: ret i64 undef ; entry: %e = extractvalue { i64, i64 } undef, 1