diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO/FunctionSpecialization.cpp')
| -rw-r--r-- | llvm/lib/Transforms/IPO/FunctionSpecialization.cpp | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp index 548335d750e3..bd0a337e579e 100644 --- a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp +++ b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp @@ -423,13 +423,16 @@ Constant *InstCostVisitor::visitGetElementPtrInst(GetElementPtrInst &I) { Constant *InstCostVisitor::visitSelectInst(SelectInst &I) { assert(LastVisited != KnownConstants.end() && "Invalid iterator!"); - if (I.getCondition() != LastVisited->first) - return nullptr; - - Value *V = LastVisited->second->isZeroValue() ? I.getFalseValue() - : I.getTrueValue(); - Constant *C = findConstantFor(V, KnownConstants); - return C; + if (I.getCondition() == LastVisited->first) { + Value *V = LastVisited->second->isZeroValue() ? I.getFalseValue() + : I.getTrueValue(); + return findConstantFor(V, KnownConstants); + } + if (Constant *Condition = findConstantFor(I.getCondition(), KnownConstants)) + if ((I.getTrueValue() == LastVisited->first && Condition->isOneValue()) || + (I.getFalseValue() == LastVisited->first && Condition->isZeroValue())) + return LastVisited->second; + return nullptr; } Constant *InstCostVisitor::visitCastInst(CastInst &I) { |
