diff options
author | Cameron McInally <cameron.mcinally@nyu.edu> | 2019-06-03 21:53:56 +0000 |
---|---|---|
committer | Cameron McInally <cameron.mcinally@nyu.edu> | 2019-06-03 21:53:56 +0000 |
commit | 89f9af5487e3287c1638e53d0b5b057154eb1b32 (patch) | |
tree | 23f93e5862c7836b491564a787d5bf19f86c7509 /llvm/lib/Transforms/Scalar/SCCP.cpp | |
parent | 6ff978ee05469f0f976bf003e601f879db754ed8 (diff) | |
download | bcm5719-llvm-89f9af5487e3287c1638e53d0b5b057154eb1b32.tar.gz bcm5719-llvm-89f9af5487e3287c1638e53d0b5b057154eb1b32.zip |
[SCCP] Add UnaryOperator visitor to SCCP for unary FNeg
Differential Revision: https://reviews.llvm.org/D62819
llvm-svn: 362449
Diffstat (limited to 'llvm/lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index 66885ed57e2..1d0354bd708 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -613,6 +613,7 @@ private: 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 @@ void SCCPSolver::visitSelectInst(SelectInst &I) { markOverdefined(&I); } +// Handle Unary Operators. +void SCCPSolver::visitUnaryOperator(Instruction &I) { + LatticeVal V0State = getValueState(I.getOperand(0)); + + LatticeVal &IV = ValueState[&I]; + if (IV.isOverdefined()) return; + + if (V0State.isConstant()) { + Constant *C = ConstantExpr::get(I.getOpcode(), V0State.getConstant()); + + // op Y -> undef. + if (isa<UndefValue>(C)) + return; + return (void)markConstant(IV, &I, C); + } + + // If something is undef, wait for it to resolve. + if (!V0State.isOverdefined()) + return; + + markOverdefined(&I); +} + // Handle Binary Operators. void SCCPSolver::visitBinaryOperator(Instruction &I) { LatticeVal V1State = getValueState(I.getOperand(0)); @@ -1484,6 +1508,8 @@ bool SCCPSolver::ResolvedUndefsIn(Function &F) { else markOverdefined(&I); return true; + case Instruction::FNeg: + break; // fneg undef -> undef case Instruction::ZExt: case Instruction::SExt: case Instruction::FPToUI: |