diff options
author | James Molloy <james.molloy@arm.com> | 2015-06-04 13:48:23 +0000 |
---|---|---|
committer | James Molloy <james.molloy@arm.com> | 2015-06-04 13:48:23 +0000 |
commit | 37593732a49932b985cba26825415d803793ac05 (patch) | |
tree | 7a465f49fb1edd2575992b4e79dd38d2821a2f42 /llvm/lib | |
parent | 7813ae879e7a9151349ad67f26ee6cfd6feae347 (diff) | |
download | bcm5719-llvm-37593732a49932b985cba26825415d803793ac05.tar.gz bcm5719-llvm-37593732a49932b985cba26825415d803793ac05.zip |
Don't create a MIN/MAX node if the underlying compare has more than one use.
If the compare in a select pattern has another use then it can't be removed, so we'd just
be creating repeated code if we created a min/max node.
Spotted by Matt Arsenault!
llvm-svn: 239037
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 9a81ec51dda..6b366cc4af6 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -2282,7 +2282,11 @@ void SelectionDAGBuilder::visitSelect(const User &I) { while (TLI.getTypeAction(Ctx, VT) == TargetLoweringBase::TypeSplitVector) VT = TLI.getTypeToTransformTo(Ctx, VT); - if (Opc != ISD::DELETED_NODE && TLI.isOperationLegalOrCustom(Opc, VT)) { + if (Opc != ISD::DELETED_NODE && TLI.isOperationLegalOrCustom(Opc, VT) && + // If the underlying comparison instruction is used by any other instruction, + // the consumed instructions won't be destroyed, so it is not profitable + // to convert to a min/max. + cast<SelectInst>(&I)->getCondition()->hasOneUse()) { OpCode = Opc; LHSVal = getValue(LHS); RHSVal = getValue(RHS); |