Changes in directory llvm/lib/CodeGen/SelectionDAG:
DAGCombiner.cpp updated: 1.218 -> 1.219 LegalizeDAG.cpp updated: 1.411 -> 1.412 SelectionDAG.cpp updated: 1.349 -> 1.350 SelectionDAGISel.cpp updated: 1.287 -> 1.288 TargetLowering.cpp updated: 1.76 -> 1.77 --- Log message: Merge ISD::TRUNCSTORE to ISD::STORE. Switch to using StoreSDNode. --- Diffs of the changes: (+252 -223) DAGCombiner.cpp | 76 ++++++------- LegalizeDAG.cpp | 289 +++++++++++++++++++++++++-------------------------- SelectionDAG.cpp | 97 +++++++++++------ SelectionDAGISel.cpp | 12 +- TargetLowering.cpp | 1 5 files changed, 252 insertions(+), 223 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.218 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.219 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.218 Thu Oct 12 15:58:32 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Oct 13 16:12:22 2006 @@ -503,8 +503,6 @@ case ISD::BRCOND: return visitBRCOND(N); case ISD::BR_CC: return visitBR_CC(N); case ISD::LOAD: return visitLOAD(N); - // FIXME - Switch over after StoreSDNode comes online. - case ISD::TRUNCSTORE: // Fall thru case ISD::STORE: return visitSTORE(N); case ISD::INSERT_VECTOR_ELT: return visitINSERT_VECTOR_ELT(N); case ISD::VINSERT_VECTOR_ELT: return visitVINSERT_VECTOR_ELT(N); @@ -2687,9 +2685,12 @@ // TODO: Handle store large -> read small portion. // TODO: Handle TRUNCSTORE/LOADEXT if (LD->getExtensionType() == ISD::NON_EXTLOAD) { - if (Chain.getOpcode() == ISD::STORE && Chain.getOperand(2) == Ptr && - Chain.getOperand(1).getValueType() == N->getValueType(0)) + if (ISD::isNON_TRUNCStore(Chain.Val)) { + StoreSDNode *PrevST = cast<StoreSDNode>(Chain); + if (PrevST->getBasePtr() == Ptr && + PrevST->getValue().getValueType() == N->getValueType(0)) return CombineTo(N, Chain.getOperand(1), Chain); + } } if (CombinerAA) { @@ -2725,13 +2726,13 @@ } SDOperand DAGCombiner::visitSTORE(SDNode *N) { - SDOperand Chain = N->getOperand(0); - SDOperand Value = N->getOperand(1); - SDOperand Ptr = N->getOperand(2); - SDOperand SrcValue = N->getOperand(3); + StoreSDNode *ST = cast<StoreSDNode>(N); + SDOperand Chain = ST->getChain(); + SDOperand Value = ST->getValue(); + SDOperand Ptr = ST->getBasePtr(); // FIXME - Switch over after StoreSDNode comes online. - if (N->getOpcode() == ISD::TRUNCSTORE) { + if (ST->isTruncatingStore()) { if (CombinerAA) { // Walk up chain skipping non-aliasing memory nodes. SDOperand BetterChain = FindBetterChain(N, Chain); @@ -2739,9 +2740,9 @@ // If there is a better chain. if (Chain != BetterChain) { // Replace the chain to avoid dependency. - SDOperand ReplTStore = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, - BetterChain, Value, Ptr, SrcValue, - N->getOperand(4)); + SDOperand ReplTStore = + DAG.getTruncStore(BetterChain, Value, Ptr, ST->getSrcValue(), + ST->getSrcValueOffset(), ST->getStoredVT()); // Create token to keep both nodes around. return DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplTStore); @@ -2752,27 +2753,30 @@ } // If this is a store that kills a previous store, remove the previous store. - if (Chain.getOpcode() == ISD::STORE && Chain.getOperand(2) == Ptr && - Chain.Val->hasOneUse() /* Avoid introducing DAG cycles */ && - // Make sure that these stores are the same value type: - // FIXME: we really care that the second store is >= size of the first. - Value.getValueType() == Chain.getOperand(1).getValueType()) { - // Create a new store of Value that replaces both stores. - SDNode *PrevStore = Chain.Val; - if (PrevStore->getOperand(1) == Value) // Same value multiply stored. - return Chain; - SDOperand NewStore = DAG.getStore(PrevStore->getOperand(0), Value, Ptr, - SrcValue); - CombineTo(N, NewStore); // Nuke this store. - CombineTo(PrevStore, NewStore); // Nuke the previous store. - return SDOperand(N, 0); + if (ISD::isNON_TRUNCStore(Chain.Val)) { + StoreSDNode *PrevST = cast<StoreSDNode>(Chain); + if (PrevST->getBasePtr() == Ptr && + Chain.Val->hasOneUse() /* Avoid introducing DAG cycles */ && + // Make sure that these stores are the same value type: + // FIXME: we really care that the second store is >= size of the first. + Value.getValueType() == PrevST->getValue().getValueType()) { + // Create a new store of Value that replaces both stores. + if (PrevST->getValue() == Value) // Same value multiply stored. + return Chain; + SDOperand NewStore = DAG.getStore(PrevST->getChain(), Value, Ptr, + ST->getSrcValue(), ST->getSrcValueOffset()); + CombineTo(N, NewStore); // Nuke this store. + CombineTo(Chain.Val, NewStore); // Nuke the previous store. + return SDOperand(N, 0); + } } // If this is a store of a bit convert, store the input value. // FIXME: This needs to know that the resultant store does not need a // higher alignment than the original. if (0 && Value.getOpcode() == ISD::BIT_CONVERT) { - return DAG.getStore(Chain, Value.getOperand(0), Ptr, SrcValue); + return DAG.getStore(Chain, Value.getOperand(0), Ptr, ST->getSrcValue(), + ST->getSrcValueOffset()); } if (CombinerAA) { @@ -2789,7 +2793,8 @@ // If there is a better chain. if (Chain != BetterChain) { // Replace the chain to avoid dependency. - SDOperand ReplStore = DAG.getStore(BetterChain, Value, Ptr, SrcValue); + SDOperand ReplStore = DAG.getStore(BetterChain, Value, Ptr, + ST->getSrcValue(), ST->getSrcValueOffset()); // Create token to keep both nodes around. return DAG.getNode(ISD::TokenFactor, MVT::Other, Chain, ReplStore); } @@ -4050,20 +4055,9 @@ SrcValue = LD->getSrcValue(); return true; } else if (StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) { -#if 1 // FIXME - Switch over after StoreSDNode comes online. - Ptr = ST->getOperand(2); - Size = MVT::getSizeInBits(ST->getOperand(1).getValueType()) >> 3; - SrcValue = 0; -#else Ptr = ST->getBasePtr(); - Size = MVT::getSizeInBits(ST->getOperand(1).getValueType()) >> 3; + Size = MVT::getSizeInBits(ST->getStoredVT()) >> 3; SrcValue = ST->getSrcValue(); -#endif - // FIXME - Switch over after StoreSDNode comes online. - } else if (N->getOpcode() == ISD::TRUNCSTORE) { - Ptr = N->getOperand(2); - Size = MVT::getSizeInBits(cast<VTSDNode>(N->getOperand(4))->getVT()) >> 3; - SrcValue = 0; } else { assert(0 && "FindAliasInfo expected a memory operand"); } @@ -4104,8 +4098,6 @@ break; case ISD::LOAD: - // FIXME - Switch over after StoreSDNode comes online. - case ISD::TRUNCSTORE: case ISD::STORE: { // Get alias information for Chain. SDOperand OpPtr; Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.411 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.412 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.411 Wed Oct 11 12:52:19 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Oct 13 16:12:22 2006 @@ -917,8 +917,7 @@ MVT::ValueType PtrVT = TLI.getPointerTy(); SDOperand StackPtr = CreateStackTemporary(VT); // Store the vector. - SDOperand Ch = DAG.getStore(DAG.getEntryNode(), - Tmp1, StackPtr, DAG.getSrcValue(NULL)); + SDOperand Ch = DAG.getStore(DAG.getEntryNode(), Tmp1, StackPtr, NULL, 0); // Truncate or zero extend offset to target pointer type. unsigned CastOpc = (IdxVT > PtrVT) ? ISD::TRUNCATE : ISD::ZERO_EXTEND; @@ -928,7 +927,7 @@ Tmp3 = DAG.getNode(ISD::MUL, IdxVT, Tmp3,DAG.getConstant(EltSize, IdxVT)); SDOperand StackPtr2 = DAG.getNode(ISD::ADD, IdxVT, Tmp3, StackPtr); // Store the scalar value. - Ch = DAG.getStore(Ch, Tmp2, StackPtr2, DAG.getSrcValue(NULL)); + Ch = DAG.getStore(Ch, Tmp2, StackPtr2, NULL, 0); // Load the updated vector. Result = DAG.getLoad(VT, Ch, StackPtr, NULL, 0); break; @@ -1592,109 +1591,144 @@ } break; case ISD::STORE: { - Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - Tmp2 = LegalizeOp(Node->getOperand(2)); // Legalize the pointer. - - // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr' - // FIXME: We shouldn't do this for TargetConstantFP's. - // FIXME: move this to the DAG Combiner! - if (ConstantFPSDNode *CFP =dyn_cast<ConstantFPSDNode>(Node->getOperand(1))){ - if (CFP->getValueType(0) == MVT::f32) { - Tmp3 = DAG.getConstant(FloatToBits(CFP->getValue()), MVT::i32); - } else { - assert(CFP->getValueType(0) == MVT::f64 && "Unknown FP type!"); - Tmp3 = DAG.getConstant(DoubleToBits(CFP->getValue()), MVT::i64); + StoreSDNode *ST = cast<StoreSDNode>(Node); + Tmp1 = LegalizeOp(ST->getChain()); // Legalize the chain. + Tmp2 = LegalizeOp(ST->getBasePtr()); // Legalize the pointer. + + if (!ST->isTruncatingStore()) { + // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr' + // FIXME: We shouldn't do this for TargetConstantFP's. + // FIXME: move this to the DAG Combiner! + if (ConstantFPSDNode *CFP =dyn_cast<ConstantFPSDNode>(ST->getValue())) { + if (CFP->getValueType(0) == MVT::f32) { + Tmp3 = DAG.getConstant(FloatToBits(CFP->getValue()), MVT::i32); + } else { + assert(CFP->getValueType(0) == MVT::f64 && "Unknown FP type!"); + Tmp3 = DAG.getConstant(DoubleToBits(CFP->getValue()), MVT::i64); + } + Result = DAG.getStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(), + ST->getSrcValueOffset()); + break; } - Result = DAG.getStore(Tmp1, Tmp3, Tmp2, Node->getOperand(3)); - break; - } - switch (getTypeAction(Node->getOperand(1).getValueType())) { - case Legal: { - Tmp3 = LegalizeOp(Node->getOperand(1)); - Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, - Node->getOperand(3)); - - MVT::ValueType VT = Tmp3.getValueType(); - switch (TLI.getOperationAction(ISD::STORE, VT)) { - default: assert(0 && "This action is not supported yet!"); - case TargetLowering::Legal: break; - case TargetLowering::Custom: - Tmp1 = TLI.LowerOperation(Result, DAG); - if (Tmp1.Val) Result = Tmp1; - break; - case TargetLowering::Promote: - assert(MVT::isVector(VT) && "Unknown legal promote case!"); - Tmp3 = DAG.getNode(ISD::BIT_CONVERT, - TLI.getTypeToPromoteTo(ISD::STORE, VT), Tmp3); + switch (getTypeAction(ST->getStoredVT())) { + case Legal: { + Tmp3 = LegalizeOp(ST->getValue()); Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, - Node->getOperand(3)); + ST->getOffset()); + + MVT::ValueType VT = Tmp3.getValueType(); + switch (TLI.getOperationAction(ISD::STORE, VT)) { + default: assert(0 && "This action is not supported yet!"); + case TargetLowering::Legal: break; + case TargetLowering::Custom: + Tmp1 = TLI.LowerOperation(Result, DAG); + if (Tmp1.Val) Result = Tmp1; + break; + case TargetLowering::Promote: + assert(MVT::isVector(VT) && "Unknown legal promote case!"); + Tmp3 = DAG.getNode(ISD::BIT_CONVERT, + TLI.getTypeToPromoteTo(ISD::STORE, VT), Tmp3); + Result = DAG.getStore(Tmp1, Tmp3, Tmp2, + ST->getSrcValue(), ST->getSrcValueOffset()); + break; + } break; } - break; - } - case Promote: - // Truncate the value and store the result. - Tmp3 = PromoteOp(Node->getOperand(1)); - Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp3, Tmp2, - Node->getOperand(3), - DAG.getValueType(Node->getOperand(1).getValueType())); - break; + case Promote: + // Truncate the value and store the result. + Tmp3 = PromoteOp(ST->getValue()); + Result = DAG.getTruncStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(), + ST->getSrcValueOffset(), ST->getStoredVT()); + break; - case Expand: - unsigned IncrementSize = 0; - SDOperand Lo, Hi; + case Expand: + unsigned IncrementSize = 0; + SDOperand Lo, Hi; - // If this is a vector type, then we have to calculate the increment as - // the product of the element size in bytes, and the number of elements - // in the high half of the vector. - if (Node->getOperand(1).getValueType() == MVT::Vector) { - SDNode *InVal = Node->getOperand(1).Val; - unsigned NumElems = - cast<ConstantSDNode>(*(InVal->op_end()-2))->getValue(); - MVT::ValueType EVT = cast<VTSDNode>(*(InVal->op_end()-1))->getVT(); - - // Figure out if there is a Packed type corresponding to this Vector - // type. If so, convert to the packed type. - MVT::ValueType TVT = MVT::getVectorType(EVT, NumElems); - if (TVT != MVT::Other && TLI.isTypeLegal(TVT)) { - // Turn this into a normal store of the packed type. - Tmp3 = PackVectorOp(Node->getOperand(1), TVT); - Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, - Node->getOperand(3)); - Result = LegalizeOp(Result); - break; - } else if (NumElems == 1) { - // Turn this into a normal store of the scalar type. - Tmp3 = PackVectorOp(Node->getOperand(1), EVT); - Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, - Node->getOperand(3)); - // The scalarized value type may not be legal, e.g. it might require - // promotion or expansion. Relegalize the scalar store. - Result = LegalizeOp(Result); - break; + // If this is a vector type, then we have to calculate the increment as + // the product of the element size in bytes, and the number of elements + // in the high half of the vector. + if (ST->getValue().getValueType() == MVT::Vector) { + SDNode *InVal = ST->getValue().Val; + unsigned NumElems = + cast<ConstantSDNode>(*(InVal->op_end()-2))->getValue(); + MVT::ValueType EVT = cast<VTSDNode>(*(InVal->op_end()-1))->getVT(); + + // Figure out if there is a Packed type corresponding to this Vector + // type. If so, convert to the packed type. + MVT::ValueType TVT = MVT::getVectorType(EVT, NumElems); + if (TVT != MVT::Other && TLI.isTypeLegal(TVT)) { + // Turn this into a normal store of the packed type. + Tmp3 = PackVectorOp(Node->getOperand(1), TVT); + Result = DAG.getStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(), + ST->getSrcValueOffset()); + Result = LegalizeOp(Result); + break; + } else if (NumElems == 1) { + // Turn this into a normal store of the scalar type. + Tmp3 = PackVectorOp(Node->getOperand(1), EVT); + Result = DAG.getStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(), + ST->getSrcValueOffset()); + // The scalarized value type may not be legal, e.g. it might require + // promotion or expansion. Relegalize the scalar store. + Result = LegalizeOp(Result); + break; + } else { + SplitVectorOp(Node->getOperand(1), Lo, Hi); + IncrementSize = NumElems/2 * MVT::getSizeInBits(EVT)/8; + } } else { - SplitVectorOp(Node->getOperand(1), Lo, Hi); - IncrementSize = NumElems/2 * MVT::getSizeInBits(EVT)/8; + ExpandOp(Node->getOperand(1), Lo, Hi); + IncrementSize = MVT::getSizeInBits(Hi.getValueType())/8; + + if (!TLI.isLittleEndian()) + std::swap(Lo, Hi); } - } else { - ExpandOp(Node->getOperand(1), Lo, Hi); - IncrementSize = MVT::getSizeInBits(Hi.getValueType())/8; - if (!TLI.isLittleEndian()) - std::swap(Lo, Hi); + Lo = DAG.getStore(Tmp1, Lo, Tmp2, ST->getSrcValue(), + ST->getSrcValueOffset()); + Tmp2 = DAG.getNode(ISD::ADD, Tmp2.getValueType(), Tmp2, + getIntPtrConstant(IncrementSize)); + assert(isTypeLegal(Tmp2.getValueType()) && + "Pointers must be legal!"); + // FIXME: This sets the srcvalue of both halves to be the same, which is + // wrong. + Hi = DAG.getStore(Tmp1, Hi, Tmp2, ST->getSrcValue(), + ST->getSrcValueOffset()); + Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi); + break; + } + } else { + // Truncating store + assert(isTypeLegal(ST->getValue().getValueType()) && + "Cannot handle illegal TRUNCSTORE yet!"); + Tmp3 = LegalizeOp(ST->getValue()); + + // The only promote case we handle is TRUNCSTORE:i1 X into + // -> TRUNCSTORE:i8 (and X, 1) + if (ST->getStoredVT() == MVT::i1 && + TLI.getStoreXAction(MVT::i1) == TargetLowering::Promote) { + // Promote the bool to a mask then store. + Tmp3 = DAG.getNode(ISD::AND, Tmp3.getValueType(), Tmp3, + DAG.getConstant(1, Tmp3.getValueType())); + Result = DAG.getTruncStore(Tmp1, Tmp3, Tmp2, ST->getSrcValue(), + ST->getSrcValueOffset(), MVT::i8); + } else if (Tmp1 != ST->getChain() || Tmp3 != ST->getValue() || + Tmp2 != ST->getBasePtr()) { + Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, + ST->getOffset()); } - Lo = DAG.getStore(Tmp1, Lo, Tmp2, Node->getOperand(3)); - Tmp2 = DAG.getNode(ISD::ADD, Tmp2.getValueType(), Tmp2, - getIntPtrConstant(IncrementSize)); - assert(isTypeLegal(Tmp2.getValueType()) && - "Pointers must be legal!"); - // FIXME: This sets the srcvalue of both halves to be the same, which is - // wrong. - Hi = DAG.getStore(Tmp1, Hi, Tmp2, Node->getOperand(3)); - Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi); - break; + MVT::ValueType StVT = cast<StoreSDNode>(Result.Val)->getStoredVT(); + switch (TLI.getStoreXAction(StVT)) { + default: assert(0 && "This action is not supported yet!"); + case TargetLowering::Legal: break; + case TargetLowering::Custom: + Tmp1 = TLI.LowerOperation(Result, DAG); + if (Tmp1.Val) Result = Tmp1; + break; + } } break; } @@ -1772,42 +1806,6 @@ AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1)); return Result; - case ISD::TRUNCSTORE: { - Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - Tmp3 = LegalizeOp(Node->getOperand(2)); // Legalize the pointer. - - assert(isTypeLegal(Node->getOperand(1).getValueType()) && - "Cannot handle illegal TRUNCSTORE yet!"); - Tmp2 = LegalizeOp(Node->getOperand(1)); - - // 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.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3, - Node->getOperand(3), Node->getOperand(4)); - } - - MVT::ValueType StVT = cast<VTSDNode>(Result.Val->getOperand(4))->getVT(); - switch (TLI.getOperationAction(Result.Val->getOpcode(), StVT)) { - default: assert(0 && "This action is not supported yet!"); - case TargetLowering::Legal: break; - case TargetLowering::Custom: - Tmp1 = TLI.LowerOperation(Result, DAG); - if (Tmp1.Val) Result = Tmp1; - break; - } - break; - } case ISD::SELECT: switch (getTypeAction(Node->getOperand(0).getValueType())) { case Expand: assert(0 && "It's impossible to expand bools"); @@ -2386,7 +2384,8 @@ DAG.getConstant(MVT::getSizeInBits(VT)/8, TLI.getPointerTy())); // Store the incremented VAList to the legalized pointer - Tmp3 = DAG.getStore(VAList.getValue(1), Tmp3, Tmp2, Node->getOperand(2)); + Tmp3 = DAG.getStore(VAList.getValue(1), Tmp3, Tmp2, SV->getValue(), + SV->getOffset()); // Load the actual argument out of the pointer VAList Result = DAG.getLoad(VT, Tmp3, VAList, NULL, 0); Tmp1 = LegalizeOp(Result.getValue(1)); @@ -2423,9 +2422,11 @@ // This defaults to loading a pointer from the input and storing it to the // output, returning the chain. SrcValueSDNode *SVD = cast<SrcValueSDNode>(Node->getOperand(3)); + SrcValueSDNode *SVS = cast<SrcValueSDNode>(Node->getOperand(4)); Tmp4 = DAG.getLoad(TLI.getPointerTy(), Tmp1, Tmp3, SVD->getValue(), SVD->getOffset()); - Result = DAG.getStore(Tmp4.getValue(1), Tmp4, Tmp2, Node->getOperand(4)); + Result = DAG.getStore(Tmp4.getValue(1), Tmp4, Tmp2, SVS->getValue(), + SVS->getOffset()); break; } break; @@ -2864,9 +2865,8 @@ int SSFI = MF.getFrameInfo()->CreateStackObject((unsigned)TySize, Align); SDOperand StackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy()); - Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, DAG.getEntryNode(), - Node->getOperand(0), StackSlot, - DAG.getSrcValue(NULL), DAG.getValueType(ExtraVT)); + Result = DAG.getTruncStore(DAG.getEntryNode(), Node->getOperand(0), + StackSlot, NULL, 0, ExtraVT); Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0), Result, StackSlot, NULL, 0, ExtraVT); } else { @@ -3213,7 +3213,8 @@ DAG.getConstant(MVT::getSizeInBits(VT)/8, TLI.getPointerTy())); // Store the incremented VAList to the legalized pointer - Tmp3 = DAG.getStore(VAList.getValue(1), Tmp3, Tmp2, Node->getOperand(2)); + Tmp3 = DAG.getStore(VAList.getValue(1), Tmp3, Tmp2, SV->getValue(), + SV->getOffset()); // Load the actual argument out of the pointer VAList Result = DAG.getExtLoad(ISD::EXTLOAD, NVT, Tmp3, VAList, NULL, 0, VT); } @@ -3351,8 +3352,7 @@ // If the target doesn't support this, store the value to a temporary // stack slot, then LOAD the scalar element back out. SDOperand StackPtr = CreateStackTemporary(Vector.getValueType()); - SDOperand Ch = DAG.getStore(DAG.getEntryNode(), - Vector, StackPtr, DAG.getSrcValue(NULL)); + SDOperand Ch = DAG.getStore(DAG.getEntryNode(), Vector, StackPtr, NULL, 0); // Add the offset to the index. unsigned EltSize = MVT::getSizeInBits(Op.getValueType())/8; @@ -3495,8 +3495,7 @@ SDOperand FIPtr = CreateStackTemporary(DestVT); // Emit a store to the stack slot. - SDOperand Store = DAG.getStore(DAG.getEntryNode(), - SrcOp, FIPtr, DAG.getSrcValue(NULL)); + SDOperand Store = DAG.getStore(DAG.getEntryNode(), SrcOp, FIPtr, NULL, 0); // Result is a load from the stack slot. return DAG.getLoad(DestVT, Store, FIPtr, NULL, 0); } @@ -3506,7 +3505,7 @@ // then load the whole vector back out. SDOperand StackPtr = CreateStackTemporary(Node->getValueType(0)); SDOperand Ch = DAG.getStore(DAG.getEntryNode(), Node->getOperand(0), StackPtr, - DAG.getSrcValue(NULL)); + NULL, 0); return DAG.getLoad(Node->getValueType(0), Ch, StackPtr, NULL, 0); } @@ -3655,7 +3654,7 @@ Idx = DAG.getNode(ISD::ADD, FIPtr.getValueType(), FIPtr, Idx); Stores.push_back(DAG.getStore(DAG.getEntryNode(), Node->getOperand(i), Idx, - DAG.getSrcValue(NULL))); + NULL, 0)); } SDOperand StoreChain; @@ -3999,11 +3998,11 @@ } // store the lo of the constructed double - based on integer input SDOperand Store1 = DAG.getStore(DAG.getEntryNode(), - Op0Mapped, Lo, DAG.getSrcValue(NULL)); + Op0Mapped, Lo, NULL, 0); // initial hi portion of constructed double SDOperand InitialHi = DAG.getConstant(0x43300000u, MVT::i32); // store the hi of the constructed double - biased exponent - SDOperand Store2=DAG.getStore(Store1, InitialHi, Hi, DAG.getSrcValue(NULL)); + SDOperand Store2=DAG.getStore(Store1, InitialHi, Hi, NULL, 0); // load the constructed double SDOperand Load = DAG.getLoad(MVT::f64, Store2, StackSlot, NULL, 0); // FP constant to bias correct the final result @@ -4905,7 +4904,7 @@ SDOperand Ptr = CreateStackTemporary(Op.getOperand(0).getValueType()); SDOperand St = DAG.getStore(DAG.getEntryNode(), - Op.getOperand(0), Ptr, DAG.getSrcValue(0)); + Op.getOperand(0), Ptr, NULL, 0); MVT::ValueType EVT = cast<VTSDNode>(TypeNode)->getVT(); St = DAG.getVecLoad(NumElements, EVT, St, Ptr, DAG.getSrcValue(0)); SplitVectorOp(St, Lo, Hi); Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.349 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.350 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.349 Thu Oct 12 15:34:05 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Oct 13 16:12:22 2006 @@ -495,6 +495,14 @@ ID.AddInteger(LD->getSrcValueOffset()); ID.AddInteger(LD->getAlignment()); ID.AddInteger(LD->isVolatile()); + } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) { + ID.AddInteger(ST->getAddressingMode()); + ID.AddInteger(ST->isTruncatingStore()); + ID.AddInteger(ST->getStoredVT()); + ID.AddPointer(ST->getSrcValue()); + ID.AddInteger(ST->getSrcValueOffset()); + ID.AddInteger(ST->getAlignment()); + ID.AddInteger(ST->isVolatile()); } ID.SetOperands(Ops, NumOps); return CSEMap.FindNodeOrInsertPos(ID, InsertPos); @@ -1507,7 +1515,7 @@ // FIXME: Alignment == 1 for now. unsigned Alignment = 1; SDVTList VTs = getVTList(VT, MVT::Other); - SDOperand Undef = getNode(ISD::UNDEF, VT); + SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType()); SelectionDAGCSEMap::NodeID ID(ISD::LOAD, VTs, Chain, Ptr, Undef); ID.AddInteger(ISD::UNINDEXED); ID.AddInteger(ISD::NON_EXTLOAD); @@ -1519,8 +1527,9 @@ void *IP = 0; if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) return SDOperand(E, 0); - SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ISD::NON_EXTLOAD, VT, - SV, SVOffset, Alignment, isVolatile); + SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ISD::UNINDEXED, + ISD::NON_EXTLOAD, VT, SV, SVOffset, Alignment, + isVolatile); N->setValueTypes(VTs); CSEMap.InsertNode(N, IP); AllNodes.push_back(N); @@ -1548,7 +1557,7 @@ // FIXME: Alignment == 1 for now. unsigned Alignment = 1; SDVTList VTs = getVTList(VT, MVT::Other); - SDOperand Undef = getNode(ISD::UNDEF, VT); + SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType()); SelectionDAGCSEMap::NodeID ID(ISD::LOAD, VTs, Chain, Ptr, Undef); ID.AddInteger(ISD::UNINDEXED); ID.AddInteger(ExtType); @@ -1560,8 +1569,8 @@ void *IP = 0; if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) return SDOperand(E, 0); - SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ExtType, EVT, SV, SVOffset, - Alignment, isVolatile); + SDNode *N = new LoadSDNode(Chain, Ptr, Undef, ISD::UNINDEXED, ExtType, EVT, + SV, SVOffset, Alignment, isVolatile); N->setValueTypes(VTs); CSEMap.InsertNode(N, IP); AllNodes.push_back(N); @@ -1577,14 +1586,63 @@ } SDOperand SelectionDAG::getStore(SDOperand Chain, SDOperand Value, - SDOperand Ptr, SDOperand SV) { + SDOperand Ptr, const Value *SV, int SVOffset, + bool isVolatile) { + MVT::ValueType VT = Value.getValueType(); + + // FIXME: Alignment == 1 for now. + unsigned Alignment = 1; + SDVTList VTs = getVTList(MVT::Other); + SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType()); + SDOperand Ops[] = { Chain, Value, Ptr, Undef }; + SelectionDAGCSEMap::NodeID ID(ISD::STORE, VTs, Ops, 4); + ID.AddInteger(ISD::UNINDEXED); + ID.AddInteger(false); + ID.AddInteger(VT); + ID.AddPointer(SV); + ID.AddInteger(SVOffset); + ID.AddInteger(Alignment); + ID.AddInteger(isVolatile); + void *IP = 0; + if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) + return SDOperand(E, 0); + SDNode *N = new StoreSDNode(Chain, Value, Ptr, Undef, ISD::UNINDEXED, false, + VT, SV, SVOffset, Alignment, isVolatile); + N->setValueTypes(VTs); + CSEMap.InsertNode(N, IP); + AllNodes.push_back(N); + return SDOperand(N, 0); +} + +SDOperand SelectionDAG::getTruncStore(SDOperand Chain, SDOperand Value, + SDOperand Ptr, const Value *SV, + int SVOffset, MVT::ValueType SVT, + bool isVolatile) { + MVT::ValueType VT = Value.getValueType(); + bool isTrunc = VT != SVT; + + assert(VT > SVT && "Not a truncation?"); + assert(MVT::isInteger(VT) == MVT::isInteger(SVT) && + "Can't do FP-INT conversion!"); + + // FIXME: Alignment == 1 for now. + unsigned Alignment = 1; SDVTList VTs = getVTList(MVT::Other); - SDOperand Ops[] = { Chain, Value, Ptr, SV }; + SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType()); + SDOperand Ops[] = { Chain, Value, Ptr, Undef }; SelectionDAGCSEMap::NodeID ID(ISD::STORE, VTs, Ops, 4); + ID.AddInteger(ISD::UNINDEXED); + ID.AddInteger(isTrunc); + ID.AddInteger(SVT); + ID.AddPointer(SV); + ID.AddInteger(SVOffset); + ID.AddInteger(Alignment); + ID.AddInteger(isVolatile); void *IP = 0; if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) return SDOperand(E, 0); - SDNode *N = new SDNode(ISD::STORE, Chain, Value, Ptr, SV); + SDNode *N = new StoreSDNode(Chain, Value, Ptr, Undef, ISD::UNINDEXED, isTrunc, + SVT, SV, SVOffset, Alignment, isVolatile); N->setValueTypes(VTs); CSEMap.InsertNode(N, IP); AllNodes.push_back(N); @@ -1610,26 +1668,6 @@ switch (Opcode) { default: break; - case ISD::TRUNCSTORE: { - assert(NumOps == 5 && "TRUNCSTORE takes 5 operands!"); - MVT::ValueType EVT = cast<VTSDNode>(Ops[4])->getVT(); -#if 0 // FIXME: If the target supports EVT natively, convert to a truncate/store - // If this is a truncating store of a constant, convert to the desired type - // and store it instead. - if (isa<Constant>(Ops[0])) { - SDOperand Op = getNode(ISD::TRUNCATE, EVT, N1); - if (isa<Constant>(Op)) - N1 = Op; - } - // Also for ConstantFP? -#endif - if (Ops[0].getValueType() == EVT) // Normal store? - return getStore(Ops[0], Ops[1], Ops[2], Ops[3]); - assert(Ops[1].getValueType() > EVT && "Not a truncation?"); - assert(MVT::isInteger(Ops[1].getValueType()) == MVT::isInteger(EVT) && - "Can't do FP-INT conversion!"); - break; - } case ISD::SELECT_CC: { assert(NumOps == 5 && "SELECT_CC takes 5 operands!"); assert(Ops[0].getValueType() == Ops[1].getValueType() && @@ -2609,7 +2647,6 @@ case ISD::LOAD: return "load"; case ISD::STORE: return "store"; case ISD::VLOAD: return "vload"; - case ISD::TRUNCSTORE: return "truncstore"; case ISD::VAARG: return "vaarg"; case ISD::VACOPY: return "vacopy"; case ISD::VAEND: return "vaend"; Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.287 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.288 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.287 Tue Oct 10 23:29:42 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Oct 13 16:12:22 2006 @@ -1393,8 +1393,8 @@ Value *SrcV = I.getOperand(0); SDOperand Src = getValue(SrcV); SDOperand Ptr = getValue(I.getOperand(1)); - DAG.setRoot(DAG.getStore(getRoot(), Src, Ptr, - DAG.getSrcValue(I.getOperand(1)))); + DAG.setRoot(DAG.getStore(getRoot(), Src, Ptr, I.getOperand(1), + I.isVolatile())); } /// IntrinsicCannotAccessMemory - Return true if the specified intrinsic cannot @@ -2287,7 +2287,7 @@ for (unsigned i = 0, e = StoresToEmit.size(); i != e; ++i) OutChains.push_back(DAG.getStore(Chain, StoresToEmit[i].first, getValue(StoresToEmit[i].second), - DAG.getSrcValue(StoresToEmit[i].second))); + StoresToEmit[i].second, 0)); if (!OutChains.empty()) Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, &OutChains[0], OutChains.size()); @@ -2864,7 +2864,7 @@ SDOperand Value = getMemsetValue(Op2, VT, DAG); SDOperand Store = DAG.getStore(getRoot(), Value, getMemBasePlusOffset(Op1, Offset, DAG, TLI), - DAG.getSrcValue(I.getOperand(1), Offset)); + I.getOperand(1), Offset); OutChains.push_back(Store); Offset += VTSize; } @@ -2910,7 +2910,7 @@ Store = DAG.getStore(Chain, Value, getMemBasePlusOffset(Op1, DstOff, DAG, TLI), - DAG.getSrcValue(I.getOperand(1), DstOff)); + I.getOperand(1), DstOff); } else { Value = DAG.getLoad(VT, getRoot(), getMemBasePlusOffset(Op2, SrcOff, DAG, TLI), @@ -2919,7 +2919,7 @@ Store = DAG.getStore(Chain, Value, getMemBasePlusOffset(Op1, DstOff, DAG, TLI), - DAG.getSrcValue(I.getOperand(1), DstOff)); + I.getOperand(1), DstOff); } OutChains.push_back(Store); SrcOff += VTSize; Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp diff -u llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.76 llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.77 --- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.76 Wed Oct 11 02:09:31 2006 +++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp Fri Oct 13 16:12:22 2006 @@ -28,6 +28,7 @@ // All operations default to being supported. memset(OpActions, 0, sizeof(OpActions)); memset(LoadXActions, 0, sizeof(LoadXActions)); + memset(&StoreXActions, 0, sizeof(StoreXActions)); IsLittleEndian = TD->isLittleEndian(); UsesGlobalOffsetTable = false; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits