diff options
| author | Duncan Sands <baldrick@free.fr> | 2008-02-27 08:53:44 +0000 |
|---|---|---|
| committer | Duncan Sands <baldrick@free.fr> | 2008-02-27 08:53:44 +0000 |
| commit | 96658d018997333feadc5bca031d79bbe5da708f (patch) | |
| tree | 93910404ce2180e9c6804034123e76877dcc3147 /llvm/lib | |
| parent | a1523a38f9d4991bcbd90be9b30e19fe94f2332f (diff) | |
| download | llvm-96658d018997333feadc5bca031d79bbe5da708f.zip llvm-96658d018997333feadc5bca031d79bbe5da708f.tar.gz llvm-96658d018997333feadc5bca031d79bbe5da708f.tar.bz2 | |
Support for legalizing MEMBARRIER.
llvm-svn: 47667
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 1 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp | 13 |
3 files changed, 19 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 32b2101..d34d209 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1140,8 +1140,11 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { case TargetLowering::Legal: { SDOperand Ops[6]; Ops[0] = LegalizeOp(Node->getOperand(0)); // Legalize the chain. - for (int x = 1; x < 6; ++x) - Ops[x] = PromoteOp(Node->getOperand(x)); + for (int x = 1; x < 6; ++x) { + Ops[x] = Node->getOperand(x); + if (!isTypeLegal(Ops[x].getValueType())) + Ops[x] = PromoteOp(Ops[x]); + } Result = DAG.UpdateNodeOperands(Result, &Ops[0], 6); break; } diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h index 7e8ea66..1947673 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h @@ -190,6 +190,7 @@ private: SDOperand PromoteOperand_FP_EXTEND(SDNode *N); SDOperand PromoteOperand_FP_ROUND(SDNode *N); SDOperand PromoteOperand_INT_TO_FP(SDNode *N); + SDOperand PromoteOperand_MEMBARRIER(SDNode *N); SDOperand PromoteOperand_RET(SDNode *N, unsigned OpNo); SDOperand PromoteOperand_SELECT(SDNode *N, unsigned OpNo); SDOperand PromoteOperand_SETCC(SDNode *N, unsigned OpNo); diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp index 2ff1693..4150139 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp @@ -359,6 +359,8 @@ bool DAGTypeLegalizer::PromoteOperand(SDNode *N, unsigned OpNo) { case ISD::BUILD_VECTOR: Res = PromoteOperand_BUILD_VECTOR(N); break; case ISD::RET: Res = PromoteOperand_RET(N, OpNo); break; + + case ISD::MEMBARRIER: Res = PromoteOperand_MEMBARRIER(N); break; } // If the result is null, the sub-method took care of registering results etc. @@ -612,3 +614,14 @@ SDOperand DAGTypeLegalizer::PromoteOperand_RET(SDNode *N, unsigned OpNo) { return DAG.UpdateNodeOperands(SDOperand (N, 0), &NewValues[0], NewValues.size()); } + +SDOperand DAGTypeLegalizer::PromoteOperand_MEMBARRIER(SDNode *N) { + SDOperand NewOps[6]; + NewOps[0] = N->getOperand(0); + for (unsigned i = 1; i < array_lengthof(NewOps); ++i) { + SDOperand Flag = GetPromotedOp(N->getOperand(i)); + NewOps[i] = DAG.getZeroExtendInReg(Flag, MVT::i1); + } + return DAG.UpdateNodeOperands(SDOperand (N, 0), NewOps, + array_lengthof(NewOps)); +} |
