diff options
author | Duncan Sands <baldrick@free.fr> | 2008-10-30 20:26:50 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-10-30 20:26:50 +0000 |
commit | e18295c258d567135ea9f056a6851123b8fb2435 (patch) | |
tree | 816580cba7b9228f0624cb30e631a601ed23326b /llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | 82d87d620323044f72bde0cf39a20a03a776409a (diff) | |
download | bcm5719-llvm-e18295c258d567135ea9f056a6851123b8fb2435.tar.gz bcm5719-llvm-e18295c258d567135ea9f056a6851123b8fb2435.zip |
Fix PR2986: do not use a potentially illegal
type for the shift amount type. Add a check
that shifts and rotates use the type returned
by getShiftAmountTy for the amount. This
exposed some problems in CellSPU and PPC,
which have already been fixed.
llvm-svn: 58455
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 0c737261aa6..3601b6e0e04 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -2390,6 +2390,8 @@ SDValue SelectionDAG::getNode(unsigned Opcode, MVT VT, "Shift operators return type must be the same as their first arg"); assert(VT.isInteger() && N2.getValueType().isInteger() && "Shifts only work on integers"); + assert(N2.getValueType() == TLI.getShiftAmountTy() && + "Wrong type for shift amount"); // Always fold shifts of i1 values so the code generator doesn't need to // handle them. Since we know the size of the shift has to be less than the @@ -2763,12 +2765,15 @@ static SDValue getMemsetValue(SDValue Value, MVT VT, SelectionDAG &DAG) { return DAG.getConstantFP(APFloat(Val), VT); } + const TargetLowering &TLI = DAG.getTargetLoweringInfo(); Value = DAG.getNode(ISD::ZERO_EXTEND, VT, Value); unsigned Shift = 8; for (unsigned i = NumBits; i > 8; i >>= 1) { Value = DAG.getNode(ISD::OR, VT, DAG.getNode(ISD::SHL, VT, Value, - DAG.getConstant(Shift, MVT::i8)), Value); + DAG.getConstant(Shift, + TLI.getShiftAmountTy())), + Value); Shift <<= 1; } |