diff options
author | Duncan Sands <baldrick@free.fr> | 2008-02-15 19:34:17 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-02-15 19:34:17 +0000 |
commit | ca3a56f2fbde4132e405ead4edadc3570b209386 (patch) | |
tree | d4a14ea76415ec7dd99ef76f7be0c6088f1309f1 /lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp | |
parent | ec321b4d64ee02a1b90021c09d9513618787c6e8 (diff) |
Teach LegalizeTypes how to promote the flags
in a ret node. These are created as i32 constants
but on some platforms i32 is not legal. This
fixes 26 "make check" failures, for example
Alpha/2005-07-12-TwoMallocCalls.ll.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47172 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp b/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp index 3dab01a981..870501c9a7 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeTypesPromote.cpp @@ -340,8 +340,10 @@ bool DAGTypeLegalizer::PromoteOperand(SDNode *N, unsigned OpNo) { case ISD::MEMSET: case ISD::MEMCPY: case ISD::MEMMOVE: Res = HandleMemIntrinsic(N); break; + + case ISD::RET: Res = PromoteOperand_RET(N, OpNo); break; } - + // If the result is null, the sub-method took care of registering results etc. if (!Res.Val) return false; // If the result is N, the sub-method updated N in place. @@ -524,3 +526,27 @@ SDOperand DAGTypeLegalizer::PromoteOperand_STORE(StoreSDNode *N, unsigned OpNo){ SVOffset, N->getMemoryVT(), isVolatile, Alignment); } + +SDOperand DAGTypeLegalizer::PromoteOperand_RET(SDNode *N, unsigned OpNo) { + assert(!(OpNo & 1) && "Return values should be legally typed!"); + assert((N->getNumOperands() & 1) && "Wrong number of operands!"); + + // It's a flag. Promote all the flags in one hit, as an optimization. + SmallVector<SDOperand, 8> NewValues(N->getNumOperands()); + NewValues[0] = N->getOperand(0); // The chain + for (unsigned i = 1, e = N->getNumOperands(); i < e; i += 2) { + // The return value. + NewValues[i] = N->getOperand(i); + + // The flag. + SDOperand Flag = N->getOperand(i + 1); + if (getTypeAction(Flag.getValueType()) == Promote) + // The promoted value may have rubbish in the new bits, but that + // doesn't matter because those bits aren't queried anyway. + Flag = GetPromotedOp(Flag); + NewValues[i + 1] = Flag; + } + + return DAG.UpdateNodeOperands(SDOperand (N, 0), + &NewValues[0], NewValues.size()); +} |