Index: llvm/lib/Transforms/Scalar/SCCP.cpp =================================================================== --- llvm/lib/Transforms/Scalar/SCCP.cpp +++ llvm/lib/Transforms/Scalar/SCCP.cpp @@ -613,6 +613,7 @@ void visitCastInst(CastInst &I); void visitSelectInst(SelectInst &I); + void visitUnaryOperator(Instruction &I); void visitBinaryOperator(Instruction &I); void visitCmpInst(CmpInst &I); void visitExtractValueInst(ExtractValueInst &EVI); @@ -969,6 +970,29 @@ markOverdefined(&I); } +// Handle Unary Operators. +void SCCPSolver::visitUnaryOperator(Instruction &I) { + LatticeVal VState = getValueState(I.getOperand(0)); + + LatticeVal &IV = ValueState[&I]; + if (IV.isOverdefined()) return; + + if (VState.isConstant()) { + Constant *C = ConstantExpr::get(I.getOpcode(), VState.getConstant()); + + // op Y -> undef. + if (isa(C)) + return; + return (void)markConstant(IV, &I, C); + } + + // If something is undef, wait for it to resolve. + if (!VState.isOverdefined()) + return; + + markOverdefined(&I); +} + // Handle Binary Operators. void SCCPSolver::visitBinaryOperator(Instruction &I) { LatticeVal V1State = getValueState(I.getOperand(0)); @@ -1484,6 +1508,8 @@ else markOverdefined(&I); return true; + case Instruction::FNeg: + break; // fneg undef -> undef case Instruction::ZExt: case Instruction::SExt: case Instruction::FPToUI: Index: llvm/test/Transforms/SCCP/undef-resolve.ll =================================================================== --- llvm/test/Transforms/SCCP/undef-resolve.ll +++ llvm/test/Transforms/SCCP/undef-resolve.ll @@ -180,3 +180,11 @@ ; CHECK-LABEL: @test11( ; CHECK: ret i32 0 } + +; Test unary ops +define double @test12(double %x) { + %t = fneg double undef + ret double %t +; CHECK-LABEL: @test12( +; CHECK: double undef +}