diff options
author | Matthias Braun <matze@braunis.de> | 2015-05-20 18:54:02 +0000 |
---|---|---|
committer | Matthias Braun <matze@braunis.de> | 2015-05-20 18:54:02 +0000 |
commit | 56a781495a3dd1c67332ed2853ec8d93a1857f81 (patch) | |
tree | 3b8edb2e7c842d8429974e5353e62aba910237d1 /llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | |
parent | 2b21a7cf361d9b54459ec6d72847cb4cd5fea1dd (diff) | |
download | bcm5719-llvm-56a781495a3dd1c67332ed2853ec8d93a1857f81.tar.gz bcm5719-llvm-56a781495a3dd1c67332ed2853ec8d93a1857f81.zip |
DAGCombiner: Continue combining if FoldConstantArithmetic() fails.
DAG.FoldConstantArithmetic() can fail even though both operands are
Constants if OpaqueConstants are involved. Continue trying other combine
possibilities in tis case.
Differential Revision: http://reviews.llvm.org/D6946
Somewhat related to PR21801 / rdar://19211454
llvm-svn: 237822
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 055406ce751..833da4b6d59 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -1086,9 +1086,19 @@ bool TargetLowering::SimplifyDemandedBits(SDValue Op, // If we know the value of all of the demanded bits, return this as a // constant. - if ((NewMask & (KnownZero|KnownOne)) == NewMask) + if ((NewMask & (KnownZero|KnownOne)) == NewMask) { + // Avoid folding to a constant if any OpaqueConstant is involved. + const SDNode *N = Op.getNode(); + for (SDNodeIterator I = SDNodeIterator::begin(N), + E = SDNodeIterator::end(N); I != E; ++I) { + SDNode *Op = *I; + if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) + if (C->isOpaque()) + return false; + } return TLO.CombineTo(Op, TLO.DAG.getConstant(KnownOne, dl, Op.getValueType())); + } return false; } |