diff options
| author | Dan Gohman <gohman@apple.com> | 2008-02-22 01:12:31 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2008-02-22 01:12:31 +0000 |
| commit | f3057a939d63770aa1ae919146bdfc9d91635b59 (patch) | |
| tree | 325bfc74cf1f698a27d8b711ce92c2e072273779 /llvm/lib | |
| parent | cb507025d4a8fad0c9cef29d874b0334502139bd (diff) | |
| download | bcm5719-llvm-f3057a939d63770aa1ae919146bdfc9d91635b59.tar.gz bcm5719-llvm-f3057a939d63770aa1ae919146bdfc9d91635b59.zip | |
Fix a regression in 403.gcc and 186.crafty introduced in 47383. To test
that a value is >= 32, check that all of the high bits are zero, not
just one or more.
llvm-svn: 47467
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 10 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypesExpand.cpp | 48 |
2 files changed, 30 insertions, 28 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 91e52a6c9ed..203a5080f50 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -5147,8 +5147,8 @@ bool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDOperand Op,SDOperand Amt, APInt KnownZero, KnownOne; DAG.ComputeMaskedBits(Amt, Mask, KnownZero, KnownOne); - // If we know that the high bit of the shift amount is one, then we can do - // this as a couple of simple shifts. + // If we know that if any of the high bits of the shift amount are one, then + // we can do this as a couple of simple shifts. if (KnownOne.intersects(Mask)) { // Mask out the high bit, which we know is set. Amt = DAG.getNode(ISD::AND, Amt.getValueType(), Amt, @@ -5174,9 +5174,9 @@ bool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDOperand Op,SDOperand Amt, } } - // If we know that the high bit of the shift amount is zero, then we can do - // this as a couple of simple shifts. - if (KnownZero.intersects(Mask)) { + // If we know that the high bits of the shift amount are all zero, then we can + // do this as a couple of simple shifts. + if ((KnownZero & Mask) == Mask) { // Compute 32-amt. SDOperand Amt2 = DAG.getNode(ISD::SUB, Amt.getValueType(), DAG.getConstant(NVTBits, Amt.getValueType()), diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesExpand.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesExpand.cpp index 79920e6c3c3..58beefa440a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesExpand.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesExpand.cpp @@ -760,7 +760,7 @@ ExpandShiftWithKnownAmountBit(SDNode *N, SDOperand &Lo, SDOperand &Hi) { APInt KnownZero, KnownOne; DAG.ComputeMaskedBits(N->getOperand(1), HighBitMask, KnownZero, KnownOne); - // If we don't know anything about the high bit, exit. + // If we don't know anything about the high bits, exit. if (((KnownZero|KnownOne) & HighBitMask) == 0) return false; @@ -768,8 +768,8 @@ ExpandShiftWithKnownAmountBit(SDNode *N, SDOperand &Lo, SDOperand &Hi) { SDOperand InL, InH; GetExpandedOp(N->getOperand(0), InL, InH); - // If we know that the high bit of the shift amount is one, then we can do - // this as a couple of simple shifts. + // If we know that any of the high bits of the shift amount are one, then we + // can do this as a couple of simple shifts. if (KnownOne.intersects(HighBitMask)) { // Mask out the high bit, which we know is set. Amt = DAG.getNode(ISD::AND, ShTy, Amt, @@ -793,27 +793,29 @@ ExpandShiftWithKnownAmountBit(SDNode *N, SDOperand &Lo, SDOperand &Hi) { } } - // If we know that the high bit of the shift amount is zero, then we can do - // this as a couple of simple shifts. - assert(KnownZero.intersects(HighBitMask) && "Bad mask computation above"); - - // Compute 32-amt. - SDOperand Amt2 = DAG.getNode(ISD::SUB, ShTy, - DAG.getConstant(NVTBits, ShTy), - Amt); - unsigned Op1, Op2; - switch (N->getOpcode()) { - default: assert(0 && "Unknown shift"); - case ISD::SHL: Op1 = ISD::SHL; Op2 = ISD::SRL; break; - case ISD::SRL: - case ISD::SRA: Op1 = ISD::SRL; Op2 = ISD::SHL; break; - } + // If we know that all of the high bits of the shift amount are zero, then we + // can do this as a couple of simple shifts. + if ((KnownZero & HighBitMask) == HighBitMask) { + // Compute 32-amt. + SDOperand Amt2 = DAG.getNode(ISD::SUB, ShTy, + DAG.getConstant(NVTBits, ShTy), + Amt); + unsigned Op1, Op2; + switch (N->getOpcode()) { + default: assert(0 && "Unknown shift"); + case ISD::SHL: Op1 = ISD::SHL; Op2 = ISD::SRL; break; + case ISD::SRL: + case ISD::SRA: Op1 = ISD::SRL; Op2 = ISD::SHL; break; + } - Lo = DAG.getNode(N->getOpcode(), NVT, InL, Amt); - Hi = DAG.getNode(ISD::OR, NVT, - DAG.getNode(Op1, NVT, InH, Amt), - DAG.getNode(Op2, NVT, InL, Amt2)); - return true; + Lo = DAG.getNode(N->getOpcode(), NVT, InL, Amt); + Hi = DAG.getNode(ISD::OR, NVT, + DAG.getNode(Op1, NVT, InH, Amt), + DAG.getNode(Op2, NVT, InL, Amt2)); + return true; + } + + return false; } |

