diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-09-10 00:20:18 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-09-10 00:20:18 +0000 | 
| commit | 2d454bf5be0f70e00136012043c5ac2de15234e2 (patch) | |
| tree | 305802d8931c332c44e53f1d7ad10135f2c42ce9 /llvm/lib/CodeGen/SelectionDAG | |
| parent | bd39c1a4c65c849e1ed309b79f6f8a856ac78e3e (diff) | |
| download | bcm5719-llvm-2d454bf5be0f70e00136012043c5ac2de15234e2.tar.gz bcm5719-llvm-2d454bf5be0f70e00136012043c5ac2de15234e2.zip | |
Allow targets to say they don't support truncstore i1 (which includes a mask
when storing to an 8-bit memory location), as most don't.
llvm-svn: 23303
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 17 | 
1 files changed, 15 insertions, 2 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 55dcbd9ffdd..277f696dcbf 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1043,10 +1043,23 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {      switch (getTypeAction(Node->getOperand(1).getValueType())) {      case Legal:        Tmp2 = LegalizeOp(Node->getOperand(1)); -      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || -          Tmp3 != Node->getOperand(2)) +       +      // The only promote case we handle is TRUNCSTORE:i1 X into +      //   -> TRUNCSTORE:i8 (and X, 1) +      if (cast<VTSDNode>(Node->getOperand(4))->getVT() == MVT::i1 && +          TLI.getOperationAction(ISD::TRUNCSTORE, MVT::i1) ==  +                TargetLowering::Promote) { +        // Promote the bool to a mask then store. +        Tmp2 = DAG.getNode(ISD::AND, Tmp2.getValueType(), Tmp2, +                           DAG.getConstant(1, Tmp2.getValueType())); +        Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp2, Tmp3, +                             Node->getOperand(3), DAG.getValueType(MVT::i8)); + +      } else if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || +                 Tmp3 != Node->getOperand(2)) {          Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp2, Tmp3,                               Node->getOperand(3), Node->getOperand(4)); +      }        break;      case Promote:      case Expand: | 

