diff options
| author | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2007-02-13 13:50:08 +0000 |
|---|---|---|
| committer | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2007-02-13 13:50:08 +0000 |
| commit | 9956dcffbe87dcf1ba9450d87f48f88bff0a927d (patch) | |
| tree | fec75d4b860bbc7a809900b26032a106d1a0172a /llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | |
| parent | 16c6b85c789dd97666f34240d45beeeacd08da6e (diff) | |
| download | bcm5719-llvm-9956dcffbe87dcf1ba9450d87f48f88bff0a927d.tar.gz bcm5719-llvm-9956dcffbe87dcf1ba9450d87f48f88bff0a927d.zip | |
Add "original alignment" to function arguments flags.
llvm-svn: 34240
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 0dd762e58d2..4804db7534d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2933,8 +2933,13 @@ TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { MVT::ValueType VT = getValueType(I->getType()); bool isInReg = FTy->paramHasAttr(j, FunctionType::InRegAttribute); bool isSRet = FTy->paramHasAttr(j, FunctionType::StructRetAttribute); - unsigned Flags = (isInReg << 1) | (isSRet << 2); - + unsigned OriginalAlignment = + getTargetData()->getTypeAlignmentABI(I->getType()); + //Flags[31:27]-> OriginalAlignment + //Flags[2] -> isSRet + //Flags[1] -> isInReg + unsigned Flags = (isInReg << 1) | (isSRet << 2) | (OriginalAlignment << 27); + switch (getTypeAction(VT)) { default: assert(0 && "Unknown type action!"); case Legal: @@ -2954,6 +2959,8 @@ TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { unsigned NumVals = getNumElements(VT); for (unsigned i = 0; i != NumVals; ++i) { RetVals.push_back(NVT); + //if it isn't first piece, alignment must be 1 + if (i == 1) Flags = (Flags & 0x07ffffff) | (1 << 27); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); } } else { @@ -3053,11 +3060,16 @@ TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { /// ExpandScalarCallArgs - Recursively expand call argument node by /// bit_converting it or extract a pair of elements from the larger node. static void ExpandScalarCallArgs(MVT::ValueType VT, SDOperand Arg, - unsigned Flags, + unsigned Flags, SmallVector<SDOperand, 32> &Ops, SelectionDAG &DAG, - TargetLowering &TLI) { + TargetLowering &TLI, + bool isFirst = true) { + if (TLI.getTypeAction(VT) != TargetLowering::Expand) { + //if it isn't first piece, alignment must be 1 + if (!isFirst) + Flags = (Flags & 0x07ffffff) | (1 << 27); Ops.push_back(Arg); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); return; @@ -3067,7 +3079,7 @@ static void ExpandScalarCallArgs(MVT::ValueType VT, SDOperand Arg, unsigned NumVals = MVT::getSizeInBits(VT) / MVT::getSizeInBits(EVT); if (NumVals == 1) { Arg = DAG.getNode(ISD::BIT_CONVERT, EVT, Arg); - ExpandScalarCallArgs(EVT, Arg, Flags, Ops, DAG, TLI); + ExpandScalarCallArgs(EVT, Arg, Flags, Ops, DAG, TLI, isFirst); } else if (NumVals == 2) { SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, EVT, Arg, DAG.getConstant(0, TLI.getPointerTy())); @@ -3075,8 +3087,8 @@ static void ExpandScalarCallArgs(MVT::ValueType VT, SDOperand Arg, DAG.getConstant(1, TLI.getPointerTy())); if (!TLI.isLittleEndian()) std::swap(Lo, Hi); - ExpandScalarCallArgs(EVT, Lo, Flags, Ops, DAG, TLI); - ExpandScalarCallArgs(EVT, Hi, Flags, Ops, DAG, TLI); + ExpandScalarCallArgs(EVT, Lo, Flags, Ops, DAG, TLI, isFirst); + ExpandScalarCallArgs(EVT, Hi, Flags, Ops, DAG, TLI, false); } else { // Value scalarized into many values. Unimp for now. assert(0 && "Cannot expand i64 -> i16 yet!"); @@ -3106,11 +3118,19 @@ TargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy, SDOperand Op = Args[i].Node; bool isSigned = Args[i].isSigned; bool isInReg = Args[i].isInReg; - bool isSRet = Args[i].isSRet; - unsigned Flags = (isSRet << 2) | (isInReg << 1) | isSigned; + bool isSRet = Args[i].isSRet; + unsigned OriginalAlignment = + getTargetData()->getTypeAlignmentABI(Args[i].Ty); + //Flags[31:27]-> OriginalAlignment + //Flags[2] -> isSRet + //Flags[1] -> isInReg + //Flags[0] -> isSigned + unsigned Flags = (isSRet << 2) | (isInReg << 1) | isSigned | + (OriginalAlignment << 27); + switch (getTypeAction(VT)) { default: assert(0 && "Unknown type action!"); - case Legal: + case Legal: Ops.push_back(Op); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); break; |

