Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Hi Evan, +/// propagateEHRegister - The specified EH register is required in a successor +/// of the EH landing pad. Propagate it (by adding it to livein) to all the +/// blocks in the paths between the landing pad and the specified block. thanks for this fix. For the moment we don't really need this much generality: due to other problems (PR1508) we don't even try to handle the case where the exception handling intrinsics are neither in the landing pad nor in an immediate successor of the landing pad (we assert if this occurs). Thus the attached minimal fix is good enough until PR1508 is resolved (shall I commit it?). Also, I can't help feeling that the right way to solve the problem of reading the exception register in some block potentially far away from the landing pad is: (1) add code to the landing pad that writes the physical register to a virtual register; (2) turn the eh.exception intrinsic into a read from the virtual register. The problem is that we are in ssa form during codegen, so doing this means inserting phi nodes etc for the virtual register. Ciao, Duncan. Index: lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp === RCS file: /var/cvs/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp,v retrieving revision 1.474 diff -u -3 -p -r1.474 SelectionDAGISel.cpp --- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp 29 Jun 2007 03:42:22 - 1.474 +++ lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp 29 Jun 2007 08:19:49 - @@ -2336,25 +2336,6 @@ static void addCatchInfo(CallInst I, Ma MMI-addCatchTypeInfo(MBB, TyInfo); } -/// propagateEHRegister - The specified EH register is required in a successor -/// of the EH landing pad. Propagate it (by adding it to livein) to all the -/// blocks in the paths between the landing pad and the specified block. -static void propagateEHRegister(MachineBasicBlock *MBB, unsigned EHReg, -SmallPtrSetMachineBasicBlock*, 8 Visited) { - if (MBB-isLandingPad() || !Visited.insert(MBB)) -return; - - MBB-addLiveIn(EHReg); - for (MachineBasicBlock::pred_iterator PI = MBB-pred_begin(), - E = MBB-pred_end(); PI != E; ++PI) -propagateEHRegister(*PI, EHReg, Visited); -} - -static void propagateEHRegister(MachineBasicBlock *MBB, unsigned EHReg) { - SmallPtrSetMachineBasicBlock*, 8 Visited; - propagateEHRegister(MBB, EHReg, Visited); -} - /// visitIntrinsicCall - Lower the call to the specified intrinsic function. If /// we want to emit this as a call to a named external function, return the name /// otherwise lower it and return null. @@ -2465,9 +2446,11 @@ SelectionDAGLowering::visitIntrinsicCall case Intrinsic::eh_exception: { if (ExceptionHandling) { - if (!CurMBB-isLandingPad() TLI.getExceptionAddressRegister()) - propagateEHRegister(CurMBB, TLI.getExceptionAddressRegister()); - + if (!CurMBB-isLandingPad()) { +// FIXME: Mark exception register as live in. Hack for PR1508. +unsigned Reg = TLI.getExceptionAddressRegister(); +if (Reg) CurMBB-addLiveIn(Reg); + } // Insert the EXCEPTIONADDR instruction. SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); SDOperand Ops[1]; @@ -2492,8 +2475,9 @@ SelectionDAGLowering::visitIntrinsicCall #ifndef NDEBUG FuncInfo.CatchInfoLost.insert(I); #endif -if (TLI.getExceptionSelectorRegister()) - propagateEHRegister(CurMBB, TLI.getExceptionSelectorRegister()); +// FIXME: Mark exception selector register as live in. Hack for PR1508. +unsigned Reg = TLI.getExceptionSelectorRegister(); +if (Reg) CurMBB-addLiveIn(Reg); } // Insert the EHSELECTION instruction. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
On 2007-06-28, at 23:37, David A. Greene wrote: On Thursday 28 June 2007 21:51, Nick Lewycky wrote: David Greene wrote: +// Cray [dag]: Must recompute end() each iteration because it may Please don't mark the comments as being from Cray. Just write the comment as a standard explanation. Ok, will fix. Just wanted to take responsibility for screw-ups. :) svn blame will know your name. ;) — Gordon ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp TargetLowering.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.471 - 1.472 TargetLowering.cpp updated: 1.123 - 1.124 --- Log message: Add new TargetLowering code to provide the final register type that an illegal value type will be transformed to, for code that needs the register type after all transformations instead of just after the first transformation. Factor out the code that uses this information to do copy-from-regs and copy-to-regs for various purposes into separate functions so that they are done consistently. --- Diffs of the changes: (+355 -453) SelectionDAGISel.cpp | 642 ++- TargetLowering.cpp | 166 + 2 files changed, 355 insertions(+), 453 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.471 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.472 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.471Wed Jun 27 13:45:32 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jun 28 18:29:44 2007 @@ -90,7 +90,7 @@ /// This is needed because values can be promoted into larger registers and /// expanded into multiple smaller registers than the value. struct VISIBILITY_HIDDEN RegsForValue { -/// Regs - This list hold the register (for legal and promoted values) +/// Regs - This list holds the register (for legal and promoted values) /// or register set (for expanded values) that the value should be assigned /// to. std::vectorunsigned Regs; @@ -117,15 +117,16 @@ /// getCopyFromRegs - Emit a series of CopyFromReg nodes that copies from /// this value and returns the result as a ValueVT value. This uses /// Chain/Flag as the input and updates them for the output Chain/Flag. +/// If the Flag pointer is NULL, no flag is used. SDOperand getCopyFromRegs(SelectionDAG DAG, - SDOperand Chain, SDOperand Flag) const; + SDOperand Chain, SDOperand *Flag) const; /// getCopyToRegs - Emit a series of CopyToReg nodes that copies the /// specified value into the registers specified by this object. This uses /// Chain/Flag as the input and updates them for the output Chain/Flag. +/// If the Flag pointer is NULL, no flag is used. void getCopyToRegs(SDOperand Val, SelectionDAG DAG, - SDOperand Chain, SDOperand Flag, - MVT::ValueType PtrVT) const; + SDOperand Chain, SDOperand *Flag) const; /// AddInlineAsmOperands - Add this value to the specified inlineasm node /// operand list. This adds the code marker and includes the number of @@ -306,15 +307,8 @@ unsigned FunctionLoweringInfo::CreateRegForValue(const Value *V) { MVT::ValueType VT = TLI.getValueType(V-getType()); - unsigned NumRegisters; - MVT::ValueType RegisterVT; - if (MVT::isVector(VT)) { -MVT::ValueType ElementVT; -NumRegisters = TLI.getVectorTypeBreakdown(VT, ElementVT, RegisterVT); - } else { -RegisterVT = TLI.getTypeToTransformTo(VT); -NumRegisters = TLI.getNumRegisters(VT); - } + unsigned NumRegisters = TLI.getNumRegisters(VT); + MVT::ValueType RegisterVT = TLI.getRegisterType(VT); unsigned R = MakeReg(RegisterVT); for (unsigned i = 1; i != NumRegisters; ++i) @@ -695,79 +689,17 @@ unsigned InReg = FuncInfo.ValueMap[V]; assert(InReg Value not in map!); - // If this type is not legal, make it so now. - if (!MVT::isVector(VT)) { -if (TLI.getTypeAction(VT) == TargetLowering::Expand) { - // Source must be expanded. This input value is actually coming from the - // register pair InReg and InReg+1. - MVT::ValueType DestVT = TLI.getTypeToExpandTo(VT); - unsigned NumVals = TLI.getNumRegisters(VT); - N = DAG.getCopyFromReg(DAG.getEntryNode(), InReg, DestVT); - if (NumVals == 1) -N = DAG.getNode(ISD::BIT_CONVERT, VT, N); - else { -assert(NumVals == 2 1 to 4 (and more) expansion not implemented!); -N = DAG.getNode(ISD::BUILD_PAIR, VT, N, -DAG.getCopyFromReg(DAG.getEntryNode(), InReg+1, DestVT)); - } -} else { - MVT::ValueType DestVT = TLI.getTypeToTransformTo(VT); - N = DAG.getCopyFromReg(DAG.getEntryNode(), InReg, DestVT); - if (TLI.getTypeAction(VT) == TargetLowering::Promote) // Promotion case -N = MVT::isFloatingPoint(VT) - ? DAG.getNode(ISD::FP_ROUND, VT, N) - : DAG.getNode(ISD::TRUNCATE, VT, N); -} - } else { -// Otherwise, if this is a vector, make it available as a vector -// here. -MVT::ValueType ElementVT, LegalElementVT; -unsigned NE = TLI.getVectorTypeBreakdown(VT, ElementVT, - LegalElementVT); - -// Build a BUILD_VECTOR or CONCAT_VECTORS with the input registers. -
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.472 - 1.473 --- Log message: Fix reference to cached end iterator invalidated by an erase operation. Uncovered by _GLIBCXX_DEBUG. --- Diffs of the changes: (+3 -1) SelectionDAGISel.cpp |4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.472 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.473 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.472Thu Jun 28 18:29:44 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jun 28 21:49:11 2007 @@ -1700,7 +1700,9 @@ // Merge case into clusters if (Cases.size()=2) -for (CaseItr I=Cases.begin(), J=++(Cases.begin()), E=Cases.end(); J!=E; ) { +// Cray [dag]: Must recompute end() each iteration because it may +// be invalidated by erase if we hold on to it +for (CaseItr I=Cases.begin(), J=++(Cases.begin()); J!=Cases.end(); ) { int64_t nextValue = castConstantInt(J-Low)-getSExtValue(); int64_t currentValue = castConstantInt(I-High)-getSExtValue(); MachineBasicBlock* nextBB = J-BB; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
David Greene wrote: +// Cray [dag]: Must recompute end() each iteration because it may Please don't mark the comments as being from Cray. Just write the comment as a standard explanation. Nick ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp ScheduleDAGRRList.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.473 - 1.474 ScheduleDAGRRList.cpp updated: 1.32 - 1.33 --- Log message: Remove unnecessary attributions in comments. --- Diffs of the changes: (+3 -3) ScheduleDAGRRList.cpp |2 +- SelectionDAGISel.cpp |4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.473 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.474 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.473Thu Jun 28 21:49:11 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jun 28 22:42:22 2007 @@ -1700,8 +1700,8 @@ // Merge case into clusters if (Cases.size()=2) -// Cray [dag]: Must recompute end() each iteration because it may -// be invalidated by erase if we hold on to it +// Must recompute end() each iteration because it may be +// invalidated by erase if we hold on to it for (CaseItr I=Cases.begin(), J=++(Cases.begin()); J!=Cases.end(); ) { int64_t nextValue = castConstantInt(J-Low)-getSExtValue(); int64_t currentValue = castConstantInt(I-High)-getSExtValue(); Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp:1.32 llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp:1.33 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp:1.32Thu Jun 28 21:48:09 2007 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp Thu Jun 28 22:42:23 2007 @@ -618,7 +618,7 @@ bool LIsTarget = left-Node-isTargetOpcode(); bool RIsTarget = right-Node-isTargetOpcode(); - // Cray: There used to be a special tie breaker here that looked for + // There used to be a special tie breaker here that looked for // two-address instructions and preferred the instruction with a // defuse operand. The special case triggered diagnostics when // _GLIBCXX_DEBUG was enabled because it broke the strict weak ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.469 - 1.470 --- Log message: Use getVectorTypeBreakdown in FunctionLoweringInfo::CreateRegForValue to compute the number and type of registers needed for vector values instead of computing it manually. This fixes PR1529: http://llvm.org/PR1529 . --- Diffs of the changes: (+11 -44) SelectionDAGISel.cpp | 55 ++- 1 files changed, 11 insertions(+), 44 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.469 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.470 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.469Mon Jun 25 11:23:39 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Jun 27 09:34:07 2007 @@ -306,53 +306,20 @@ unsigned FunctionLoweringInfo::CreateRegForValue(const Value *V) { MVT::ValueType VT = TLI.getValueType(V-getType()); - // The number of multiples of registers that we need, to, e.g., split up - // a 2 x int64 - 4 x i32 registers. - unsigned NumVectorRegs = 1; - - // If this is a vector type, figure out what type it will decompose into - // and how many of the elements it will use. + unsigned NumRegisters; + MVT::ValueType RegisterVT; if (MVT::isVector(VT)) { -const VectorType *PTy = castVectorType(V-getType()); -unsigned NumElts = PTy-getNumElements(); -MVT::ValueType EltTy = TLI.getValueType(PTy-getElementType()); -MVT::ValueType VecTy = MVT::getVectorType(EltTy, NumElts); - -// Divide the input until we get to a supported size. This will always -// end with a scalar if the target doesn't support vectors. -while (NumElts 1 !TLI.isTypeLegal(VecTy)) { - NumElts = 1; - NumVectorRegs = 1; - VecTy = MVT::getVectorType(EltTy, NumElts); -} - -// Check that VecTy isn't a 1-element vector. -if (NumElts == 1 VecTy == MVT::Other) - VT = EltTy; -else - VT = VecTy; +MVT::ValueType ElementVT; +NumRegisters = TLI.getVectorTypeBreakdown(VT, ElementVT, RegisterVT); + } else { +RegisterVT = TLI.getTypeToTransformTo(VT); +NumRegisters = TLI.getNumRegisters(VT); } - // The common case is that we will only create one register for this - // value. If we have that case, create and return the virtual register. - unsigned NV = TLI.getNumRegisters(VT); - if (NV == 1) { -// If we are promoting this value, pick the next largest supported type. -MVT::ValueType PromotedType = TLI.getTypeToTransformTo(VT); -unsigned Reg = MakeReg(PromotedType); -// If this is a vector of supported or promoted types (e.g. 4 x i16), -// create all of the registers. -for (unsigned i = 1; i != NumVectorRegs; ++i) - MakeReg(PromotedType); -return Reg; - } - - // If this value is represented with multiple target registers, make sure - // to create enough consecutive registers of the right (smaller) type. - VT = TLI.getTypeToExpandTo(VT); - unsigned R = MakeReg(VT); - for (unsigned i = 1; i != NV*NumVectorRegs; ++i) -MakeReg(VT); + unsigned R = MakeReg(RegisterVT); + for (unsigned i = 1; i != NumRegisters; ++i) +MakeReg(RegisterVT); + return R; } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.470 - 1.471 --- Log message: Partial fix for PR1502: http://llvm.org/PR1502 : If a EH register is needed in a successor of landing pad, add it as livein to all the blocks in the paths between the landing pad and the specified block. --- Diffs of the changes: (+34 -11) SelectionDAGISel.cpp | 45 ++--- 1 files changed, 34 insertions(+), 11 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.470 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.471 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.470Wed Jun 27 09:34:07 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Jun 27 13:45:32 2007 @@ -2402,6 +2402,25 @@ MMI-addCatchTypeInfo(MBB, TyInfo); } +/// propagateEHRegister - The specified EH register is required in a successor +/// of the EH landing pad. Propagate it (by adding it to livein) to all the +/// blocks in the paths between the landing pad and the specified block. +static void propagateEHRegister(MachineBasicBlock *MBB, unsigned EHReg, +SmallPtrSetMachineBasicBlock*, 8 Visited) { + if (MBB-isLandingPad() || !Visited.insert(MBB)) +return; + + MBB-addLiveIn(EHReg); + for (MachineBasicBlock::pred_iterator PI = MBB-pred_begin(), + E = MBB-pred_end(); PI != E; ++PI) +propagateEHRegister(*PI, EHReg, Visited); +} + +static void propagateEHRegister(MachineBasicBlock *MBB, unsigned EHReg) { + SmallPtrSetMachineBasicBlock*, 8 Visited; + propagateEHRegister(MBB, EHReg, Visited); +} + /// visitIntrinsicCall - Lower the call to the specified intrinsic function. If /// we want to emit this as a call to a named external function, return the name /// otherwise lower it and return null. @@ -2511,12 +2530,9 @@ } case Intrinsic::eh_exception: { -MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - -if (ExceptionHandling MMI) { - // Mark exception register as live in. - unsigned Reg = TLI.getExceptionAddressRegister(); - if (Reg) CurMBB-addLiveIn(Reg); +if (ExceptionHandling) { + if (!CurMBB-isLandingPad() TLI.getExceptionAddressRegister()) + propagateEHRegister(CurMBB, TLI.getExceptionAddressRegister()); // Insert the EXCEPTIONADDR instruction. SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); @@ -2538,14 +2554,13 @@ if (ExceptionHandling MMI) { if (CurMBB-isLandingPad()) addCatchInfo(I, MMI, CurMBB); + else { #ifndef NDEBUG - else FuncInfo.CatchInfoLost.insert(I); #endif - - // Mark exception selector register as live in. - unsigned Reg = TLI.getExceptionSelectorRegister(); - if (Reg) CurMBB-addLiveIn(Reg); +if (TLI.getExceptionSelectorRegister()) + propagateEHRegister(CurMBB, TLI.getExceptionSelectorRegister()); + } // Insert the EHSELECTION instruction. SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); @@ -4482,6 +4497,14 @@ DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, DAG.getEntryNode(), DAG.getConstant(LabelID, MVT::i32))); +// Mark exception register as live in. +unsigned Reg = TLI.getExceptionAddressRegister(); +if (Reg) BB-addLiveIn(Reg); + +// Mark exception selector register as live in. +Reg = TLI.getExceptionSelectorRegister(); +if (Reg) BB-addLiveIn(Reg); + // FIXME: Hack around an exception handling flaw (PR1508): the personality // function and list of typeids logically belong to the invoke (or, if you // like, the basic block containing the invoke), and need to be associated ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp TargetLowering.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.466 - 1.467 TargetLowering.cpp updated: 1.119 - 1.120 --- Log message: Rename TargetLowering::getNumElements and friends to TargetLowering::getNumRegisters and similar, to avoid confusion with the actual number of elements for vector types. --- Diffs of the changes: (+19 -19) SelectionDAGISel.cpp | 28 ++-- TargetLowering.cpp | 10 +- 2 files changed, 19 insertions(+), 19 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.466 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.467 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.466Fri Jun 15 17:26:58 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jun 21 09:42:22 2007 @@ -290,19 +290,19 @@ if (PN-use_empty()) continue; MVT::ValueType VT = TLI.getValueType(PN-getType()); - unsigned NumElements; + unsigned NumRegisters; if (VT != MVT::Vector) -NumElements = TLI.getNumElements(VT); +NumRegisters = TLI.getNumRegisters(VT); else { MVT::ValueType VT1,VT2; -NumElements = +NumRegisters = TLI.getVectorTypeBreakdown(castVectorType(PN-getType()), VT1, VT2); } unsigned PHIReg = ValueMap[PN]; assert(PHIReg PHI node does not have an assigned virtual register!); const TargetInstrInfo *TII = TLI.getTargetMachine().getInstrInfo(); - for (unsigned i = 0; i != NumElements; ++i) + for (unsigned i = 0; i != NumRegisters; ++i) BuildMI(MBB, TII-get(TargetInstrInfo::PHI), PHIReg+i); } } @@ -343,7 +343,7 @@ // The common case is that we will only create one register for this // value. If we have that case, create and return the virtual register. - unsigned NV = TLI.getNumElements(VT); + unsigned NV = TLI.getNumRegisters(VT); if (NV == 1) { // If we are promoting this value, pick the next largest supported type. MVT::ValueType PromotedType = TLI.getTypeToTransformTo(VT); @@ -750,7 +750,7 @@ // Source must be expanded. This input value is actually coming from the // register pair InReg and InReg+1. MVT::ValueType DestVT = TLI.getTypeToExpandTo(VT); - unsigned NumVals = TLI.getNumElements(VT); + unsigned NumVals = TLI.getNumRegisters(VT); N = DAG.getCopyFromReg(DAG.getEntryNode(), InReg, DestVT); if (NumVals == 1) N = DAG.getNode(ISD::BIT_CONVERT, VT, N); @@ -3185,7 +3185,7 @@ unsigned NumRegs = 1; if (OpInfo.ConstraintVT != MVT::Other) -NumRegs = TLI.getNumElements(OpInfo.ConstraintVT); +NumRegs = TLI.getNumRegisters(OpInfo.ConstraintVT); MVT::ValueType RegVT; MVT::ValueType ValueVT = OpInfo.ConstraintVT; @@ -3831,7 +3831,7 @@ // integers. Figure out what the destination type is and how many small // integers it turns into. MVT::ValueType NVT = getTypeToExpandTo(VT); -unsigned NumVals = getNumElements(VT); +unsigned NumVals = getNumRegisters(VT); for (unsigned i = 0; i != NumVals; ++i) { RetVals.push_back(NVT); // if it isn't first piece, alignment must be 1 @@ -4088,7 +4088,7 @@ // integers. Figure out what the source elt type is and how many small // integers it is. MVT::ValueType NVT = getTypeToExpandTo(VT); -unsigned NumVals = getNumElements(VT); +unsigned NumVals = getNumRegisters(VT); for (unsigned i = 0; i != NumVals; ++i) RetTys.push_back(NVT); } else { @@ -4507,7 +4507,7 @@ return DAG.getCopyToReg(getRoot(), Reg, Op); } else { DestVT = TLI.getTypeToExpandTo(SrcVT); -unsigned NumVals = TLI.getNumElements(SrcVT); +unsigned NumVals = TLI.getNumRegisters(SrcVT); if (NumVals == 1) return DAG.getCopyToReg(getRoot(), Reg, DAG.getNode(ISD::BIT_CONVERT, DestVT, Op)); @@ -4695,16 +4695,16 @@ // Remember that this register needs to added to the machine PHI node as // the input for this MBB. MVT::ValueType VT = TLI.getValueType(PN-getType()); - unsigned NumElements; + unsigned NumRegisters; if (VT != MVT::Vector) -NumElements = TLI.getNumElements(VT); +NumRegisters = TLI.getNumRegisters(VT); else { MVT::ValueType VT1,VT2; -NumElements = +NumRegisters = TLI.getVectorTypeBreakdown(castVectorType(PN-getType()), VT1, VT2); } - for (unsigned i = 0, e = NumElements; i != e; ++i) + for (unsigned i = 0, e = NumRegisters; i != e; ++i) PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg+i)); } } Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp diff -u
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.463 - 1.464 --- Log message: Workaround for PR1508: http://llvm.org/PR1508 . --- Diffs of the changes: (+96 -29) SelectionDAGISel.cpp | 125 +++ 1 files changed, 96 insertions(+), 29 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.463 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.464 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.463Thu Jun 14 17:58:02 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Jun 15 14:04:19 2007 @@ -179,6 +179,11 @@ /// anywhere in the function. std::mapconst AllocaInst*, int StaticAllocaMap; +#ifndef NDEBUG +SmallSetInstruction*, 8 CatchInfoLost; +SmallSetInstruction*, 8 CatchInfoFound; +#endif + unsigned MakeReg(MVT::ValueType VT) { return RegMap-createVirtualRegister(TLI.getRegClassFor(VT)); } @@ -199,6 +204,15 @@ }; } +/// isFilterOrSelector - Return true if this instruction is a call to the +/// eh.filter or the eh.selector intrinsic. +static bool isFilterOrSelector(Instruction *I) { + if (IntrinsicInst *II = dyn_castIntrinsicInst(I)) +return II-getIntrinsicID() == Intrinsic::eh_selector + || II-getIntrinsicID() == Intrinsic::eh_filter; + return false; +} + /// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by /// PHI nodes or outside of the basic block that defines it, or used by a /// switch instruction, which may expand to multiple basic blocks. @@ -2463,6 +2477,33 @@ return NULL; } +/// addCatchInfo - Extract the personality and type infos from an eh.selector +/// or eh.filter call, and add them to the specified machine basic block. +static void addCatchInfo(CallInst I, MachineModuleInfo *MMI, + MachineBasicBlock *MBB) { + // Inform the MachineModuleInfo of the personality for this landing pad. + ConstantExpr *CE = castConstantExpr(I.getOperand(2)); + assert(CE-getOpcode() == Instruction::BitCast + isaFunction(CE-getOperand(0)) + Personality should be a function); + MMI-addPersonality(MBB, castFunction(CE-getOperand(0))); + + // Gather all the type infos for this landing pad and pass them along to + // MachineModuleInfo. + std::vectorGlobalVariable * TyInfo; + for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { +Constant *C = castConstant(I.getOperand(i)); +GlobalVariable *GV = ExtractGlobalVariable(C); +assert (GV || isaConstantPointerNull(C) +TypeInfo must be a global variable or NULL); +TyInfo.push_back(GV); + } + if (I.getCalledFunction()-getIntrinsicID() == Intrinsic::eh_filter) +MMI-addFilterTypeInfo(MBB, TyInfo); + else +MMI-addCatchTypeInfo(MBB, TyInfo); +} + /// visitIntrinsicCall - Lower the call to the specified intrinsic function. If /// we want to emit this as a call to a named external function, return the name /// otherwise lower it and return null. @@ -2595,29 +2636,14 @@ case Intrinsic::eh_selector: case Intrinsic::eh_filter:{ MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - + if (ExceptionHandling MMI) { - // Inform the MachineModuleInfo of the personality for this landing pad. - ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(2)); - assert(CE CE-getOpcode() == Instruction::BitCast - isaFunction(CE-getOperand(0)) - Personality should be a function); - MMI-addPersonality(CurMBB, castFunction(CE-getOperand(0))); - - // Gather all the type infos for this landing pad and pass them along to - // MachineModuleInfo. - std::vectorGlobalVariable * TyInfo; - for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { -Constant *C = castConstant(I.getOperand(i)); -GlobalVariable *GV = ExtractGlobalVariable(C); -assert (GV || isaConstantPointerNull(C) -TypeInfo must be a global variable or NULL); -TyInfo.push_back(GV); - } - if (Intrinsic == Intrinsic::eh_filter) -MMI-addFilterTypeInfo(CurMBB, TyInfo); + if (CurMBB-isLandingPad()) +addCatchInfo(I, MMI, CurMBB); +#ifndef NDEBUG else -MMI-addCatchTypeInfo(CurMBB, TyInfo); +FuncInfo.CatchInfoLost.insert(I); +#endif // Mark exception selector register as live in. unsigned Reg = TLI.getExceptionSelectorRegister(); @@ -4403,6 +4429,11 @@ E = MF.livein_end(); I != E; ++I) BB-addLiveIn(I-first); +#ifndef NDEBUG + assert(FuncInfo.CatchInfoFound.size() == FuncInfo.CatchInfoLost.size() + Not all catch info was assigned to a landing pad!); +#endif + return true; } @@ -4513,6 +4544,20 @@ EmitFunctionEntryCode(F, SDL.DAG.getMachineFunction()); } +static void copyCatchInfo(BasicBlock *SrcBB, BasicBlock *DestBB, +
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.464 - 1.465 --- Log message: Fix CodeGen/X86/inline-asm-x-scalar.ll:test4, by retaining regclass info for tied register constraints. --- Diffs of the changes: (+9 -6) SelectionDAGISel.cpp | 15 +-- 1 files changed, 9 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.464 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.465 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.464Fri Jun 15 14:04:19 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Jun 15 14:11:01 2007 @@ -3222,7 +3222,8 @@ // Otherwise, if this was a reference to an LLVM register class, create vregs // for this reference. std::vectorunsigned RegClassRegs; - if (PhysReg.second) { + const TargetRegisterClass *RC = PhysReg.second; + if (RC) { // If this is an early clobber or tied register, our regalloc doesn't know // how to maintain the constraint. If it isn't, go ahead and create vreg // and let the regalloc do the right thing. @@ -3272,11 +3273,13 @@ // Check to see if this register is allocatable (i.e. don't give out the // stack pointer). -const TargetRegisterClass *RC = isAllocatableRegister(Reg, MF, TLI, MRI); -if (!RC) { - // Make sure we find consecutive registers. - NumAllocated = 0; - continue; +if (RC == 0) { + RC = isAllocatableRegister(Reg, MF, TLI, MRI); + if (!RC) {// Couldn't allocate this register. +// Reset NumAllocated to make sure we return consecutive registers. +NumAllocated = 0; +continue; + } } // Okay, this register is good, we can use it. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.465 - 1.466 --- Log message: Codegen support (stripped out) for the annotate attribute. --- Diffs of the changes: (+4 -0) SelectionDAGISel.cpp |4 1 files changed, 4 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.465 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.466 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.465Fri Jun 15 14:11:01 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Jun 15 17:26:58 2007 @@ -2774,6 +2774,10 @@ case Intrinsic::prefetch: // FIXME: Currently discarding prefetches. return 0; + + case Intrinsic::var_annotation: +// Discard annotate attributes +return 0; } } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.459 - 1.460 --- Log message: When creating CopyFromReg nodes, always use legal types. And use the correct types for the result vector, even though it is currently bitcasted to a different type immediately. --- Diffs of the changes: (+6 -6) SelectionDAGISel.cpp | 12 ++-- 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.459 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.460 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.459Wed Jun 13 00:51:31 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Jun 13 09:55:16 2007 @@ -772,7 +772,7 @@ // If the register was promoted, use TRUNCATE or FP_ROUND as appropriate. for (unsigned i = 0; i != NE; ++i) { SDOperand Op = DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, - PTyElementVT); + PTyLegalElementVT); if (MVT::isFloatingPoint(PTyElementVT)) Op = DAG.getNode(ISD::FP_ROUND, PTyElementVT, Op); else @@ -782,17 +782,17 @@ } else { // If the register was expanded, use BUILD_PAIR. assert((NE 1) == 0 Must expand into a multiple of 2 elements!); - for (unsigned i = 0; i != NE/2; ++i) { + for (unsigned i = 0; i != NE; ++i) { SDOperand Op0 = DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, - PTyElementVT); + PTyLegalElementVT); SDOperand Op1 = DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, - PTyElementVT); -Ops.push_back(DAG.getNode(ISD::BUILD_PAIR, VT, Op0, Op1)); + PTyLegalElementVT); +Ops.push_back(DAG.getNode(ISD::BUILD_PAIR, PTyElementVT, Op0, Op1)); } } Ops.push_back(DAG.getConstant(NE, MVT::i32)); -Ops.push_back(DAG.getValueType(PTyLegalElementVT)); +Ops.push_back(DAG.getValueType(PTyElementVT)); N = DAG.getNode(ISD::VBUILD_VECTOR, MVT::Vector, Ops[0], Ops.size()); // Finally, use a VBIT_CONVERT to make this available as the appropriate ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.458 - 1.459 --- Log message: The fix that was applied for PR1224: http://llvm.org/PR1224 stops the compiler crashing but breaks exception handling. The problem described in PR1224: http://llvm.org/PR1224 is that invoke is a terminator that can produce a value. The value may be needed in other blocks. The code that writes to registers values needed in other blocks runs before terminators are lowered (in this case invoke) so asserted because the value was not yet available. The fix that was applied was to do invoke lowering earlier, before writing values to registers. The problem this causes is that the code to copy values to registers can be output after the invoke call. If an exception is raised and control is passed to the landing pad then this copy-code will never execute. If the value is needed in some code path reached via the landing pad then that code will get something bogus. So revert the original fix and simply skip invoke values in the general copying to registers code. Instead copy the invoke value to a register in the invoke lowering code. --- Diffs of the changes: (+25 -33) SelectionDAGISel.cpp | 58 +-- 1 files changed, 25 insertions(+), 33 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.458 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.459 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.458Thu Jun 7 16:07:15 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Jun 13 00:51:31 2007 @@ -566,7 +566,6 @@ // These all get lowered before this pass. void visitInvoke(InvokeInst I); - void visitInvoke(InvokeInst I, bool AsTerminator); void visitUnwind(UnwindInst I); void visitScalarBinary(User I, unsigned OpCode); @@ -1332,29 +1331,31 @@ } void SelectionDAGLowering::visitInvoke(InvokeInst I) { - assert(0 Should never be visited directly); -} -void SelectionDAGLowering::visitInvoke(InvokeInst I, bool AsTerminator) { // Retrieve successors. MachineBasicBlock *Return = FuncInfo.MBBMap[I.getSuccessor(0)]; + MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)]; - if (!AsTerminator) { -MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)]; - -LowerCallTo(I, I.getCalledValue()-getType(), -I.getCallingConv(), -false, -getValue(I.getOperand(0)), -3, LandingPad); - -// Update successor info -CurMBB-addSuccessor(Return); -CurMBB-addSuccessor(LandingPad); - } else { -// Drop into normal successor. -DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(), -DAG.getBasicBlock(Return))); + LowerCallTo(I, I.getCalledValue()-getType(), + I.getCallingConv(), + false, + getValue(I.getOperand(0)), + 3, LandingPad); + + // If the value of the invoke is used outside of its defining block, make it + // available as a virtual register. + if (!I.use_empty()) { +DenseMapconst Value*, unsigned::iterator VMI = FuncInfo.ValueMap.find(I); +if (VMI != FuncInfo.ValueMap.end()) + DAG.setRoot(CopyValueToVirtualRegister(I, VMI-second)); } + + // Drop into normal successor. + DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(), + DAG.getBasicBlock(Return))); + + // Update successor info + CurMBB-addSuccessor(Return); + CurMBB-addSuccessor(LandingPad); } void SelectionDAGLowering::visitUnwind(UnwindInst I) { @@ -4546,15 +4547,11 @@ for (BasicBlock::iterator I = LLVMBB-begin(), E = --LLVMBB-end(); I != E; ++I) SDL.visit(*I); - - // Lower call part of invoke. - InvokeInst *Invoke = dyn_castInvokeInst(LLVMBB-getTerminator()); - if (Invoke) SDL.visitInvoke(*Invoke, false); - + // Ensure that all instructions which are used outside of their defining - // blocks are available as virtual registers. + // blocks are available as virtual registers. Invoke is handled elsewhere. for (BasicBlock::iterator I = LLVMBB-begin(), E = LLVMBB-end(); I != E;++I) -if (!I-use_empty() !isaPHINode(I)) { +if (!I-use_empty() !isaPHINode(I) !isaInvokeInst(I)) { DenseMapconst Value*, unsigned::iterator VMI =FuncInfo.ValueMap.find(I); if (VMI != FuncInfo.ValueMap.end()) UnorderedChains.push_back( @@ -4662,12 +4659,7 @@ } // Lower the terminator after the copies are emitted. - if (Invoke) { -// Just the branch part of invoke. -SDL.visitInvoke(*Invoke, true); - } else { -SDL.visit(*LLVMBB-getTerminator()); - } + SDL.visit(*LLVMBB-getTerminator()); // Copy over any CaseBlock records that may now exist due to SwitchInst // lowering, as well as any jump table information.
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.457 - 1.458 --- Log message: Do not change the size of function arguments. PR 1489: http://llvm.org/PR1489 . --- Diffs of the changes: (+9 -1) SelectionDAGISel.cpp | 10 +- 1 files changed, 9 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.457 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.458 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.457Wed Jun 6 05:05:18 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jun 7 16:07:15 2007 @@ -3993,7 +3993,15 @@ Op = DAG.getNode(ExtOp, getTypeToTransformTo(VT), Op); } else { assert(MVT::isFloatingPoint(VT) Not int or FP?); -Op = DAG.getNode(ISD::FP_EXTEND, getTypeToTransformTo(VT), Op); +// A true promotion would change the size of the argument. +// Instead, pretend this is an int. If FP objects are not +// passed the same as ints, the original type should be Legal +// and we should not get here. +Op = DAG.getNode(ISD::BIT_CONVERT, + VT==MVT::f32 ? MVT::i32 : + (VT==MVT::f64 ? MVT::i64 : + MVT::Other), + Op); } Ops.push_back(Op); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.456 - 1.457 --- Log message: Additional fix for PR1422: http://llvm.org/PR1422 : make sure the landing pad label is placed in the correct machine basic block - do not rely on the eh.exception intrinsic being in the landing pad: the loop optimizers can move it out. --- Diffs of the changes: (+26 -15) SelectionDAGISel.cpp | 41 ++--- 1 files changed, 26 insertions(+), 15 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.456 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.457 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.456Sat Jun 2 11:53:42 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Jun 6 05:05:18 2007 @@ -1337,12 +1337,10 @@ void SelectionDAGLowering::visitInvoke(InvokeInst I, bool AsTerminator) { // Retrieve successors. MachineBasicBlock *Return = FuncInfo.MBBMap[I.getSuccessor(0)]; - MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)]; - + if (!AsTerminator) { -// Mark landing pad so that it doesn't get deleted in branch folding. -LandingPad-setIsLandingPad(); - +MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)]; + LowerCallTo(I, I.getCalledValue()-getType(), I.getCallingConv(), false, @@ -2577,16 +2575,10 @@ MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); if (MMI) { - // Add a label to mark the beginning of the landing pad. Deletion of the - // landing pad can thus be detected via the MachineModuleInfo. - unsigned LabelID = MMI-addLandingPad(CurMBB); - DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, DAG.getEntryNode(), - DAG.getConstant(LabelID, MVT::i32))); - // Mark exception register as live in. unsigned Reg = TLI.getExceptionAddressRegister(); if (Reg) CurMBB-addLiveIn(Reg); - + // Insert the EXCEPTIONADDR instruction. SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); SDOperand Ops[1]; @@ -2626,7 +2618,7 @@ MMI-addFilterTypeInfo(CurMBB, TyInfo); else MMI-addCatchTypeInfo(CurMBB, TyInfo); - + // Mark exception selector register as live in. unsigned Reg = TLI.getExceptionSelectorRegister(); if (Reg) CurMBB-addLiveIn(Reg); @@ -2788,7 +2780,7 @@ Args.push_back(Entry); } - if (ExceptionHandling) { + if (ExceptionHandling MMI) { // Insert a label before the invoke call to mark the try range. This can be // used to detect deletion of the invoke via the MachineModuleInfo. BeginLabel = MMI-NextLabelID(); @@ -2805,7 +2797,7 @@ setValue(I, Result.first); DAG.setRoot(Result.second); - if (ExceptionHandling) { + if (ExceptionHandling MMI) { // Insert a label at the end of the invoke call to mark the try range. This // can be used to detect deletion of the invoke via the MachineModuleInfo. EndLabel = MMI-NextLabelID(); @@ -4387,6 +4379,13 @@ FunctionLoweringInfo FuncInfo(TLI, Fn, MF); for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) +if (InvokeInst *Invoke = dyn_castInvokeInst(I-getTerminator())) { + // Mark landing pad. + MachineBasicBlock *LandingPad = FuncInfo.MBBMap[Invoke-getSuccessor(1)]; + LandingPad-setIsLandingPad(); +} + + for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) SelectBasicBlock(I, MF, FuncInfo); // Add function live-ins to entry block live-in set. @@ -4523,6 +4522,18 @@ BB = FuncInfo.MBBMap[LLVMBB]; SDL.setCurrentBasicBlock(BB); + if (ExceptionHandling BB-isLandingPad()) { +MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); + +if (MMI) { + // Add a label to mark the beginning of the landing pad. Deletion of the + // landing pad can thus be detected via the MachineModuleInfo. + unsigned LabelID = MMI-addLandingPad(BB); + DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, DAG.getEntryNode(), + DAG.getConstant(LabelID, MVT::i32))); +} + } + // Lower all of the non-terminator instructions. for (BasicBlock::iterator I = LLVMBB-begin(), E = --LLVMBB-end(); I != E; ++I) ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.455 - 1.456 --- Log message: Integrate exception filter support and exception catch support. This simplifies the code in DwarfWriter, allows for multiple filters and makes it trivial to specify filters accompanied by cleanups or catch-all specifications (see next patch). What a deal! Patch blessed by Anton. --- Diffs of the changes: (+4 -3) SelectionDAGISel.cpp |7 --- 1 files changed, 4 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.455 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.456 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.455Fri Jun 1 03:18:30 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Jun 2 11:53:42 2007 @@ -2611,8 +2611,6 @@ isaFunction(CE-getOperand(0)) Personality should be a function); MMI-addPersonality(CurMBB, castFunction(CE-getOperand(0))); - if (Intrinsic == Intrinsic::eh_filter) -MMI-setIsFilterLandingPad(CurMBB); // Gather all the type infos for this landing pad and pass them along to // MachineModuleInfo. @@ -2624,7 +2622,10 @@ TypeInfo must be a global variable or NULL); TyInfo.push_back(GV); } - MMI-addCatchTypeInfo(CurMBB, TyInfo); + if (Intrinsic == Intrinsic::eh_filter) +MMI-addFilterTypeInfo(CurMBB, TyInfo); + else +MMI-addCatchTypeInfo(CurMBB, TyInfo); // Mark exception selector register as live in. unsigned Reg = TLI.getExceptionSelectorRegister(); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.454 - 1.455 --- Log message: Since TypeInfos are passed as i8 pointers, a NULL TypeInfo should be passed as a null i8 pointer not as a 0 i32. --- Diffs of the changes: (+2 -4) SelectionDAGISel.cpp |6 ++ 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.454 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.455 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.454Thu May 24 09:36:04 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Jun 1 03:18:30 2007 @@ -2620,8 +2620,7 @@ for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { Constant *C = castConstant(I.getOperand(i)); GlobalVariable *GV = ExtractGlobalVariable(C); -assert (GV || (isaConstantInt(C) - castConstantInt(C)-isNullValue()) +assert (GV || isaConstantPointerNull(C) TypeInfo must be a global variable or NULL); TyInfo.push_back(GV); } @@ -2653,8 +2652,7 @@ // Find the type id for the given typeinfo. Constant *C = castConstant(I.getOperand(1)); GlobalVariable *GV = ExtractGlobalVariable(C); - assert (GV || (isaConstantInt(C) - castConstantInt(C)-isNullValue()) + assert (GV || isaConstantPointerNull(C) TypeInfo must be a global variable or NULL); unsigned TypeID = MMI-getTypeIDFor(GV); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.453 - 1.454 --- Log message: Minor comment cleanups. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.453 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.454 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.453Wed May 23 06:08:31 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu May 24 09:36:04 2007 @@ -770,7 +770,7 @@ Ops.push_back(DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, PTyElementVT)); } else if (PTyElementVT PTyLegalElementVT) { - // If the register was promoted, use TRUNCATE of FP_ROUND as appropriate. + // If the register was promoted, use TRUNCATE or FP_ROUND as appropriate. for (unsigned i = 0; i != NE; ++i) { SDOperand Op = DAG.getCopyFromReg(DAG.getEntryNode(), InReg++, PTyElementVT); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.452 - 1.453 --- Log message: Mark all calls as could throw, when exceptions are enabled. Emit necessary LP info too. This fixes PR1439: http://llvm.org/PR1439 --- Diffs of the changes: (+38 -33) SelectionDAGISel.cpp | 71 +++ 1 files changed, 38 insertions(+), 33 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.452 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.453 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.452Fri May 18 12:52:13 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed May 23 06:08:31 2007 @@ -529,8 +529,9 @@ void ExportFromCurrentBlock(Value *V); void LowerCallTo(Instruction I, const Type *CalledValueTy, unsigned CallingConv, - bool IsTailCall, SDOperand Callee, unsigned OpIdx); - + bool IsTailCall, SDOperand Callee, unsigned OpIdx, + MachineBasicBlock *LandingPad = NULL); + // Terminator instructions. void visitRet(ReturnInst I); void visitBr(BranchInst I); @@ -1341,31 +1342,13 @@ if (!AsTerminator) { // Mark landing pad so that it doesn't get deleted in branch folding. LandingPad-setIsLandingPad(); - -// Insert a label before the invoke call to mark the try range. -// This can be used to detect deletion of the invoke via the -// MachineModuleInfo. -MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); -unsigned BeginLabel = MMI-NextLabelID(); -DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), -DAG.getConstant(BeginLabel, MVT::i32))); - + LowerCallTo(I, I.getCalledValue()-getType(), - I.getCallingConv(), - false, - getValue(I.getOperand(0)), - 3); - -// Insert a label before the invoke call to mark the try range. -// This can be used to detect deletion of the invoke via the -// MachineModuleInfo. -unsigned EndLabel = MMI-NextLabelID(); -DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), -DAG.getConstant(EndLabel, MVT::i32))); - -// Inform MachineModuleInfo of range. -MMI-addInvoke(LandingPad, BeginLabel, EndLabel); - +I.getCallingConv(), +false, +getValue(I.getOperand(0)), +3, LandingPad); + // Update successor info CurMBB-addSuccessor(Return); CurMBB-addSuccessor(LandingPad); @@ -2782,11 +2765,14 @@ const Type *CalledValueTy, unsigned CallingConv, bool IsTailCall, - SDOperand Callee, unsigned OpIdx) { + SDOperand Callee, unsigned OpIdx, + MachineBasicBlock *LandingPad) { const PointerType *PT = castPointerType(CalledValueTy); const FunctionType *FTy = castFunctionType(PT-getElementType()); const ParamAttrsList *Attrs = FTy-getParamAttrs(); - + MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); + unsigned BeginLabel = 0, EndLabel = 0; + TargetLowering::ArgListTy Args; TargetLowering::ArgListEntry Entry; Args.reserve(I.getNumOperands()); @@ -2803,6 +2789,14 @@ Args.push_back(Entry); } + if (ExceptionHandling) { +// Insert a label before the invoke call to mark the try range. This can be +// used to detect deletion of the invoke via the MachineModuleInfo. +BeginLabel = MMI-NextLabelID(); +DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), +DAG.getConstant(BeginLabel, MVT::i32))); + } + std::pairSDOperand,SDOperand Result = TLI.LowerCallTo(getRoot(), I.getType(), Attrs Attrs-paramHasAttr(0, ParamAttr::SExt), @@ -2811,6 +2805,17 @@ if (I.getType() != Type::VoidTy) setValue(I, Result.first); DAG.setRoot(Result.second); + + if (ExceptionHandling) { +// Insert a label at the end of the invoke call to mark the try range. This +// can be used to detect deletion of the invoke via the MachineModuleInfo. +EndLabel = MMI-NextLabelID(); +DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), +DAG.getConstant(EndLabel, MVT::i32))); + +// Inform MachineModuleInfo of range. +MMI-addInvoke(LandingPad, BeginLabel, EndLabel); + } } @@ -2871,12 +2876,12 @@ Callee = getValue(I.getOperand(0)); else Callee = DAG.getExternalSymbol(RenameFn, TLI.getPointerTy()); - + LowerCallTo(I, I.getCalledValue()-getType(), -
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.450 - 1.451 --- Log message: Fix some subtle issues handling immediate values. This fixes test/CodeGen/ARM/2007-05-14-InlineAsmCstCrash.ll --- Diffs of the changes: (+6 -3) SelectionDAGISel.cpp |9 ++--- 1 files changed, 6 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.450 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.451 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.450Wed May 9 15:07:09 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon May 14 20:33:58 2007 @@ -3448,7 +3448,8 @@ // Add information to the INLINEASM node to know about this output. unsigned ResOpType = 4/*MEM*/ | (1 3); -AsmNodeOperands.push_back(DAG.getConstant(ResOpType, MVT::i32)); +AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType, +TLI.getPointerTy())); AsmNodeOperands.push_back(OpInfo.CallOperand); break; } @@ -3540,7 +3541,8 @@ // Add information to the INLINEASM node to know about this input. unsigned ResOpType = 3 /*IMM*/ | (1 3); -AsmNodeOperands.push_back(DAG.getConstant(ResOpType, MVT::i32)); +AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType, +TLI.getPointerTy())); AsmNodeOperands.push_back(InOperandVal); break; } else if (OpInfo.ConstraintType == TargetLowering::C_Memory) { @@ -3550,7 +3552,8 @@ // Add information to the INLINEASM node to know about this input. unsigned ResOpType = 4/*MEM*/ | (1 3); -AsmNodeOperands.push_back(DAG.getConstant(ResOpType, MVT::i32)); +AsmNodeOperands.push_back(DAG.getTargetConstant(ResOpType, +TLI.getPointerTy())); AsmNodeOperands.push_back(InOperandVal); break; } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.449 - 1.450 --- Log message: Do not assert, when case range split metric is zero and JTs are not allowed: just emit binary tree in this case. This fixes PR1403: http://llvm.org/PR1403 . --- Diffs of the changes: (+12 -5) SelectionDAGISel.cpp | 17 - 1 files changed, 12 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.449 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.450 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.449Mon May 7 15:49:28 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed May 9 15:07:09 2007 @@ -1462,6 +1462,11 @@ return true; } +static inline bool areJTsAllowed(const TargetLowering TLI) { + return (TLI.isOperationLegal(ISD::BR_JT, MVT::Other) || + TLI.isOperationLegal(ISD::BRIND, MVT::Other)); +} + /// handleJTSwitchCase - Emit jumptable for current switch case range bool SelectionDAGLowering::handleJTSwitchCase(CaseRec CR, CaseRecVector WorkList, @@ -1478,9 +1483,7 @@ I!=E; ++I) TSize += I-size(); - if ((!TLI.isOperationLegal(ISD::BR_JT, MVT::Other) - !TLI.isOperationLegal(ISD::BRIND, MVT::Other)) || - TSize = 3) + if (!areJTsAllowed(TLI) || TSize = 3) return false; double Density = (double)TSize / (double)((Last - First) + 1ULL); @@ -1622,8 +1625,12 @@ LSize += J-size(); RSize -= J-size(); } - // If our case is dense we *really* should handle it earlier! - assert((FMetric 0) Should handle dense range earlier!); + if (areJTsAllowed(TLI)) { +// If our case is dense we *really* should handle it earlier! +assert((FMetric 0) Should handle dense range earlier!); + } else { +Pivot = CR.Range.first + Size/2; + } CaseRange LHSR(CR.Range.first, Pivot); CaseRange RHSR(Pivot, CR.Range.second); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.448 - 1.449 --- Log message: Parameter attributes on invoke calls were being lost due to the wrong attribute index being used. Fix proposed by Anton Korobeynikov, who asked me to implement and commit it for him. This is PR1398: http://llvm.org/PR1398 . --- Diffs of the changes: (+6 -4) SelectionDAGISel.cpp | 10 ++ 1 files changed, 6 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.448 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.449 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.448Sun May 6 15:14:21 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon May 7 15:49:28 2007 @@ -2787,10 +2787,12 @@ Value *Arg = I.getOperand(i); SDOperand ArgNode = getValue(Arg); Entry.Node = ArgNode; Entry.Ty = Arg-getType(); -Entry.isSExt = Attrs Attrs-paramHasAttr(i, ParamAttr::SExt); -Entry.isZExt = Attrs Attrs-paramHasAttr(i, ParamAttr::ZExt); -Entry.isInReg = Attrs Attrs-paramHasAttr(i, ParamAttr::InReg); -Entry.isSRet = Attrs Attrs-paramHasAttr(i, ParamAttr::StructRet); + +unsigned attrInd = i - OpIdx + 1; +Entry.isSExt = Attrs Attrs-paramHasAttr(attrInd, ParamAttr::SExt); +Entry.isZExt = Attrs Attrs-paramHasAttr(attrInd, ParamAttr::ZExt); +Entry.isInReg = Attrs Attrs-paramHasAttr(attrInd, ParamAttr::InReg); +Entry.isSRet = Attrs Attrs-paramHasAttr(attrInd, ParamAttr::StructRet); Args.push_back(Entry); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.447 - 1.448 --- Log message: Detabify --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.447 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.448 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.447Fri May 4 12:12:26 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun May 6 15:14:21 2007 @@ -2628,7 +2628,7 @@ // MachineModuleInfo. std::vectorGlobalVariable * TyInfo; for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { - Constant *C = castConstant(I.getOperand(i)); +Constant *C = castConstant(I.getOperand(i)); GlobalVariable *GV = ExtractGlobalVariable(C); assert (GV || (isaConstantInt(C) castConstantInt(C)-isNullValue()) ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.446 - 1.447 --- Log message: A bitcast of a global variable may have been constant folded to a GEP - handle this case too. --- Diffs of the changes: (+30 -26) SelectionDAGISel.cpp | 56 +++ 1 files changed, 30 insertions(+), 26 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.446 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.447 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.446Wed May 2 20:11:53 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri May 4 12:12:26 2007 @@ -2457,6 +2457,24 @@ } } +/// ExtractGlobalVariable - If C is a global variable, or a bitcast of one +/// (possibly constant folded), return it. Otherwise return NULL. +static GlobalVariable *ExtractGlobalVariable (Constant *C) { + if (GlobalVariable *GV = dyn_castGlobalVariable(C)) +return GV; + else if (ConstantExpr *CE = dyn_castConstantExpr(C)) { +if (CE-getOpcode() == Instruction::BitCast) + return dyn_castGlobalVariable(CE-getOperand(0)); +else if (CE-getOpcode() == Instruction::GetElementPtr) { + for (unsigned i = 1, e = CE-getNumOperands(); i != e; ++i) +if (!CE-getOperand(i)-isNullValue()) + return NULL; + return dyn_castGlobalVariable(CE-getOperand(0)); +} + } + return NULL; +} + /// visitIntrinsicCall - Lower the call to the specified intrinsic function. If /// we want to emit this as a call to a named external function, return the name /// otherwise lower it and return null. @@ -2610,20 +2628,12 @@ // MachineModuleInfo. std::vectorGlobalVariable * TyInfo; for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { -Constant *C = castConstant(I.getOperand(i)); -if (GlobalVariable *GV = dyn_castGlobalVariable(C)) { - TyInfo.push_back(GV); -} else if (ConstantExpr *CE = dyn_castConstantExpr(C)) { - assert(CE-getOpcode() == Instruction::BitCast - isaGlobalVariable(CE-getOperand(0)) - TypeInfo must be a global variable or NULL); - TyInfo.push_back(castGlobalVariable(CE-getOperand(0))); -} else { - ConstantInt *CI = dyn_castConstantInt(C); - assert(CI CI-isNullValue() - TypeInfo must be a global variable or NULL); - TyInfo.push_back(NULL); -} + Constant *C = castConstant(I.getOperand(i)); +GlobalVariable *GV = ExtractGlobalVariable(C); +assert (GV || (isaConstantInt(C) + castConstantInt(C)-isNullValue()) +TypeInfo must be a global variable or NULL); +TyInfo.push_back(GV); } MMI-addCatchTypeInfo(CurMBB, TyInfo); @@ -2651,18 +2661,12 @@ if (MMI) { // Find the type id for the given typeinfo. - GlobalVariable *GV = NULL; - ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(1)); - if (CE CE-getOpcode() == Instruction::BitCast - isaGlobalVariable(CE-getOperand(0))) { -GV = castGlobalVariable(CE-getOperand(0)); - } else { -ConstantInt *CI = dyn_castConstantInt(I.getOperand(1)); -assert(CI CI-getZExtValue() == 0 - TypeInfo must be a global variable typeinfo or NULL); -GV = NULL; - } - + Constant *C = castConstant(I.getOperand(1)); + GlobalVariable *GV = ExtractGlobalVariable(C); + assert (GV || (isaConstantInt(C) + castConstantInt(C)-isNullValue()) + TypeInfo must be a global variable or NULL); + unsigned TypeID = MMI-getTypeIDFor(GV); setValue(I, DAG.getConstant(TypeID, MVT::i32)); } else { ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.443 - 1.444 --- Log message: Use 'static const char' instead of 'static const int'. Due to darwin gcc bug, one version of darwin linker coalesces static const int, which defauts PassID based pass identification. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.443 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.444 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.443Tue May 1 16:15:46 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed May 2 16:39:19 2007 @@ -5012,4 +5012,4 @@ Ops.push_back(InOps.back()); } -const int SelectionDAGISel::ID = 0; +const char SelectionDAGISel::ID = 0; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.444 - 1.445 --- Log message: Properly set arguments bitwidth of EHSELECT node --- Diffs of the changes: (+2 -2) SelectionDAGISel.cpp |4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.444 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.445 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.444Wed May 2 16:39:19 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed May 2 17:15:48 2007 @@ -2632,7 +2632,7 @@ if (Reg) CurMBB-addLiveIn(Reg); // Insert the EHSELECTION instruction. - SDVTList VTs = DAG.getVTList(MVT::i32, MVT::Other); + SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); SDOperand Ops[2]; Ops[0] = getValue(I.getOperand(1)); Ops[1] = getRoot(); @@ -2640,7 +2640,7 @@ setValue(I, Op); DAG.setRoot(Op.getValue(1)); } else { - setValue(I, DAG.getConstant(0, MVT::i32)); + setValue(I, DAG.getConstant(0, TLI.getPointerTy())); } return 0; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.445 - 1.446 --- Log message: Drop 'const' --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.445 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.446 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.445Wed May 2 17:15:48 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed May 2 20:11:53 2007 @@ -5012,4 +5012,4 @@ Ops.push_back(InOps.back()); } -const char SelectionDAGISel::ID = 0; +char SelectionDAGISel::ID = 0; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.442 - 1.443 --- Log message: Do not use typeinfo to identify pass in pass manager. --- Diffs of the changes: (+2 -0) SelectionDAGISel.cpp |2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.442 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.443 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.442Mon Apr 30 16:11:17 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue May 1 16:15:46 2007 @@ -5011,3 +5011,5 @@ if (e != InOps.size()) Ops.push_back(InOps.back()); } + +const int SelectionDAGISel::ID = 0; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.439 - 1.440 --- Log message: refactor some code, no functionality change --- Diffs of the changes: (+52 -44) SelectionDAGISel.cpp | 96 +++ 1 files changed, 52 insertions(+), 44 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.439 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.440 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.439Sun Apr 29 13:58:03 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 30 12:16:27 2007 @@ -3134,44 +3134,6 @@ return RegsForValue(); } -/// getConstraintGenerality - Return an integer indicating how general CT is. -static unsigned getConstraintGenerality(TargetLowering::ConstraintType CT) { - switch (CT) { - default: assert(0 Unknown constraint type!); - case TargetLowering::C_Other: - case TargetLowering::C_Unknown: -return 0; - case TargetLowering::C_Register: -return 1; - case TargetLowering::C_RegisterClass: -return 2; - case TargetLowering::C_Memory: -return 3; - } -} - -static std::string GetMostGeneralConstraint(std::vectorstd::string C, -const TargetLowering TLI) { - assert(!C.empty() Must have at least one constraint); - if (C.size() == 1) return C[0]; - - std::string *Current = C[0]; - // If we have multiple constraints, try to pick the most general one ahead - // of time. This isn't a wonderful solution, but handles common cases. - TargetLowering::ConstraintType Flavor = TLI.getConstraintType(Current[0]); - for (unsigned j = 1, e = C.size(); j != e; ++j) { -TargetLowering::ConstraintType ThisFlavor = TLI.getConstraintType(C[j]); -if (getConstraintGenerality(ThisFlavor) -getConstraintGenerality(Flavor)) { - // This constraint letter is more general than the previous one, - // use it. - Flavor = ThisFlavor; - Current = C[j]; -} - } - return *Current; -} - namespace { /// AsmOperandInfo - This contains information for each constraint that we are /// lowering. @@ -3197,9 +3159,59 @@ ConstraintType(TargetLowering::C_Unknown), CallOperand(0,0), CallOperandVal(0), ConstraintVT(MVT::Other) { } + + void ComputeConstraintToUse(const TargetLowering TLI); }; } // end anon namespace. +/// getConstraintGenerality - Return an integer indicating how general CT is. +static unsigned getConstraintGenerality(TargetLowering::ConstraintType CT) { + switch (CT) { +default: assert(0 Unknown constraint type!); +case TargetLowering::C_Other: +case TargetLowering::C_Unknown: + return 0; +case TargetLowering::C_Register: + return 1; +case TargetLowering::C_RegisterClass: + return 2; +case TargetLowering::C_Memory: + return 3; + } +} + +void AsmOperandInfo::ComputeConstraintToUse(const TargetLowering TLI) { + assert(!Codes.empty() Must have at least one constraint); + + std::string *Current = Codes[0]; + TargetLowering::ConstraintType CurType = TLI.getConstraintType(*Current); + if (Codes.size() == 1) { // Single-letter constraints ('r') are very common. +ConstraintCode = *Current; +ConstraintType = CurType; +return; + } + + unsigned CurGenerality = getConstraintGenerality(CurType); + + // If we have multiple constraints, try to pick the most general one ahead + // of time. This isn't a wonderful solution, but handles common cases. + for (unsigned j = 1, e = Codes.size(); j != e; ++j) { +TargetLowering::ConstraintType ThisType = TLI.getConstraintType(Codes[j]); +unsigned ThisGenerality = getConstraintGenerality(ThisType); +if (ThisGenerality CurGenerality) { + // This constraint letter is more general than the previous one, + // use it. + CurType = ThisType; + Current = Codes[j]; + CurGenerality = ThisGenerality; +} + } + + ConstraintCode = *Current; + ConstraintType = CurType; +} + + /// visitInlineAsm - Handle a call to an InlineAsm object. /// void SelectionDAGLowering::visitInlineAsm(CallInst I) { @@ -3274,12 +3286,8 @@ OpInfo.ConstraintVT = OpVT; -// Compute the constraint code to use. -OpInfo.ConstraintCode = GetMostGeneralConstraint(OpInfo.Codes, TLI); - -// Compute the constraint type. -// FIXME: merge this into GetMostGeneralConstraint. -OpInfo.ConstraintType = TLI.getConstraintType(OpInfo.ConstraintCode); +// Compute the constraint code and ConstraintType to use. +OpInfo.ComputeConstraintToUse(TLI); // If this is a memory input, and if the operand is not indirect, do what we ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.440 - 1.441 --- Log message: refactor GetRegistersForValue to take OpInfo as an argument instead of various pieces of it. No functionality change. --- Diffs of the changes: (+101 -98) SelectionDAGISel.cpp | 199 +-- 1 files changed, 101 insertions(+), 98 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.440 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.441 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.440Mon Apr 30 12:16:27 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 30 12:29:31 2007 @@ -82,6 +82,8 @@ createDefaultScheduler); } // namespace +namespace { struct AsmOperandInfo; } + namespace { /// RegsForValue - This struct represents the physical registers that a /// particular value is assigned and the type information about the value. @@ -516,8 +518,7 @@ N = NewN; } - RegsForValue GetRegistersForValue(const std::string ConstrCode, -MVT::ValueType VT, + RegsForValue GetRegistersForValue(AsmOperandInfo OpInfo, bool OutReg, bool InReg, std::setunsigned OutputRegs, std::setunsigned InputRegs); @@ -3013,23 +3014,105 @@ return FoundRC; } + +namespace { +/// AsmOperandInfo - This contains information for each constraint that we are +/// lowering. +struct AsmOperandInfo : public InlineAsm::ConstraintInfo { + /// ConstraintCode - This contains the actual string for the code, like m. + std::string ConstraintCode; + + /// ConstraintType - Information about the constraint code, e.g. Register, + /// RegisterClass, Memory, Other, Unknown. + TargetLowering::ConstraintType ConstraintType; + + /// CallOperand/CallOperandval - If this is the result output operand or a + /// clobber, this is null, otherwise it is the incoming operand to the + /// CallInst. This gets modified as the asm is processed. + SDOperand CallOperand; + Value *CallOperandVal; + + /// ConstraintVT - The ValueType for the operand value. + MVT::ValueType ConstraintVT; + + AsmOperandInfo(const InlineAsm::ConstraintInfo info) +: InlineAsm::ConstraintInfo(info), + ConstraintType(TargetLowering::C_Unknown), + CallOperand(0,0), CallOperandVal(0), ConstraintVT(MVT::Other) { + } + + void ComputeConstraintToUse(const TargetLowering TLI); +}; +} // end anon namespace. + +/// getConstraintGenerality - Return an integer indicating how general CT is. +static unsigned getConstraintGenerality(TargetLowering::ConstraintType CT) { + switch (CT) { +default: assert(0 Unknown constraint type!); +case TargetLowering::C_Other: +case TargetLowering::C_Unknown: + return 0; +case TargetLowering::C_Register: + return 1; +case TargetLowering::C_RegisterClass: + return 2; +case TargetLowering::C_Memory: + return 3; + } +} + +void AsmOperandInfo::ComputeConstraintToUse(const TargetLowering TLI) { + assert(!Codes.empty() Must have at least one constraint); + + std::string *Current = Codes[0]; + TargetLowering::ConstraintType CurType = TLI.getConstraintType(*Current); + if (Codes.size() == 1) { // Single-letter constraints ('r') are very common. +ConstraintCode = *Current; +ConstraintType = CurType; +return; + } + + unsigned CurGenerality = getConstraintGenerality(CurType); + + // If we have multiple constraints, try to pick the most general one ahead + // of time. This isn't a wonderful solution, but handles common cases. + for (unsigned j = 1, e = Codes.size(); j != e; ++j) { +TargetLowering::ConstraintType ThisType = TLI.getConstraintType(Codes[j]); +unsigned ThisGenerality = getConstraintGenerality(ThisType); +if (ThisGenerality CurGenerality) { + // This constraint letter is more general than the previous one, + // use it. + CurType = ThisType; + Current = Codes[j]; + CurGenerality = ThisGenerality; +} + } + + ConstraintCode = *Current; + ConstraintType = CurType; +} + + RegsForValue SelectionDAGLowering:: -GetRegistersForValue(const std::string ConstrCode, - MVT::ValueType VT, bool isOutReg, bool isInReg, +GetRegistersForValue(AsmOperandInfo OpInfo, bool isOutReg, bool isInReg, std::setunsigned OutputRegs, std::setunsigned InputRegs) { std::pairunsigned, const TargetRegisterClass* PhysReg = -TLI.getRegForInlineAsmConstraint(ConstrCode, VT); + TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode,OpInfo.ConstraintVT); std::vectorunsigned Regs; - unsigned NumRegs = VT != MVT::Other ? TLI.getNumElements(VT) : 1; + unsigned NumRegs = 1; + if
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.441 - 1.442 --- Log message: Continue refactoring inline asm code. If there is an earlyclobber output register, preallocate all input registers and the early clobbered output. This fixes PR1357: http://llvm.org/PR1357 and CodeGen/PowerPC/2007-04-30-InlineAsmEarlyClobber.ll --- Diffs of the changes: (+108 -79) SelectionDAGISel.cpp | 187 +-- 1 files changed, 108 insertions(+), 79 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.441 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.442 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.441Mon Apr 30 12:29:31 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 30 16:11:17 2007 @@ -518,10 +518,9 @@ N = NewN; } - RegsForValue GetRegistersForValue(AsmOperandInfo OpInfo, -bool OutReg, bool InReg, -std::setunsigned OutputRegs, -std::setunsigned InputRegs); + void GetRegistersForValue(AsmOperandInfo OpInfo, bool HasEarlyClobber, +std::setunsigned OutputRegs, +std::setunsigned InputRegs); void FindMergedConditions(Value *Cond, MachineBasicBlock *TBB, MachineBasicBlock *FBB, MachineBasicBlock *CurBB, @@ -3035,6 +3034,10 @@ /// ConstraintVT - The ValueType for the operand value. MVT::ValueType ConstraintVT; + /// AssignedRegs - If this is a register or register class operand, this + /// contains the set of register corresponding to the operand. + RegsForValue AssignedRegs; + AsmOperandInfo(const InlineAsm::ConstraintInfo info) : InlineAsm::ConstraintInfo(info), ConstraintType(TargetLowering::C_Unknown), @@ -3042,6 +3045,17 @@ } void ComputeConstraintToUse(const TargetLowering TLI); + + /// MarkAllocatedRegs - Once AssignedRegs is set, mark the assigned registers + /// busy in OutputRegs/InputRegs. + void MarkAllocatedRegs(bool isOutReg, bool isInReg, + std::setunsigned OutputRegs, + std::setunsigned InputRegs) const { + if (isOutReg) + OutputRegs.insert(AssignedRegs.Regs.begin(), AssignedRegs.Regs.end()); + if (isInReg) + InputRegs.insert(AssignedRegs.Regs.begin(), AssignedRegs.Regs.end()); + } }; } // end anon namespace. @@ -3093,13 +3107,42 @@ } -RegsForValue SelectionDAGLowering:: -GetRegistersForValue(AsmOperandInfo OpInfo, bool isOutReg, bool isInReg, +void SelectionDAGLowering:: +GetRegistersForValue(AsmOperandInfo OpInfo, bool HasEarlyClobber, std::setunsigned OutputRegs, std::setunsigned InputRegs) { - std::pairunsigned, const TargetRegisterClass* PhysReg = - TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode,OpInfo.ConstraintVT); + // Compute whether this value requires an input register, an output register, + // or both. + bool isOutReg = false; + bool isInReg = false; + switch (OpInfo.Type) { + case InlineAsm::isOutput: +isOutReg = true; + +// If this is an early-clobber output, or if there is an input +// constraint that matches this, we need to reserve the input register +// so no other inputs allocate to it. +isInReg = OpInfo.isEarlyClobber || OpInfo.hasMatchingInput; +break; + case InlineAsm::isInput: +isInReg = true; +isOutReg = false; +break; + case InlineAsm::isClobber: +isOutReg = true; +isInReg = true; +break; + } + + + MachineFunction MF = DAG.getMachineFunction(); std::vectorunsigned Regs; + + // If this is a constraint for a single physreg, or a constraint for a + // register class, find it. + std::pairunsigned, const TargetRegisterClass* PhysReg = +TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode, + OpInfo.ConstraintVT); unsigned NumRegs = 1; if (OpInfo.ConstraintVT != MVT::Other) @@ -3107,7 +3150,6 @@ MVT::ValueType RegVT; MVT::ValueType ValueVT = OpInfo.ConstraintVT; - MachineFunction MF = DAG.getMachineFunction(); // If this is a constraint for a specific physical register, like {r17}, // assign it now. @@ -3137,7 +3179,9 @@ Regs.push_back(*I); } } -return RegsForValue(Regs, RegVT, ValueVT); +OpInfo.AssignedRegs = RegsForValue(Regs, RegVT, ValueVT); +OpInfo.MarkAllocatedRegs(isOutReg, isInReg, OutputRegs, InputRegs); +return; } // Otherwise, if this was a reference to an LLVM register class, create vregs @@ -3147,7 +3191,11 @@ // If this is an early clobber or tied register, our regalloc doesn't know // how to maintain the constraint. If it isn't, go ahead and create vreg // and let the
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.438 - 1.439 --- Log message: generalize aggregate handling --- Diffs of the changes: (+21 -5) SelectionDAGISel.cpp | 26 +- 1 files changed, 21 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.438 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.439 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.438Sat Apr 28 16:12:06 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Apr 29 13:58:03 2007 @@ -3248,12 +3248,28 @@ if (OpInfo.CallOperandVal) { OpInfo.CallOperand = getValue(OpInfo.CallOperandVal); const Type *OpTy = OpInfo.CallOperandVal-getType(); - if (!OpInfo.isIndirect) { -// Must be an input. -OpVT = TLI.getValueType(OpTy); - } else { -OpVT = TLI.getValueType(castPointerType(OpTy)-getElementType(),true); + // If this is an indirect operand, the operand is a pointer to the + // accessed type. + if (OpInfo.isIndirect) +OpTy = castPointerType(OpTy)-getElementType(); + + // If OpTy is not a first-class value, it may be a struct/union that we + // can tile with integers. + if (!OpTy-isFirstClassType() OpTy-isSized()) { +unsigned BitSize = TD-getTypeSizeInBits(OpTy); +switch (BitSize) { +default: break; +case 1: +case 8: +case 16: +case 32: +case 64: + OpTy = IntegerType::get(BitSize); + break; +} } + + OpVT = TLI.getValueType(OpTy, true); } OpInfo.ConstraintVT = OpVT; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.432 - 1.433 --- Log message: Fix CodeGen/Generic/2007-04-27-LargeMemObject.ll and CodeGen/Generic/2007-04-27-InlineAsm-X-Dest.ll --- Diffs of the changes: (+10 -4) SelectionDAGISel.cpp | 14 ++ 1 files changed, 10 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.432 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.433 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.432Fri Apr 27 23:05:59 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Apr 28 01:08:13 2007 @@ -3210,16 +3210,22 @@ switch (Constraints[i].Type) { case InlineAsm::isOutput: if (!Constraints[i].isIndirect) { +// The return value of the call is this value. assert(I.getType() != Type::VoidTy Bad inline asm!); OpVT = TLI.getValueType(I.getType()); } else { const Type *OpTy = I.getOperand(OpNum)-getType(); -OpVT = TLI.getValueType(castPointerType(OpTy)-getElementType()); +OpVT = TLI.getValueType(castPointerType(OpTy)-getElementType(),true); OpNum++; // Consumes a call operand. } break; case InlineAsm::isInput: - OpVT = TLI.getValueType(I.getOperand(OpNum)-getType()); + if (!Constraints[i].isIndirect) { +OpVT = TLI.getValueType(I.getOperand(OpNum)-getType()); + } else { +const Type *OpTy = I.getOperand(OpNum)-getType(); +OpVT = TLI.getValueType(castPointerType(OpTy)-getElementType(),true); + } OpNum++; // Consumes a call operand. break; case InlineAsm::isClobber: @@ -3275,8 +3281,8 @@ if (ConstraintCode.size() == 1) // not a physreg name. CTy = TLI.getConstraintType(ConstraintCode); - if (CTy == TargetLowering::C_Memory) { -// Memory output. + if (CTy != TargetLowering::C_RegisterClass) { +// Memory output, or 'other' output (e.g. 'X' constraint). SDOperand InOperandVal = getValue(I.getOperand(OpNum)); // Check that the operand (the address to store to) isn't a float. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.434 - 1.435 --- Log message: Significant refactoring of the inline asm stuff, to support future changes. No functionality change. --- Diffs of the changes: (+107 -82) SelectionDAGISel.cpp | 189 --- 1 files changed, 107 insertions(+), 82 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.434 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.435 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.434Sat Apr 28 01:42:38 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Apr 28 15:49:53 2007 @@ -3172,85 +3172,109 @@ return *Current; } +namespace { +/// AsmOperandInfo - This contains information for each constraint that we are +/// lowering. +struct AsmOperandInfo : public InlineAsm::ConstraintInfo { + /// ConstraintCode - This contains the actual string for the code, like m. + std::string ConstraintCode; + + /// CallOperand/CallOperandval - If this is the result output operand or a + /// clobber, this is null, otherwise it is the incoming operand to the + /// CallInst. This gets modified as the asm is processed. + SDOperand CallOperand; + Value *CallOperandVal; + + /// ConstraintVT - The ValueType for the operand value. + MVT::ValueType ConstraintVT; + + AsmOperandInfo(const InlineAsm::ConstraintInfo info) +: InlineAsm::ConstraintInfo(info), + CallOperand(0,0), CallOperandVal(0), ConstraintVT(MVT::Other) { + } +}; +} // end anon namespace. /// visitInlineAsm - Handle a call to an InlineAsm object. /// void SelectionDAGLowering::visitInlineAsm(CallInst I) { InlineAsm *IA = castInlineAsm(I.getOperand(0)); - - SDOperand AsmStr = DAG.getTargetExternalSymbol(IA-getAsmString().c_str(), - MVT::Other); - std::vectorInlineAsm::ConstraintInfo Constraints = IA-ParseConstraints(); - std::vectorMVT::ValueType ConstraintVTs; - - /// AsmNodeOperands - A list of pairs. The first element is a register, the - /// second is a bitfield where bit #0 is set if it is a use and bit #1 is set - /// if it is a def of that register. - std::vectorSDOperand AsmNodeOperands; - AsmNodeOperands.push_back(SDOperand()); // reserve space for input chain - AsmNodeOperands.push_back(AsmStr); + /// ConstraintOperands - Information about all of the constraints. + std::vectorAsmOperandInfo ConstraintOperands; SDOperand Chain = getRoot(); SDOperand Flag; - // We fully assign registers here at isel time. This is not optimal, but - // should work. For register classes that correspond to LLVM classes, we - // could let the LLVM RA do its thing, but we currently don't. Do a prepass - // over the constraints, collecting fixed registers that we know we can't use. std::setunsigned OutputRegs, InputRegs; - unsigned OpNum = 1; - for (unsigned i = 0, e = Constraints.size(); i != e; ++i) { -std::string ConstraintCode = - GetMostGeneralConstraint(Constraints[i].Codes, TLI); + + // Do a prepass over the constraints, canonicalizing them, and building up the + // ConstraintOperands list. + std::vectorInlineAsm::ConstraintInfo +ConstraintInfos = IA-ParseConstraints(); + unsigned OpNo = 1; + for (unsigned i = 0, e = ConstraintInfos.size(); i != e; ++i) { +ConstraintOperands.push_back(AsmOperandInfo(ConstraintInfos[i])); +AsmOperandInfo OpInfo = ConstraintOperands.back(); + +// Compute the constraint code to use. +OpInfo.ConstraintCode = GetMostGeneralConstraint(OpInfo.Codes, TLI); -MVT::ValueType OpVT; +MVT::ValueType OpVT = MVT::Other; -// Compute the value type for each operand and add it to ConstraintVTs. -switch (Constraints[i].Type) { +// Compute the value type for each operand. +switch (OpInfo.Type) { case InlineAsm::isOutput: - if (!Constraints[i].isIndirect) { -// The return value of the call is this value. + if (!OpInfo.isIndirect) { +// The return value of the call is this value. As such, there is no +// corresponding argument. assert(I.getType() != Type::VoidTy Bad inline asm!); OpVT = TLI.getValueType(I.getType()); } else { -const Type *OpTy = I.getOperand(OpNum)-getType(); -OpVT = TLI.getValueType(castPointerType(OpTy)-getElementType(),true); -OpNum++; // Consumes a call operand. +OpInfo.CallOperandVal = I.getOperand(OpNo++); } break; case InlineAsm::isInput: - if (!Constraints[i].isIndirect) { -OpVT = TLI.getValueType(I.getOperand(OpNum)-getType()); - } else { -const Type *OpTy = I.getOperand(OpNum)-getType(); -OpVT = TLI.getValueType(castPointerType(OpTy)-getElementType(),true); - } - OpNum++; // Consumes a call operand. +
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.435 - 1.436 --- Log message: merge constraint type analysis stuff together. --- Diffs of the changes: (+21 -14) SelectionDAGISel.cpp | 35 +-- 1 files changed, 21 insertions(+), 14 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.435 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.436 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.435Sat Apr 28 15:49:53 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Apr 28 16:01:43 2007 @@ -3178,6 +3178,10 @@ struct AsmOperandInfo : public InlineAsm::ConstraintInfo { /// ConstraintCode - This contains the actual string for the code, like m. std::string ConstraintCode; + + /// ConstraintType - Information about the constraint code, e.g. Register, + /// RegisterClass, Memory, Other, Unknown. + TargetLowering::ConstraintType ConstraintType; /// CallOperand/CallOperandval - If this is the result output operand or a /// clobber, this is null, otherwise it is the incoming operand to the @@ -3189,7 +3193,8 @@ MVT::ValueType ConstraintVT; AsmOperandInfo(const InlineAsm::ConstraintInfo info) -: InlineAsm::ConstraintInfo(info), +: InlineAsm::ConstraintInfo(info), + ConstraintType(TargetLowering::C_Unknown), CallOperand(0,0), CallOperandVal(0), ConstraintVT(MVT::Other) { } }; @@ -3217,9 +3222,6 @@ ConstraintOperands.push_back(AsmOperandInfo(ConstraintInfos[i])); AsmOperandInfo OpInfo = ConstraintOperands.back(); -// Compute the constraint code to use. -OpInfo.ConstraintCode = GetMostGeneralConstraint(OpInfo.Codes, TLI); - MVT::ValueType OpVT = MVT::Other; // Compute the value type for each operand. @@ -3255,6 +3257,13 @@ } OpInfo.ConstraintVT = OpVT; + +// Compute the constraint code to use. +OpInfo.ConstraintCode = GetMostGeneralConstraint(OpInfo.Codes, TLI); + +// Compute the constraint type. +// FIXME: merge this into GetMostGeneralConstraint. +OpInfo.ConstraintType = TLI.getConstraintType(OpInfo.ConstraintCode); if (TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode, OpVT).first ==0) continue; // Not assigned a fixed reg. @@ -3315,7 +3324,8 @@ if (OpInfo.ConstraintCode.size() == 1) // not a physreg name. CTy = TLI.getConstraintType(OpInfo.ConstraintCode); - if (CTy != TargetLowering::C_RegisterClass) { + if (CTy != TargetLowering::C_RegisterClass + CTy != TargetLowering::C_Register) { // Memory output, or 'other' output (e.g. 'X' constraint). SDOperand InOperandVal = OpInfo.CallOperand; @@ -,8 +3343,7 @@ break; } - // Otherwise, this is a register output. - assert(CTy == TargetLowering::C_RegisterClass Unknown op type!); + // Otherwise, this is a register or register class output. // If this is an early-clobber output, or if there is an input // constraint that matches this, we need to reserve the input register @@ -3416,11 +3425,7 @@ } } - TargetLowering::ConstraintType CTy = TargetLowering::C_RegisterClass; - if (OpInfo.ConstraintCode.size() == 1) // not a physreg name. -CTy = TLI.getConstraintType(OpInfo.ConstraintCode); - - if (CTy == TargetLowering::C_Other) { + if (OpInfo.ConstraintType == TargetLowering::C_Other) { assert(!OpInfo.isIndirect Don't know how to handle indirect other inputs yet!); @@ -3438,7 +3443,7 @@ AsmNodeOperands.push_back(DAG.getConstant(ResOpType, MVT::i32)); AsmNodeOperands.push_back(InOperandVal); break; - } else if (CTy == TargetLowering::C_Memory) { + } else if (OpInfo.ConstraintType == TargetLowering::C_Memory) { // Memory input. Memory operands really want the address of the value, // so we want an indirect input. If we don't have an indirect input, // spill the value somewhere if we can, otherwise spill it to a stack @@ -3475,7 +3480,9 @@ break; } - assert(CTy == TargetLowering::C_RegisterClass Unknown op type!); + assert((OpInfo.ConstraintType == TargetLowering::C_RegisterClass || + OpInfo.ConstraintType == TargetLowering::C_Register) + Unknown constraint type!); assert(!OpInfo.isIndirect Don't know how to handle indirect register inputs yet!); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.436 - 1.437 --- Log message: eliminate more redundant constraint type analysis --- Diffs of the changes: (+2 -6) SelectionDAGISel.cpp |8 ++-- 1 files changed, 2 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.436 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.437 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.436Sat Apr 28 16:01:43 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Apr 28 16:03:16 2007 @@ -3320,12 +3320,8 @@ switch (OpInfo.Type) { case InlineAsm::isOutput: { - TargetLowering::ConstraintType CTy = TargetLowering::C_RegisterClass; - if (OpInfo.ConstraintCode.size() == 1) // not a physreg name. -CTy = TLI.getConstraintType(OpInfo.ConstraintCode); - - if (CTy != TargetLowering::C_RegisterClass - CTy != TargetLowering::C_Register) { + if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass + OpInfo.ConstraintType != TargetLowering::C_Register) { // Memory output, or 'other' output (e.g. 'X' constraint). SDOperand InOperandVal = OpInfo.CallOperand; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.437 - 1.438 --- Log message: memory operands that have a direct operand should have their stores created before the copies into physregs are done. This avoids having flag operands skip the store, causing cycles in the dag at sched time. This fixes infinite loops on these tests: test/CodeGen/Generic/2007-04-08-MultipleFrameIndices.ll for PR1308: http://llvm.org/PR1308 test/CodeGen/PowerPC/2007-01-29-lbrx-asm.ll test/CodeGen/PowerPC/2007-01-31-InlineAsmAddrMode.ll test/CodeGen/X86/2006-07-12-InlineAsmQConstraint.ll for PR828: http://llvm.org/PR828 --- Diffs of the changes: (+42 -35) SelectionDAGISel.cpp | 77 +++ 1 files changed, 42 insertions(+), 35 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.437 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.438 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.437Sat Apr 28 16:03:16 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Apr 28 16:12:06 2007 @@ -3265,6 +3265,45 @@ // FIXME: merge this into GetMostGeneralConstraint. OpInfo.ConstraintType = TLI.getConstraintType(OpInfo.ConstraintCode); + +// If this is a memory input, and if the operand is not indirect, do what we +// need to to provide an address for the memory input. +if (OpInfo.ConstraintType == TargetLowering::C_Memory +!OpInfo.isIndirect) { + assert(OpInfo.Type == InlineAsm::isInput + Can only indirectify direct input operands!); + + // Memory operands really want the address of the value. If we don't have + // an indirect input, put it in the constpool if we can, otherwise spill + // it to a stack slot. + + // If the operand is a float, integer, or vector constant, spill to a + // constant pool entry to get its address. + Value *OpVal = OpInfo.CallOperandVal; + if (isaConstantFP(OpVal) || isaConstantInt(OpVal) || + isaConstantVector(OpVal)) { +OpInfo.CallOperand = DAG.getConstantPool(castConstant(OpVal), + TLI.getPointerTy()); + } else { +// Otherwise, create a stack slot and emit a store to it before the +// asm. +const Type *Ty = OpVal-getType(); +uint64_t TySize = TLI.getTargetData()-getTypeSize(Ty); +unsigned Align = TLI.getTargetData()-getPrefTypeAlignment(Ty); +MachineFunction MF = DAG.getMachineFunction(); +int SSFI = MF.getFrameInfo()-CreateStackObject(TySize, Align); +SDOperand StackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy()); +Chain = DAG.getStore(Chain, OpInfo.CallOperand, StackSlot, NULL, 0); +OpInfo.CallOperand = StackSlot; + } + + // There is no longer a Value* corresponding to this operand. + OpInfo.CallOperandVal = 0; + // It is now an indirect operand. + OpInfo.isIndirect = true; +} + + if (TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode, OpVT).first ==0) continue; // Not assigned a fixed reg. @@ -3323,19 +3362,12 @@ if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass OpInfo.ConstraintType != TargetLowering::C_Register) { // Memory output, or 'other' output (e.g. 'X' constraint). -SDOperand InOperandVal = OpInfo.CallOperand; - -// Check that the operand (the address to store to) isn't a float. -if (!MVT::isInteger(InOperandVal.getValueType())) - assert(0 MATCH FAIL!); - -if (!OpInfo.isIndirect) - assert(0 MATCH FAIL!); +assert(OpInfo.isIndirect Memory output must be indirect operand); // Add information to the INLINEASM node to know about this output. unsigned ResOpType = 4/*MEM*/ | (1 3); AsmNodeOperands.push_back(DAG.getConstant(ResOpType, MVT::i32)); -AsmNodeOperands.push_back(InOperandVal); +AsmNodeOperands.push_back(OpInfo.CallOperand); break; } @@ -3440,32 +3472,7 @@ AsmNodeOperands.push_back(InOperandVal); break; } else if (OpInfo.ConstraintType == TargetLowering::C_Memory) { -// Memory input. Memory operands really want the address of the value, -// so we want an indirect input. If we don't have an indirect input, -// spill the value somewhere if we can, otherwise spill it to a stack -// slot. -if (!OpInfo.isIndirect) { - // If the operand is a float, integer, or vector constant, spill to a - // constant pool entry to get its address. - Value *OpVal = OpInfo.CallOperandVal; - if (isaConstantFP(OpVal) || isaConstantInt(OpVal) || - isaConstantVector(OpVal)) { -InOperandVal =
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.431 - 1.432 --- Log message: Fix this to match change to InlineAsm class. --- Diffs of the changes: (+3 -3) SelectionDAGISel.cpp |6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.431 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.432 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.431Thu Apr 26 20:20:11 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Apr 27 23:05:59 2007 @@ -3209,7 +3209,7 @@ // Compute the value type for each operand and add it to ConstraintVTs. switch (Constraints[i].Type) { case InlineAsm::isOutput: - if (!Constraints[i].isIndirectOutput) { + if (!Constraints[i].isIndirect) { assert(I.getType() != Type::VoidTy Bad inline asm!); OpVT = TLI.getValueType(I.getType()); } else { @@ -3283,7 +3283,7 @@ if (!MVT::isInteger(InOperandVal.getValueType())) assert(0 MATCH FAIL!); -if (!Constraints[i].isIndirectOutput) +if (!Constraints[i].isIndirect) assert(0 MATCH FAIL!); OpNum++; // Consumes a call operand. @@ -3324,7 +3324,7 @@ exit(1); } - if (!Constraints[i].isIndirectOutput) { + if (!Constraints[i].isIndirect) { assert(RetValRegs.Regs.empty() Cannot have multiple output constraints yet!); assert(I.getType() != Type::VoidTy Bad inline asm!); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.429 - 1.430 --- Log message: enable Anton's shift/and switch lowering stuff! It now passes ppc bootstrap successfully! woohoo... --- Diffs of the changes: (+0 -1) SelectionDAGISel.cpp |1 - 1 files changed, 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.429 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.430 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.429Thu Apr 26 15:44:04 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Apr 26 16:09:43 2007 @@ -1682,7 +1682,6 @@ CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default){ - return false; unsigned IntPtrBits = getSizeInBits(TLI.getPointerTy()); Case FrontCase = *CR.Range.first; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.430 - 1.431 --- Log message: improve EH global handling, patch by Duncan Sands. --- Diffs of the changes: (+10 -6) SelectionDAGISel.cpp | 16 ++-- 1 files changed, 10 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.430 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.431 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.430Thu Apr 26 16:09:43 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Apr 26 20:20:11 2007 @@ -2610,14 +2610,18 @@ // MachineModuleInfo. std::vectorGlobalVariable * TyInfo; for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { -ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(i)); -if (CE CE-getOpcode() == Instruction::BitCast -isaGlobalVariable(CE-getOperand(0))) { +Constant *C = castConstant(I.getOperand(i)); +if (GlobalVariable *GV = dyn_castGlobalVariable(C)) { + TyInfo.push_back(GV); +} else if (ConstantExpr *CE = dyn_castConstantExpr(C)) { + assert(CE-getOpcode() == Instruction::BitCast + isaGlobalVariable(CE-getOperand(0)) + TypeInfo must be a global variable or NULL); TyInfo.push_back(castGlobalVariable(CE-getOperand(0))); } else { - ConstantInt *CI = dyn_castConstantInt(I.getOperand(i)); - assert(CI CI-getZExtValue() == 0 -TypeInfo must be a global variable typeinfo or NULL); + ConstantInt *CI = dyn_castConstantInt(C); + assert(CI CI-isNullValue() + TypeInfo must be a global variable or NULL); TyInfo.push_back(NULL); } } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.427 - 1.428 --- Log message: This was lefted out. Fixed sumarray-dbl. --- Diffs of the changes: (+1 -0) SelectionDAGISel.cpp |1 + 1 files changed, 1 insertion(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.427 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.428 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.427Tue Apr 24 23:08:28 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Apr 25 13:33:21 2007 @@ -315,6 +315,7 @@ while (NumElts 1 !TLI.isTypeLegal(VecTy)) { NumElts = 1; NumVectorRegs = 1; + VecTy = getVectorType(EltTy, NumElts); } // Check that VecTy isn't a 1-element vector. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.425 - 1.426 --- Log message: Assertion when using a 1-element vector for an add operation. Get the real vector type in this case. --- Diffs of the changes: (+7 -4) SelectionDAGISel.cpp | 11 +++ 1 files changed, 7 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.425 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.426 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.425Mon Apr 23 20:24:20 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Apr 24 16:13:23 2007 @@ -308,19 +308,22 @@ const VectorType *PTy = castVectorType(V-getType()); unsigned NumElts = PTy-getNumElements(); MVT::ValueType EltTy = TLI.getValueType(PTy-getElementType()); +MVT::ValueType VecTy = getVectorType(EltTy, NumElts); // Divide the input until we get to a supported size. This will always // end with a scalar if the target doesn't support vectors. -while (NumElts 1 !TLI.isTypeLegal(getVectorType(EltTy, NumElts))) { +while (NumElts 1 !TLI.isTypeLegal(VecTy)) { NumElts = 1; NumVectorRegs = 1; } -if (NumElts == 1) + +// Check that VecTy isn't a 1-element vector. +if (NumElts == 1 VecTy == MVT::Other) VT = EltTy; else - VT = getVectorType(EltTy, NumElts); + VT = VecTy; } - + // The common case is that we will only create one register for this // value. If we have that case, create and return the virtual register. unsigned NV = TLI.getNumElements(VT); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.426 - 1.427 --- Log message: allow support for 64-bit stack objects --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.426 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.427 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.426Tue Apr 24 16:13:23 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Apr 24 23:08:28 2007 @@ -249,7 +249,7 @@ TySize *= CUI-getZExtValue(); // Get total allocated size. if (TySize == 0) TySize = 1; // Don't create zero-sized stack objects. StaticAllocaMap[AI] = - MF.getFrameInfo()-CreateStackObject((unsigned)TySize, Align); + MF.getFrameInfo()-CreateStackObject(TySize, Align); } for (; BB != EB; ++BB) ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.424 - 1.425 --- Log message: Use '-1U' where '-1UL' is obvious overkill, eliminating gcc warnings about tests always being true in the process. --- Diffs of the changes: (+2 -2) SelectionDAGISel.cpp |4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.424 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.425 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.424Sun Apr 22 18:15:29 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 23 20:24:20 2007 @@ -1177,7 +1177,7 @@ /// visitJumpTable - Emit JumpTable node in the current MBB void SelectionDAGLowering::visitJumpTable(SelectionDAGISel::JumpTable JT) { // Emit the code for the jump table - assert(JT.Reg != -1UL Should lower JT Header first!); + assert(JT.Reg != -1U Should lower JT Header first!); MVT::ValueType PTy = TLI.getPointerTy(); SDOperand Index = DAG.getCopyFromReg(getRoot(), JT.Reg, PTy); SDOperand Table = DAG.getJumpTable(JT.JTI, PTy); @@ -1544,7 +1544,7 @@ // Set the jump table information so that we can codegen it as a second // MachineBasicBlock - SelectionDAGISel::JumpTable JT(-1UL, JTI, JumpTableBB, Default); + SelectionDAGISel::JumpTable JT(-1U, JTI, JumpTableBB, Default); SelectionDAGISel::JumpTableHeader JTH(First, Last, SV, CR.CaseBB, (CR.CaseBB == CurMBB)); if (CR.CaseBB == CurMBB) ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp SelectionDAG.cpp DAGCombiner.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.423 - 1.424 SelectionDAG.cpp updated: 1.401 - 1.402 DAGCombiner.cpp updated: 1.295 - 1.296 --- Log message: PR400: http://llvm.org/PR400 phase 2. Propagate attributed load/store information through DAGs. --- Diffs of the changes: (+112 -36) DAGCombiner.cpp | 70 +-- SelectionDAG.cpp | 66 +++- SelectionDAGISel.cpp | 12 +--- 3 files changed, 112 insertions(+), 36 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.423 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.424 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.423Sat Apr 21 13:36:27 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Apr 22 18:15:29 2007 @@ -498,7 +498,7 @@ SDOperand getLoadFrom(const Type *Ty, SDOperand Ptr, const Value *SV, SDOperand Root, -bool isVolatile); +bool isVolatile, unsigned Alignment); SDOperand getIntPtrConstant(uint64_t Val) { return DAG.getConstant(Val, TLI.getPointerTy()); @@ -2313,19 +2313,21 @@ } setValue(I, getLoadFrom(I.getType(), Ptr, I.getOperand(0), - Root, I.isVolatile())); + Root, I.isVolatile(), I.getAlignment())); } SDOperand SelectionDAGLowering::getLoadFrom(const Type *Ty, SDOperand Ptr, const Value *SV, SDOperand Root, -bool isVolatile) { +bool isVolatile, +unsigned Alignment) { SDOperand L; if (const VectorType *PTy = dyn_castVectorType(Ty)) { MVT::ValueType PVT = TLI.getValueType(PTy-getElementType()); L = DAG.getVecLoad(PTy-getNumElements(), PVT, Root, Ptr, DAG.getSrcValue(SV)); } else { -L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, SV, 0, isVolatile); +L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, SV, 0, +isVolatile, Alignment); } if (isVolatile) @@ -2342,7 +2344,7 @@ SDOperand Src = getValue(SrcV); SDOperand Ptr = getValue(I.getOperand(1)); DAG.setRoot(DAG.getStore(getRoot(), Src, Ptr, I.getOperand(1), 0, - I.isVolatile())); + I.isVolatile(), I.getAlignment())); } /// IntrinsicCannotAccessMemory - Return true if the specified intrinsic cannot Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.401 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.402 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.401Sat Apr 21 15:56:26 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Sun Apr 22 18:15:30 2007 @@ -15,11 +15,13 @@ #include llvm/Constants.h #include llvm/GlobalVariable.h #include llvm/Intrinsics.h +#include llvm/DerivedTypes.h #include llvm/Assembly/Writer.h #include llvm/CodeGen/MachineBasicBlock.h #include llvm/CodeGen/MachineConstantPool.h #include llvm/Support/MathExtras.h #include llvm/Target/MRegisterInfo.h +#include llvm/Target/TargetData.h #include llvm/Target/TargetLowering.h #include llvm/Target/TargetInstrInfo.h #include llvm/Target/TargetMachine.h @@ -1538,9 +1540,7 @@ SDOperand SelectionDAG::getLoad(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr, const Value *SV, int SVOffset, -bool isVolatile) { - // FIXME: Alignment == 1 for now. - unsigned Alignment = 1; +bool isVolatile, unsigned Alignment) { SDVTList VTs = getVTList(VT, MVT::Other); SDOperand Undef = getNode(ISD::UNDEF, Ptr.getValueType()); SDOperand Ops[] = { Chain, Ptr, Undef }; @@ -1556,6 +1556,18 @@ void *IP = 0; if (SDNode *E = CSEMap.FindNodeOrInsertPos(ID, IP)) return SDOperand(E, 0); + if (Alignment == 0) { // Ensure that codegen never sees alignment 0 +const Type *Ty = 0; +if (VT != MVT::Vector VT != MVT::iPTR) { + Ty = MVT::getTypeForValueType(VT); +} else if (SV) { + const PointerType *PT = dyn_castPointerType(SV-getType()); + assert(PT Value for load must be a pointer); + Ty = PT-getElementType(); +} +assert(Ty Could not get type information for load); +Alignment = TLI.getTargetData()-getABITypeAlignment(Ty); + } SDNode *N = new LoadSDNode(Ops, VTs, ISD::UNINDEXED, ISD::NON_EXTLOAD, VT, SV, SVOffset, Alignment, isVolatile); @@ -1568,7 +1580,7 @@ SDOperand Chain, SDOperand Ptr, const Value *SV,
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.419 - 1.420 --- Log message: Fix PR1325: http://llvm.org/PR1325 : Case range optimization was performed in the case it shouldn't. Also fix some latent bug on 64-bit platforms --- Diffs of the changes: (+2 -4) SelectionDAGISel.cpp |6 ++ 1 files changed, 2 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.419 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.420 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.419Fri Apr 13 21:26:56 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Apr 14 08:25:55 2007 @@ -1678,8 +1678,6 @@ CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default){ - return false; // DISABLED FOR NOW: PR1325. - unsigned IntPtrBits = getSizeInBits(TLI.getPointerTy()); Case FrontCase = *CR.Range.first; @@ -1732,7 +1730,7 @@ // word without having to subtract minValue. In this case, // we can optimize away the subtraction. if (castConstantInt(minValue)-getSExtValue() = 0 - castConstantInt(maxValue)-getSExtValue() = IntPtrBits) { + castConstantInt(maxValue)-getSExtValue() IntPtrBits) { range = castConstantInt(maxValue)-getSExtValue(); } else { lowBound = castConstantInt(minValue)-getSExtValue(); @@ -1757,7 +1755,7 @@ uint64_t hi = castConstantInt(I-High)-getSExtValue() - lowBound; for (uint64_t j = lo; j = hi; j++) { - CasesBits[i].Mask |= 1 j; + CasesBits[i].Mask |= 1ULL j; CasesBits[i].Bits++; } ___ llvm-commits mailing list [EMAIL PROTECTED] http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.420 - 1.421 --- Log message: disable switch lowering using shift/and. It still breaks ppc bootstrap for some reason. :( Will investigate. --- Diffs of the changes: (+1 -0) SelectionDAGISel.cpp |1 + 1 files changed, 1 insertion(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.420 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.421 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.420Sat Apr 14 08:25:55 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Apr 14 14:39:41 2007 @@ -1678,6 +1678,7 @@ CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default){ + return false; unsigned IntPtrBits = getSizeInBits(TLI.getPointerTy()); Case FrontCase = *CR.Range.first; ___ llvm-commits mailing list [EMAIL PROTECTED] http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.417 - 1.418 --- Log message: Fix PR1323: http://llvm.org/PR1323 : we haven't updated phi nodes in good manner :) --- Diffs of the changes: (+1 -0) SelectionDAGISel.cpp |1 + 1 files changed, 1 insertion(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.417 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.418 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.417Thu Apr 12 01:00:20 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Apr 13 01:53:51 2007 @@ -4634,6 +4634,7 @@ if (PHIBB == BitTestCases[i].Default) { PHI-addRegOperand(PHINodesToUpdate[pi].second, false); PHI-addMachineBasicBlockOperand(BitTestCases[i].Parent); +PHI-addRegOperand(PHINodesToUpdate[pi].second, false); PHI-addMachineBasicBlockOperand(BitTestCases[i].Cases.back().ThisBB); } // One of cases BB. ___ llvm-commits mailing list [EMAIL PROTECTED] http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.418 - 1.419 --- Log message: disable shift/and lowering to work around PR1325: http://llvm.org/PR1325 for now. --- Diffs of the changes: (+3 -1) SelectionDAGISel.cpp |4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.418 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.419 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.418Fri Apr 13 01:53:51 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Apr 13 21:26:56 2007 @@ -1677,7 +1677,9 @@ bool SelectionDAGLowering::handleBitTestsSwitchCase(CaseRec CR, CaseRecVector WorkList, Value* SV, -MachineBasicBlock* Default) { +MachineBasicBlock* Default){ + return false; // DISABLED FOR NOW: PR1325. + unsigned IntPtrBits = getSizeInBits(TLI.getPointerTy()); Case FrontCase = *CR.Range.first; ___ llvm-commits mailing list [EMAIL PROTECTED] http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.416 - 1.417 --- Log message: the result of an inline asm copy can be an arbitrary VT that the register class supports. In the case of vectors, this means we often get the wrong type (e.g. we get v4f32 instead of v8i16). Make sure to convert the vector result to the right type. This fixes CodeGen/X86/2007-04-11-InlineAsmVectorResult.ll --- Diffs of the changes: (+21 -4) SelectionDAGISel.cpp | 25 + 1 files changed, 21 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.416 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.417 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.416Wed Apr 11 21:48:46 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Apr 12 01:00:20 2007 @@ -3055,9 +3055,10 @@ // how to maintain the constraint. If it isn't, go ahead and create vreg // and let the regalloc do the right thing. if (!isOutReg || !isInReg) { - if (VT == MVT::Other) -ValueVT = *PhysReg.second-vt_begin(); RegVT = *PhysReg.second-vt_begin(); + + if (VT == MVT::Other) +ValueVT = RegVT; // Create the appropriate number of virtual registers. SSARegMap *RegMap = DAG.getMachineFunction().getSSARegMap(); @@ -3459,8 +3460,24 @@ // If this asm returns a register value, copy the result from that register // and set it as the value of the call. - if (!RetValRegs.Regs.empty()) -setValue(I, RetValRegs.getCopyFromRegs(DAG, Chain, Flag)); + if (!RetValRegs.Regs.empty()) { +SDOperand Val = RetValRegs.getCopyFromRegs(DAG, Chain, Flag); + +// If the result of the inline asm is a vector, it may have the wrong +// width/num elts. Make sure to convert it to the right type with +// vbit_convert. +if (Val.getValueType() == MVT::Vector) { + const VectorType *VTy = castVectorType(I.getType()); + unsigned DesiredNumElts = VTy-getNumElements(); + MVT::ValueType DesiredEltVT = TLI.getValueType(VTy-getElementType()); + + Val = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, Val, +DAG.getConstant(DesiredNumElts, MVT::i32), +DAG.getValueType(DesiredEltVT)); +} + +setValue(I, Val); + } std::vectorstd::pairSDOperand, Value* StoresToEmit; ___ llvm-commits mailing list [EMAIL PROTECTED] http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.415 - 1.416 --- Log message: For PR1284: http://llvm.org/PR1284 : Implement the part_set intrinsic. --- Diffs of the changes: (+6 -1) SelectionDAGISel.cpp |7 ++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.415 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.416 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.415Tue Apr 10 21:44:19 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Apr 11 21:48:46 2007 @@ -2691,7 +2691,12 @@ } case Intrinsic::part_select: { // Currently not implemented: just abort -assert(0 bit_part_select intrinsic not implemented); +assert(0 part_select intrinsic not implemented); +abort(); + } + case Intrinsic::part_set: { +// Currently not implemented: just abort +assert(0 part_set intrinsic not implemented); abort(); } case Intrinsic::bswap: ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.414 - 1.415 --- Log message: For PR1146: http://llvm.org/PR1146 : Put the parameter attributes in their own ParamAttr name space. Adjust the rest of llvm as a result. --- Diffs of the changes: (+13 -13) SelectionDAGISel.cpp | 26 +- 1 files changed, 13 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.414 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.415 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.414Mon Apr 9 22:20:39 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Apr 10 21:44:19 2007 @@ -828,9 +828,9 @@ const FunctionType *FTy = I.getParent()-getParent()-getFunctionType(); const ParamAttrsList *Attrs = FTy-getParamAttrs(); ISD::NodeType ExtendKind = ISD::ANY_EXTEND; - if (Attrs Attrs-paramHasAttr(0, SExtAttribute)) + if (Attrs Attrs-paramHasAttr(0, ParamAttr::SExt)) ExtendKind = ISD::SIGN_EXTEND; - if (Attrs Attrs-paramHasAttr(0, ZExtAttribute)) + if (Attrs Attrs-paramHasAttr(0, ParamAttr::ZExt)) ExtendKind = ISD::ZERO_EXTEND; RetOp = DAG.getNode(ExtendKind, TmpVT, RetOp); } @@ -2768,16 +2768,16 @@ Value *Arg = I.getOperand(i); SDOperand ArgNode = getValue(Arg); Entry.Node = ArgNode; Entry.Ty = Arg-getType(); -Entry.isSExt = Attrs Attrs-paramHasAttr(i, SExtAttribute); -Entry.isZExt = Attrs Attrs-paramHasAttr(i, ZExtAttribute); -Entry.isInReg = Attrs Attrs-paramHasAttr(i, InRegAttribute); -Entry.isSRet = Attrs Attrs-paramHasAttr(i, StructRetAttribute); +Entry.isSExt = Attrs Attrs-paramHasAttr(i, ParamAttr::SExt); +Entry.isZExt = Attrs Attrs-paramHasAttr(i, ParamAttr::ZExt); +Entry.isInReg = Attrs Attrs-paramHasAttr(i, ParamAttr::InReg); +Entry.isSRet = Attrs Attrs-paramHasAttr(i, ParamAttr::StructRet); Args.push_back(Entry); } std::pairSDOperand,SDOperand Result = TLI.LowerCallTo(getRoot(), I.getType(), -Attrs Attrs-paramHasAttr(0, SExtAttribute), +Attrs Attrs-paramHasAttr(0, ParamAttr::SExt), FTy-isVarArg(), CallingConv, IsTailCall, Callee, Args, DAG); if (I.getType() != Type::VoidTy) @@ -3617,13 +3617,13 @@ // FIXME: Distinguish between a formal with no [sz]ext attribute from one // that is zero extended! -if (Attrs Attrs-paramHasAttr(j, ZExtAttribute)) +if (Attrs Attrs-paramHasAttr(j, ParamAttr::ZExt)) Flags = ~(ISD::ParamFlags::SExt); -if (Attrs Attrs-paramHasAttr(j, SExtAttribute)) +if (Attrs Attrs-paramHasAttr(j, ParamAttr::SExt)) Flags |= ISD::ParamFlags::SExt; -if (Attrs Attrs-paramHasAttr(j, InRegAttribute)) +if (Attrs Attrs-paramHasAttr(j, ParamAttr::InReg)) Flags |= ISD::ParamFlags::InReg; -if (Attrs Attrs-paramHasAttr(j, StructRetAttribute)) +if (Attrs Attrs-paramHasAttr(j, ParamAttr::StructRet)) Flags |= ISD::ParamFlags::StructReturn; Flags |= (OriginalAlignment ISD::ParamFlags::OrigAlignmentOffs); @@ -3697,10 +3697,10 @@ case Promote: { SDOperand Op(Result, i++); if (MVT::isInteger(VT)) { -if (Attrs Attrs-paramHasAttr(Idx, SExtAttribute)) +if (Attrs Attrs-paramHasAttr(Idx, ParamAttr::SExt)) Op = DAG.getNode(ISD::AssertSext, Op.getValueType(), Op, DAG.getValueType(VT)); -else if (Attrs Attrs-paramHasAttr(Idx, ZExtAttribute)) +else if (Attrs Attrs-paramHasAttr(Idx, ParamAttr::ZExt)) Op = DAG.getNode(ISD::AssertZext, Op.getValueType(), Op, DAG.getValueType(VT)); Op = DAG.getNode(ISD::TRUNCATE, VT, Op); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.408 - 1.409 --- Log message: For PR1146: http://llvm.org/PR1146 : Adapt handling of parameter attributes to use the new ParamAttrsList class. --- Diffs of the changes: (+17 -13) SelectionDAGISel.cpp | 30 +- 1 files changed, 17 insertions(+), 13 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.408 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.409 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.408Mon Apr 9 00:31:20 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 9 01:17:21 2007 @@ -25,6 +25,7 @@ #include llvm/Instructions.h #include llvm/Intrinsics.h #include llvm/IntrinsicInst.h +#include llvm/ParameterAttributes.h #include llvm/CodeGen/MachineModuleInfo.h #include llvm/CodeGen/MachineFunction.h #include llvm/CodeGen/MachineFrameInfo.h @@ -802,10 +803,11 @@ else TmpVT = MVT::i32; const FunctionType *FTy = I.getParent()-getParent()-getFunctionType(); + const ParamAttrsList *Attrs = FTy-getParamAttrs(); ISD::NodeType ExtendKind = ISD::ANY_EXTEND; - if (FTy-paramHasAttr(0, FunctionType::SExtAttribute)) + if (Attrs Attrs-paramHasAttr(0, SExtAttribute)) ExtendKind = ISD::SIGN_EXTEND; - if (FTy-paramHasAttr(0, FunctionType::ZExtAttribute)) + if (Attrs Attrs-paramHasAttr(0, ZExtAttribute)) ExtendKind = ISD::ZERO_EXTEND; RetOp = DAG.getNode(ExtendKind, TmpVT, RetOp); } @@ -2508,6 +2510,7 @@ SDOperand Callee, unsigned OpIdx) { const PointerType *PT = castPointerType(CalledValueTy); const FunctionType *FTy = castFunctionType(PT-getElementType()); + const ParamAttrsList *Attrs = FTy-getParamAttrs(); TargetLowering::ArgListTy Args; TargetLowering::ArgListEntry Entry; @@ -2516,16 +2519,16 @@ Value *Arg = I.getOperand(i); SDOperand ArgNode = getValue(Arg); Entry.Node = ArgNode; Entry.Ty = Arg-getType(); -Entry.isSExt = FTy-paramHasAttr(i, FunctionType::SExtAttribute); -Entry.isZExt = FTy-paramHasAttr(i, FunctionType::ZExtAttribute); -Entry.isInReg = FTy-paramHasAttr(i, FunctionType::InRegAttribute); -Entry.isSRet = FTy-paramHasAttr(i, FunctionType::StructRetAttribute); +Entry.isSExt = Attrs Attrs-paramHasAttr(i, SExtAttribute); +Entry.isZExt = Attrs Attrs-paramHasAttr(i, ZExtAttribute); +Entry.isInReg = Attrs Attrs-paramHasAttr(i, InRegAttribute); +Entry.isSRet = Attrs Attrs-paramHasAttr(i, StructRetAttribute); Args.push_back(Entry); } std::pairSDOperand,SDOperand Result = TLI.LowerCallTo(getRoot(), I.getType(), -FTy-paramHasAttr(0,FunctionType::SExtAttribute), +Attrs Attrs-paramHasAttr(0, SExtAttribute), FTy-isVarArg(), CallingConv, IsTailCall, Callee, Args, DAG); if (I.getType() != Type::VoidTy) @@ -3346,6 +3349,7 @@ std::vectorSDOperand TargetLowering::LowerArguments(Function F, SelectionDAG DAG) { const FunctionType *FTy = F.getFunctionType(); + const ParamAttrsList *Attrs = FTy-getParamAttrs(); // Add CC# and isVararg as operands to the FORMAL_ARGUMENTS node. std::vectorSDOperand Ops; Ops.push_back(DAG.getRoot()); @@ -3364,13 +3368,13 @@ // FIXME: Distinguish between a formal with no [sz]ext attribute from one // that is zero extended! -if (FTy-paramHasAttr(j, FunctionType::ZExtAttribute)) +if (Attrs Attrs-paramHasAttr(j, ZExtAttribute)) Flags = ~(ISD::ParamFlags::SExt); -if (FTy-paramHasAttr(j, FunctionType::SExtAttribute)) +if (Attrs Attrs-paramHasAttr(j, SExtAttribute)) Flags |= ISD::ParamFlags::SExt; -if (FTy-paramHasAttr(j, FunctionType::InRegAttribute)) +if (Attrs Attrs-paramHasAttr(j, InRegAttribute)) Flags |= ISD::ParamFlags::InReg; -if (FTy-paramHasAttr(j, FunctionType::StructRetAttribute)) +if (Attrs Attrs-paramHasAttr(j, StructRetAttribute)) Flags |= ISD::ParamFlags::StructReturn; Flags |= (OriginalAlignment ISD::ParamFlags::OrigAlignmentOffs); @@ -3444,10 +3448,10 @@ case Promote: { SDOperand Op(Result, i++); if (MVT::isInteger(VT)) { -if (FTy-paramHasAttr(Idx, FunctionType::SExtAttribute)) +if (Attrs Attrs-paramHasAttr(Idx, SExtAttribute)) Op = DAG.getNode(ISD::AssertSext, Op.getValueType(), Op, DAG.getValueType(VT)); -else if (FTy-paramHasAttr(Idx, FunctionType::ZExtAttribute)) +else if (Attrs Attrs-paramHasAttr(Idx, ZExtAttribute)) Op = DAG.getNode(ISD::AssertZext, Op.getValueType(), Op, DAG.getValueType(VT)); Op = DAG.getNode(ISD::TRUNCATE, VT, Op);
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.409 - 1.410 --- Log message: Next stage into switch lowering refactoring 1. Fix some bugs in the jump table lowering threshold 2. Implement much better metric for optimal pivot selection 3. Tune thresholds for different lowering methods 4. Implement shift-and trick for lowering small (machine word length) cases with few destinations. Good testcase will follow. --- Diffs of the changes: (+340 -19) SelectionDAGISel.cpp | 359 --- 1 files changed, 340 insertions(+), 19 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.409 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.410 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.409Mon Apr 9 01:17:21 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 9 07:31:58 2007 @@ -378,7 +378,17 @@ } }; + struct CaseBits { +uint64_t Mask; +MachineBasicBlock* BB; +unsigned Bits; + +CaseBits(uint64_t mask, MachineBasicBlock* bb, unsigned bits): + Mask(mask), BB(bb), Bits(bits) { } + }; + typedef std::vectorCase CaseVector; + typedef std::vectorCaseBits CaseBitsVector; typedef CaseVector::iteratorCaseItr; typedef std::pairCaseItr, CaseItr CaseRange; @@ -404,9 +414,7 @@ /// The comparison function for sorting the switch case values in the vector. /// WARNING: Case ranges should be disjoint! struct CaseCmp { -bool operator () (const Case C1, - const Case C2) { - +bool operator () (const Case C1, const Case C2) { assert(isaConstantInt(C1.Low) isaConstantInt(C2.High)); const ConstantInt* CI1 = castconst ConstantInt(C1.Low); const ConstantInt* CI2 = castconst ConstantInt(C2.High); @@ -414,6 +422,12 @@ } }; + struct CaseBitsCmp { +bool operator () (const CaseBits C1, const CaseBits C2) { + return C1.Bits C2.Bits; +} + }; + unsigned Clusterify(CaseVector Cases, const SwitchInst SI); public: @@ -430,6 +444,7 @@ /// JTCases - Vector of JumpTable structures used to communicate /// SwitchInst code generation information. std::vectorSelectionDAGISel::JumpTableBlock JTCases; + std::vectorSelectionDAGISel::BitTestBlock BitTestCases; /// FuncInfo - Information about the function as a whole. /// @@ -531,7 +546,15 @@ CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default); + bool handleBitTestsSwitchCase(CaseRec CR, +CaseRecVector WorkList, +Value* SV, +MachineBasicBlock* Default); void visitSwitchCase(SelectionDAGISel::CaseBlock CB); + void visitBitTestHeader(SelectionDAGISel::BitTestBlock B); + void visitBitTestCase(MachineBasicBlock* NextMBB, +unsigned Reg, +SelectionDAGISel::BitTestCase B); void visitJumpTable(SelectionDAGISel::JumpTable JT); void visitJumpTableHeader(SelectionDAGISel::JumpTable JT, SelectionDAGISel::JumpTableHeader JTH); @@ -1210,9 +1233,98 @@ DAG.setRoot(BrCond); else DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, BrCond, -DAG.getBasicBlock(JT.MBB))); +DAG.getBasicBlock(JT.MBB))); + + return; } +/// visitBitTestHeader - This function emits necessary code to produce value +/// suitable for bit tests +void SelectionDAGLowering::visitBitTestHeader(SelectionDAGISel::BitTestBlock B) { + // Subtract the minimum value + SDOperand SwitchOp = getValue(B.SValue); + MVT::ValueType VT = SwitchOp.getValueType(); + SDOperand SUB = DAG.getNode(ISD::SUB, VT, SwitchOp, + DAG.getConstant(B.First, VT)); + + // Check range + SDOperand RangeCmp = DAG.getSetCC(TLI.getSetCCResultTy(), SUB, +DAG.getConstant(B.Range, VT), +ISD::SETUGT); + + SDOperand ShiftOp; + if (VT TLI.getShiftAmountTy()) +ShiftOp = DAG.getNode(ISD::TRUNCATE, TLI.getShiftAmountTy(), SUB); + else +ShiftOp = DAG.getNode(ISD::ZERO_EXTEND, TLI.getShiftAmountTy(), SUB); + + // Make desired shift + SDOperand SwitchVal = DAG.getNode(ISD::SHL, TLI.getPointerTy(), +DAG.getConstant(1, TLI.getPointerTy()), +ShiftOp); + + unsigned SwitchReg = FuncInfo.MakeReg(TLI.getPointerTy()); + SDOperand CopyTo = DAG.getCopyToReg(getRoot(), SwitchReg, SwitchVal); + B.Reg = SwitchReg; + + SDOperand BrRange = DAG.getNode(ISD::BRCOND, MVT::Other, CopyTo, RangeCmp, + DAG.getBasicBlock(B.Default)); + + // Set NextBlock to be the MBB
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.410 - 1.411 --- Log message: Unbreak VC++ build. --- Diffs of the changes: (+3 -2) SelectionDAGISel.cpp |5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.410 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.411 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.410Mon Apr 9 07:31:58 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 9 09:32:59 2007 @@ -45,6 +45,7 @@ #include llvm/Support/Debug.h #include llvm/Support/Compiler.h #include algorithm +#include math.h using namespace llvm; #ifndef NDEBUG @@ -1603,7 +1604,7 @@ assert((RBegin-LEnd=1) Invalid case distance); double LDensity = (double)LSize / (double)((LEnd - First) + 1ULL); double RDensity = (double)RSize / (double)((Last - RBegin) + 1ULL); -double Metric = log(RBegin-LEnd)*(LDensity+RDensity); +double Metric = log(double(RBegin-LEnd))*(LDensity+RDensity); // Should always split in some non-trivial place DOUT =Step\n LEnd: LEnd , RBegin: RBegin \n @@ -1783,7 +1784,7 @@ } SelectionDAGISel::BitTestBlock BTB(lowBound, range, SV, - -1ULL, (CR.CaseBB == CurMBB), + -1U, (CR.CaseBB == CurMBB), CR.CaseBB, Default, BTC); if (CR.CaseBB == CurMBB) ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.412 - 1.413 --- Log message: No longer needed. --- Diffs of the changes: (+0 -1) SelectionDAGISel.cpp |1 - 1 files changed, 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.412 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.413 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.412Mon Apr 9 16:57:03 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 9 18:42:32 2007 @@ -45,7 +45,6 @@ #include llvm/Support/Debug.h #include llvm/Support/Compiler.h #include algorithm -#include math.h using namespace llvm; #ifndef NDEBUG ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.413 - 1.414 --- Log message: apparently some people commit without building the tree, or they forget to commit a LOT of files. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.413 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.414 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.413Mon Apr 9 18:42:32 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 9 22:20:39 2007 @@ -2689,7 +2689,7 @@ DAG.setRoot(Tmp.getValue(1)); return 0; } - case Intrinsic::bit_part_select: { + case Intrinsic::part_select: { // Currently not implemented: just abort assert(0 bit_part_select intrinsic not implemented); abort(); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.405 - 1.406 --- Log message: Fix for CodeGen/X86/2007-04-08-InlineAsmCrash.ll and PR1314: http://llvm.org/PR1314 --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.405 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.406 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.405Fri Apr 6 12:47:14 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Apr 8 17:23:26 2007 @@ -2687,7 +2687,7 @@ /// values added into it. void RegsForValue::AddInlineAsmOperands(unsigned Code, SelectionDAG DAG, std::vectorSDOperand Ops) const { - Ops.push_back(DAG.getConstant(Code | (Regs.size() 3), MVT::i32)); + Ops.push_back(DAG.getTargetConstant(Code | (Regs.size() 3), MVT::i32)); for (unsigned i = 0, e = Regs.size(); i != e; ++i) Ops.push_back(DAG.getRegister(Regs[i], RegVT)); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.406 - 1.407 --- Log message: Fix PR1316: http://llvm.org/PR1316 --- Diffs of the changes: (+4 -4) SelectionDAGISel.cpp |8 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.406 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.407 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.406Sun Apr 8 17:23:26 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Apr 8 19:33:58 2007 @@ -2439,8 +2439,6 @@ return 0; } case Intrinsic::bit_part_select: { -// MVT::ValueType Ty = getValue(I.getOperand(1)).getValueType(); -// setValue(I, DAG.getTargetConstant(0, Ty)); // Currently not implemented: just abort assert(0 bit_part_select intrinsic not implemented); abort(); @@ -2687,7 +2685,8 @@ /// values added into it. void RegsForValue::AddInlineAsmOperands(unsigned Code, SelectionDAG DAG, std::vectorSDOperand Ops) const { - Ops.push_back(DAG.getTargetConstant(Code | (Regs.size() 3), MVT::i32)); + MVT::ValueType IntPtrTy = DAG.getTargetLoweringInfo().getPointerTy(); + Ops.push_back(DAG.getTargetConstant(Code | (Regs.size() 3), IntPtrTy)); for (unsigned i = 0, e = Regs.size(); i != e; ++i) Ops.push_back(DAG.getRegister(Regs[i], RegVT)); } @@ -4524,8 +4523,9 @@ } // Add this to the output node. + MVT::ValueType IntPtrTy = DAG.getTargetLoweringInfo().getPointerTy(); Ops.push_back(DAG.getTargetConstant(4/*MEM*/ | (SelOps.size() 3), - MVT::i32)); + IntPtrTy)); Ops.insert(Ops.end(), SelOps.begin(), SelOps.end()); i += 2; } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.407 - 1.408 --- Log message: implement CodeGen/X86/inline-asm-x-scalar.ll:test3 --- Diffs of the changes: (+9 -2) SelectionDAGISel.cpp | 11 +-- 1 files changed, 9 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.407 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.408 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.407Sun Apr 8 19:33:58 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Apr 9 00:31:20 2007 @@ -2656,13 +2656,20 @@ if (MVT::isVector(RegVT)) { assert(Val.getValueType() == MVT::Vector Not a vector-vector cast?); Val = DAG.getNode(ISD::VBIT_CONVERT, RegVT, Val); - } else if (MVT::isInteger(RegVT)) { + } else if (MVT::isInteger(RegVT) MVT::isInteger(Val.getValueType())) { if (RegVT ValueVT) Val = DAG.getNode(ISD::TRUNCATE, RegVT, Val); else Val = DAG.getNode(ISD::ANY_EXTEND, RegVT, Val); - } else + } else if (MVT::isFloatingPoint(RegVT) + MVT::isFloatingPoint(Val.getValueType())) { Val = DAG.getNode(ISD::FP_EXTEND, RegVT, Val); + } else if (MVT::getSizeInBits(RegVT) == + MVT::getSizeInBits(Val.getValueType())) { +Val = DAG.getNode(ISD::BIT_CONVERT, RegVT, Val); + } else { +assert(0 Unknown mismatch!); + } } Chain = DAG.getCopyToReg(Chain, Regs[0], Val, Flag); Flag = Chain.getValue(1); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.404 - 1.405 --- Log message: minor comment fix --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.404 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.405 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.404Wed Apr 4 20:20:18 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Apr 6 12:47:14 2007 @@ -2840,7 +2840,7 @@ // Okay, this register is good, we can use it. ++NumAllocated; -// If we allocated enough consecutive +// If we allocated enough consecutive registers, succeed. if (NumAllocated == NumRegs) { unsigned RegStart = (i-NumAllocated)+1; unsigned RegEnd = i+1; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.401 - 1.402 --- Log message: Properly emit range comparisons for switch cases, where neighbour cases go to the same destination. Now we're producing really good code for switch-lower-feature.ll testcase --- Diffs of the changes: (+181 -71) SelectionDAGISel.cpp | 252 --- 1 files changed, 181 insertions(+), 71 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.401 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.402 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.401Sun Apr 1 02:34:11 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Apr 4 16:14:49 2007 @@ -12,9 +12,11 @@ //===--===// #define DEBUG_TYPE isel +#include llvm/ADT/BitVector.h #include llvm/Analysis/AliasAnalysis.h #include llvm/CodeGen/SelectionDAGISel.h #include llvm/CodeGen/ScheduleDAG.h +#include llvm/Constants.h #include llvm/CallingConv.h #include llvm/DerivedTypes.h #include llvm/Function.h @@ -358,11 +360,26 @@ /// analysis. std::vectorSDOperand PendingLoads; - /// Case - A pair of values to record the Value for a switch case, and the - /// case's target basic block. - typedef std::pairConstant*, MachineBasicBlock* Case; - typedef std::vectorCase::iterator CaseItr; - typedef std::pairCaseItr, CaseItr CaseRange; + /// Case - A struct to record the Value for a switch case, and the + /// case's target basic block. + struct Case { +Constant* Low; +Constant* High; +MachineBasicBlock* BB; + +Case() : Low(0), High(0), BB(0) { } +Case(Constant* low, Constant* high, MachineBasicBlock* bb) : + Low(low), High(high), BB(bb) { } +uint64_t size() const { + uint64_t rHigh = castConstantInt(High)-getSExtValue(); + uint64_t rLow = castConstantInt(Low)-getSExtValue(); + return (rHigh - rLow + 1ULL); +} + }; + + typedef std::vectorCase CaseVector; + typedef CaseVector::iteratorCaseItr; + typedef std::pairCaseItr, CaseItr CaseRange; /// CaseRec - A struct with ctor used in lowering switches to a binary tree /// of conditional branches. @@ -382,15 +399,21 @@ }; typedef std::vectorCaseRec CaseRecVector; - - /// The comparison function for sorting Case values. + + /// The comparison function for sorting the switch case values in the vector. + /// WARNING: Case ranges should be disjoint! struct CaseCmp { -bool operator () (const Case C1, const Case C2) { - assert(isaConstantInt(C1.first) isaConstantInt(C2.first)); - return castconst ConstantInt(C1.first)-getSExtValue() -castconst ConstantInt(C2.first)-getSExtValue(); +bool operator () (const Case C1, + const Case C2) { + + assert(isaConstantInt(C1.Low) isaConstantInt(C2.High)); + const ConstantInt* CI1 = castconst ConstantInt(C1.Low); + const ConstantInt* CI2 = castconst ConstantInt(C2.High); + return CI1-getValue().slt(CI2-getValue()); } }; + + unsigned Clusterify(CaseVector Cases, const SwitchInst SI); public: // TLI - This is information that describes the available target features we @@ -912,14 +935,14 @@ } SelectionDAGISel::CaseBlock CB(Condition, BOp-getOperand(0), - BOp-getOperand(1), TBB, FBB, CurBB); + BOp-getOperand(1), NULL, TBB, FBB, CurBB); SwitchCases.push_back(CB); return; } // Create a CaseBlock record representing this branch. SelectionDAGISel::CaseBlock CB(ISD::SETEQ, Cond, ConstantInt::getTrue(), - TBB, FBB, CurBB); + NULL, TBB, FBB, CurBB); SwitchCases.push_back(CB); return; } @@ -1058,7 +1081,7 @@ // Create a CaseBlock record representing this branch. SelectionDAGISel::CaseBlock CB(ISD::SETEQ, CondVal, ConstantInt::getTrue(), - Succ0MBB, Succ1MBB, CurMBB); + NULL, Succ0MBB, Succ1MBB, CurMBB); // Use visitSwitchCase to actually insert the fast branch sequence for this // cond branch. visitSwitchCase(CB); @@ -1070,16 +1093,36 @@ SDOperand Cond; SDOperand CondLHS = getValue(CB.CmpLHS); - // Build the setcc now, fold (X == true) to X and (X == false) to !X to - // handle common cases produced by branch lowering. - if (CB.CmpRHS == ConstantInt::getTrue() CB.CC == ISD::SETEQ) -Cond = CondLHS; - else if (CB.CmpRHS == ConstantInt::getFalse() CB.CC == ISD::SETEQ) { -SDOperand True = DAG.getConstant(1, CondLHS.getValueType()); -Cond = DAG.getNode(ISD::XOR, CondLHS.getValueType(), CondLHS, True); - } else -Cond =
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Implement the llvm.bit.part_select.iN.iN.iN overloaded intrinsic. Urr? This is obviously incorrect. I'd much rather have the code generator assert and die on an unsupported intrinsic than to miscompile it silently. -Chris --- Diffs of the changes: (+5 -0) SelectionDAGISel.cpp |5 + 1 files changed, 5 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.402 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.403 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.402 Wed Apr 4 16:14:49 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cppWed Apr 4 18:48:25 2007 @@ -2438,6 +2438,11 @@ DAG.setRoot(Tmp.getValue(1)); return 0; } + case Intrinsic::bit_part_select: { +MVT::ValueType Ty = getValue(I.getOperand(1)).getValueType(); +setValue(I, DAG.getTargetConstant(0, Ty)); +return 0; + } case Intrinsic::bswap: setValue(I, DAG.getNode(ISD::BSWAP, getValue(I.getOperand(1)).getValueType (), ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
On Wed, 2007-04-04 at 17:37 -0700, Chris Lattner wrote: Implement the llvm.bit.part_select.iN.iN.iN overloaded intrinsic. Urr? This is obviously incorrect. I'd much rather have the code generator assert and die on an unsupported intrinsic than to miscompile it silently. Okay, but you DID approve this in the plan. -Chris --- Diffs of the changes: (+5 -0) SelectionDAGISel.cpp |5 + 1 files changed, 5 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.402 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.403 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.402Wed Apr 4 16:14:49 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Apr 4 18:48:25 2007 @@ -2438,6 +2438,11 @@ DAG.setRoot(Tmp.getValue(1)); return 0; } + case Intrinsic::bit_part_select: { +MVT::ValueType Ty = getValue(I.getOperand(1)).getValueType(); +setValue(I, DAG.getTargetConstant(0, Ty)); +return 0; + } case Intrinsic::bswap: setValue(I, DAG.getNode(ISD::BSWAP, getValue(I.getOperand(1)).getValueType (), ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits signature.asc Description: This is a digitally signed message part ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
On Apr 4, 2007, at 5:54 PM, Reid Spencer wrote: On Wed, 2007-04-04 at 17:37 -0700, Chris Lattner wrote: Implement the llvm.bit.part_select.iN.iN.iN overloaded intrinsic. Urr? This is obviously incorrect. I'd much rather have the code generator assert and die on an unsupported intrinsic than to miscompile it silently. Okay, but you DID approve this in the plan. I did not approve silently miscompiling the code. I'm fine with it aborting if you don't want to implement the lowering code. -Chris ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
On Wed, 2007-04-04 at 18:06 -0700, Chris Lattner wrote: On Apr 4, 2007, at 5:54 PM, Reid Spencer wrote: On Wed, 2007-04-04 at 17:37 -0700, Chris Lattner wrote: Implement the llvm.bit.part_select.iN.iN.iN overloaded intrinsic. Urr? This is obviously incorrect. I'd much rather have the code generator assert and die on an unsupported intrinsic than to miscompile it silently. Okay, but you DID approve this in the plan. I did not approve silently miscompiling the code. You most certainly did. You agreed with the plan and it stated: I will *not* write lowering code for part_select in the SDISel because no known target can do anything with it and it expands to an entire function. If, at some point, it needs to be implemented on the normal targets, we can do so at that time. *To avoid having SDISel assert out, I will have this intrinsic simply generate a 0 for now.* This is mostly a time saving thing for right now. I will probably revisit after AutoESL's Phase 3 is over so we don't leave a rare but bad code gen bug in LLVM. I'm fine with it aborting if you don't want to implement the lowering code. As you'd rather have an abort, I'll change it. -Chris ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits signature.asc Description: This is a digitally signed message part ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.403 - 1.404 --- Log message: Change the bit_part_select (non)implementation from return 0 to abort. --- Diffs of the changes: (+5 -3) SelectionDAGISel.cpp |8 +--- 1 files changed, 5 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.403 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.404 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.403Wed Apr 4 18:48:25 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Apr 4 20:20:18 2007 @@ -2439,9 +2439,11 @@ return 0; } case Intrinsic::bit_part_select: { -MVT::ValueType Ty = getValue(I.getOperand(1)).getValueType(); -setValue(I, DAG.getTargetConstant(0, Ty)); -return 0; +// MVT::ValueType Ty = getValue(I.getOperand(1)).getValueType(); +// setValue(I, DAG.getTargetConstant(0, Ty)); +// Currently not implemented: just abort +assert(0 bit_part_select intrinsic not implemented); +abort(); } case Intrinsic::bswap: setValue(I, DAG.getNode(ISD::BSWAP, ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
On Apr 4, 2007, at 6:17 PM, Reid Spencer wrote: I'm fine with it aborting if you don't want to implement the lowering code. As you'd rather have an abort, I'll change it. Thank you, -Chris ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.400 - 1.401 --- Log message: For PR1297: http://llvm.org/PR1297 : Adjust for changes in the bit counting intrinsics. They all return i32 now so we have to trunc/zext the DAG node accordingly. --- Diffs of the changes: (+31 -24) SelectionDAGISel.cpp | 55 --- 1 files changed, 31 insertions(+), 24 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.400 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.401 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.400Fri Mar 30 23:18:03 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Apr 1 02:34:11 2007 @@ -2328,37 +2328,44 @@ DAG.setRoot(Tmp.getValue(1)); return 0; } - case Intrinsic::bswap_i16: - case Intrinsic::bswap_i32: - case Intrinsic::bswap_i64: + case Intrinsic::bswap: setValue(I, DAG.getNode(ISD::BSWAP, getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1; return 0; - case Intrinsic::cttz_i8: - case Intrinsic::cttz_i16: - case Intrinsic::cttz_i32: - case Intrinsic::cttz_i64: -setValue(I, DAG.getNode(ISD::CTTZ, - getValue(I.getOperand(1)).getValueType(), - getValue(I.getOperand(1; + case Intrinsic::cttz: { +SDOperand Arg = getValue(I.getOperand(1)); +MVT::ValueType Ty = Arg.getValueType(); +SDOperand result = DAG.getNode(ISD::CTTZ, Ty, Arg); +if (Ty MVT::i32) + result = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, result); +else if (Ty MVT::i32) + result = DAG.getNode(ISD::TRUNCATE, MVT::i32, result); +setValue(I, result); return 0; - case Intrinsic::ctlz_i8: - case Intrinsic::ctlz_i16: - case Intrinsic::ctlz_i32: - case Intrinsic::ctlz_i64: -setValue(I, DAG.getNode(ISD::CTLZ, - getValue(I.getOperand(1)).getValueType(), - getValue(I.getOperand(1; + } + case Intrinsic::ctlz: { +SDOperand Arg = getValue(I.getOperand(1)); +MVT::ValueType Ty = Arg.getValueType(); +SDOperand result = DAG.getNode(ISD::CTLZ, Ty, Arg); +if (Ty MVT::i32) + result = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, result); +else if (Ty MVT::i32) + result = DAG.getNode(ISD::TRUNCATE, MVT::i32, result); +setValue(I, result); return 0; - case Intrinsic::ctpop_i8: - case Intrinsic::ctpop_i16: - case Intrinsic::ctpop_i32: - case Intrinsic::ctpop_i64: -setValue(I, DAG.getNode(ISD::CTPOP, - getValue(I.getOperand(1)).getValueType(), - getValue(I.getOperand(1; + } + case Intrinsic::ctpop: { +SDOperand Arg = getValue(I.getOperand(1)); +MVT::ValueType Ty = Arg.getValueType(); +SDOperand result = DAG.getNode(ISD::CTPOP, Ty, Arg); +if (Ty MVT::i32) + result = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, result); +else if (Ty MVT::i32) + result = DAG.getNode(ISD::TRUNCATE, MVT::i32, result); +setValue(I, result); return 0; + } case Intrinsic::stacksave: { SDOperand Op = getRoot(); SDOperand Tmp = DAG.getNode(ISD::STACKSAVE, ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.399 - 1.400 --- Log message: move a bunch of code out of the sdisel pass into its own opt pass codegenprepare. --- Diffs of the changes: (+1 -483) SelectionDAGISel.cpp | 484 --- 1 files changed, 1 insertion(+), 483 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.399 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.400 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.399Tue Mar 27 20:55:52 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Mar 30 23:18:03 2007 @@ -16,7 +16,6 @@ #include llvm/CodeGen/SelectionDAGISel.h #include llvm/CodeGen/ScheduleDAG.h #include llvm/CallingConv.h -#include llvm/Constants.h #include llvm/DerivedTypes.h #include llvm/Function.h #include llvm/GlobalVariable.h @@ -33,14 +32,12 @@ #include llvm/CodeGen/SelectionDAG.h #include llvm/CodeGen/SSARegMap.h #include llvm/Target/MRegisterInfo.h -#include llvm/Target/TargetAsmInfo.h #include llvm/Target/TargetData.h #include llvm/Target/TargetFrameInfo.h #include llvm/Target/TargetInstrInfo.h #include llvm/Target/TargetLowering.h #include llvm/Target/TargetMachine.h #include llvm/Target/TargetOptions.h -#include llvm/Transforms/Utils/BasicBlockUtils.h #include llvm/Support/MathExtras.h #include llvm/Support/Debug.h #include llvm/Support/Compiler.h @@ -3830,496 +3827,17 @@ } void SelectionDAGISel::getAnalysisUsage(AnalysisUsage AU) const { - // FIXME: we only modify the CFG to split critical edges. This - // updates dom and loop info. AU.addRequiredAliasAnalysis(); + AU.setPreservesAll(); } -/// OptimizeNoopCopyExpression - We have determined that the specified cast -/// instruction is a noop copy (e.g. it's casting from one pointer type to -/// another, int-uint, or int-sbyte on PPC. -/// -/// Return true if any changes are made. -static bool OptimizeNoopCopyExpression(CastInst *CI) { - BasicBlock *DefBB = CI-getParent(); - - /// InsertedCasts - Only insert a cast in each block once. - std::mapBasicBlock*, CastInst* InsertedCasts; - - bool MadeChange = false; - for (Value::use_iterator UI = CI-use_begin(), E = CI-use_end(); - UI != E; ) { -Use TheUse = UI.getUse(); -Instruction *User = castInstruction(*UI); - -// Figure out which BB this cast is used in. For PHI's this is the -// appropriate predecessor block. -BasicBlock *UserBB = User-getParent(); -if (PHINode *PN = dyn_castPHINode(User)) { - unsigned OpVal = UI.getOperandNo()/2; - UserBB = PN-getIncomingBlock(OpVal); -} - -// Preincrement use iterator so we don't invalidate it. -++UI; - -// If this user is in the same block as the cast, don't change the cast. -if (UserBB == DefBB) continue; - -// If we have already inserted a cast into this block, use it. -CastInst *InsertedCast = InsertedCasts[UserBB]; - -if (!InsertedCast) { - BasicBlock::iterator InsertPt = UserBB-begin(); - while (isaPHINode(InsertPt)) ++InsertPt; - - InsertedCast = -CastInst::create(CI-getOpcode(), CI-getOperand(0), CI-getType(), , - InsertPt); - MadeChange = true; -} - -// Replace a use of the cast with a use of the new casat. -TheUse = InsertedCast; - } - - // If we removed all uses, nuke the cast. - if (CI-use_empty()) -CI-eraseFromParent(); - - return MadeChange; -} - -/// InsertGEPComputeCode - Insert code into BB to compute Ptr+PtrOffset, -/// casting to the type of GEPI. -static Instruction *InsertGEPComputeCode(Instruction *V, BasicBlock *BB, - Instruction *GEPI, Value *Ptr, - Value *PtrOffset) { - if (V) return V; // Already computed. - - // Figure out the insertion point - BasicBlock::iterator InsertPt; - if (BB == GEPI-getParent()) { -// If GEP is already inserted into BB, insert right after the GEP. -InsertPt = GEPI; -++InsertPt; - } else { -// Otherwise, insert at the top of BB, after any PHI nodes -InsertPt = BB-begin(); -while (isaPHINode(InsertPt)) ++InsertPt; - } - - // If Ptr is itself a cast, but in some other BB, emit a copy of the cast into - // BB so that there is only one value live across basic blocks (the cast - // operand). - if (CastInst *CI = dyn_castCastInst(Ptr)) -if (CI-getParent() != BB isaPointerType(CI-getOperand(0)-getType())) - Ptr = CastInst::create(CI-getOpcode(), CI-getOperand(0), CI-getType(), - , InsertPt); - - // Add the offset, cast it to the right type. - Ptr = BinaryOperator::createAdd(Ptr, PtrOffset, , InsertPt); - // Ptr is an integer type, GEPI is pointer type == IntToPtr - return V = CastInst::create(Instruction::IntToPtr,
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.395 - 1.396 --- Log message: Split big monster into small helpers. No functionality change. --- Diffs of the changes: (+285 -190) SelectionDAGISel.cpp | 475 ++- 1 files changed, 285 insertions(+), 190 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.395 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.396 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.395Mon Mar 26 19:53:36 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Mar 27 06:29:11 2007 @@ -384,6 +384,8 @@ /// processed at this point in the binary search tree. CaseRange Range; }; + + typedef std::vectorCaseRec CaseRecVector; /// The comparison function for sorting Case values. struct CaseCmp { @@ -496,7 +498,23 @@ void visitSwitch(SwitchInst I); void visitUnreachable(UnreachableInst I) { /* noop */ } - // Helper for visitSwitch + // Helpers for visitSwitch + void handleSmallSwitchRange(CaseRec CR, + CaseRecVector WorkList, + Value* SV, + MachineBasicBlock* Default); + void handleJTSwitchCase(CaseRec CR, + CaseRecVector WorkList, + Value* SV, + MachineBasicBlock* Default); + void handleBTSplitSwitchCase(CaseRec CR, + CaseRecVector WorkList, + Value* SV, + MachineBasicBlock* Default); + void handleBTSmallSwitchCase(CaseRec CR, + CaseRecVector WorkList, + Value* SV, + MachineBasicBlock* Default); void visitSwitchCase(SelectionDAGISel::CaseBlock CB); void visitJumpTable(SelectionDAGISel::JumpTable JT); void visitJumpTableHeader(SelectionDAGISel::JumpTable JT, @@ -1208,6 +1226,265 @@ void SelectionDAGLowering::visitUnwind(UnwindInst I) { } +/// handleSmaaSwitchCaseRange - Emit a series of specific tests (suitable for +/// small case ranges). +void SelectionDAGLowering::handleSmallSwitchRange(CaseRec CR, + CaseRecVector WorkList, + Value* SV, + MachineBasicBlock* Default) { + // Get the MachineFunction which holds the current MBB. This is used when + // inserting any additional MBBs necessary to represent the switch. + MachineFunction *CurMF = CurMBB-getParent(); + + // Figure out which block is immediately after the current one. + MachineBasicBlock *NextBlock = 0; + MachineFunction::iterator BBI = CR.CaseBB; + + Case BackCase = *(CR.Range.second-1); + + if (++BBI != CurMBB-getParent()-end()) +NextBlock = BBI; + + // TODO: If any two of the cases has the same destination, and if one value + // is the same as the other, but has one bit unset that the other has set, + // use bit manipulation to do two compares at once. For example: + // if (X == 6 || X == 4) - if ((X|2) == 6) + + // Rearrange the case blocks so that the last one falls through if possible. + if (NextBlock Default != NextBlock BackCase.second != NextBlock) { +// The last case block won't fall through into 'NextBlock' if we emit the +// branches in this order. See if rearranging a case value would help. +for (CaseItr I = CR.Range.first, E = CR.Range.second-1; I != E; ++I) { + if (I-second == NextBlock) { +std::swap(*I, BackCase); +break; + } +} + } + + // Create a CaseBlock record representing a conditional branch to + // the Case's target mbb if the value being switched on SV is equal + // to C. + MachineBasicBlock *CurBlock = CR.CaseBB; + for (CaseItr I = CR.Range.first, E = CR.Range.second; I != E; ++I) { +MachineBasicBlock *FallThrough; +if (I != E-1) { + FallThrough = new MachineBasicBlock(CurBlock-getBasicBlock()); + CurMF-getBasicBlockList().insert(BBI, FallThrough); +} else { + // If the last case doesn't match, go to the default block. + FallThrough = Default; +} + +SelectionDAGISel::CaseBlock CB(ISD::SETEQ, SV, I-first, + I-second, FallThrough, CurBlock); + +// If emitting the first comparison, just call visitSwitchCase to emit the +// code into the current block. Otherwise, push the CaseBlock onto the +// vector to be later processed by SDISel, and insert the node's MBB +// before the next MBB. +if (CurBlock == CurMBB) + visitSwitchCase(CB); +else + SwitchCases.push_back(CB); + +CurBlock = FallThrough; + } +} + +/// handleJTSwitchCase - Emit jumptable for current switch case range +void
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.396 - 1.397 --- Log message: Remove dead code --- Diffs of the changes: (+46 -82) SelectionDAGISel.cpp | 128 ++- 1 files changed, 46 insertions(+), 82 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.396 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.397 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.396Tue Mar 27 06:29:11 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Mar 27 07:05:48 2007 @@ -499,19 +499,15 @@ void visitUnreachable(UnreachableInst I) { /* noop */ } // Helpers for visitSwitch - void handleSmallSwitchRange(CaseRec CR, + bool handleSmallSwitchRange(CaseRec CR, CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default); - void handleJTSwitchCase(CaseRec CR, + bool handleJTSwitchCase(CaseRec CR, CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default); - void handleBTSplitSwitchCase(CaseRec CR, - CaseRecVector WorkList, - Value* SV, - MachineBasicBlock* Default); - void handleBTSmallSwitchCase(CaseRec CR, + bool handleBTSplitSwitchCase(CaseRec CR, CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default); @@ -1228,10 +1224,17 @@ /// handleSmaaSwitchCaseRange - Emit a series of specific tests (suitable for /// small case ranges). -void SelectionDAGLowering::handleSmallSwitchRange(CaseRec CR, +bool SelectionDAGLowering::handleSmallSwitchRange(CaseRec CR, CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default) { + Case BackCase = *(CR.Range.second-1); + + // Size is the number of Cases represented by this range. + unsigned Size = CR.Range.second - CR.Range.first; + if (Size =3) +return false; + // Get the MachineFunction which holds the current MBB. This is used when // inserting any additional MBBs necessary to represent the switch. MachineFunction *CurMF = CurMBB-getParent(); @@ -1240,8 +1243,6 @@ MachineBasicBlock *NextBlock = 0; MachineFunction::iterator BBI = CR.CaseBB; - Case BackCase = *(CR.Range.second-1); - if (++BBI != CurMBB-getParent()-end()) NextBlock = BBI; @@ -1290,16 +1291,36 @@ CurBlock = FallThrough; } + + return true; } /// handleJTSwitchCase - Emit jumptable for current switch case range -void SelectionDAGLowering::handleJTSwitchCase(CaseRec CR, +bool SelectionDAGLowering::handleJTSwitchCase(CaseRec CR, CaseRecVector WorkList, Value* SV, MachineBasicBlock* Default) { + Case FrontCase = *CR.Range.first; + Case BackCase = *(CR.Range.second-1); + + // Size is the number of Cases represented by this range. + unsigned Size = CR.Range.second - CR.Range.first; + + uint64_t First = castConstantInt(FrontCase.first)-getSExtValue(); + uint64_t Last = castConstantInt(BackCase.first)-getSExtValue(); + + if ((!TLI.isOperationLegal(ISD::BR_JT, MVT::Other) + !TLI.isOperationLegal(ISD::BRIND, MVT::Other)) || + Size = 5) +return false; + + double Density = (double)Size / (double)((Last - First) + 1ULL); + if (Density 0.3125) +return false; + // Get the MachineFunction which holds the current MBB. This is used when // inserting any additional MBBs necessary to represent the switch. - MachineFunction *CurMF = CurMBB-getParent(); + MachineFunction *CurMF = CurMBB-getParent(); // Figure out which block is immediately after the current one. MachineBasicBlock *NextBlock = 0; @@ -1308,13 +1329,8 @@ if (++BBI != CurMBB-getParent()-end()) NextBlock = BBI; - Case FrontCase = *CR.Range.first; - Case BackCase = *(CR.Range.second-1); const BasicBlock *LLVMBB = CR.CaseBB-getBasicBlock(); - uint64_t First = castConstantInt(FrontCase.first)-getSExtValue(); - uint64_t Last = castConstantInt(BackCase.first)-getSExtValue(); - // Create a new basic block to hold the code for loading the address // of the jump table, and jumping to it. Update successor information; // we will either branch to the default case for the switch, or the jump @@ -1364,37 +1380,13 @@ visitJumpTableHeader(JT, JTH); JTCases.push_back(SelectionDAGISel::JumpTableBlock(JTH, JT)); -} -/// handleBTSmallSwitchCase - handle leaf in
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.394 - 1.395 --- Log message: SDISel does not preserve all, it changes CFG and other info. --- Diffs of the changes: (+0 -1) SelectionDAGISel.cpp |1 - 1 files changed, 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.394 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.395 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.394Sun Mar 25 10:07:15 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Mar 26 19:53:36 2007 @@ -3776,7 +3776,6 @@ // updates dom and loop info. AU.addRequiredAliasAnalysis(); AU.addRequiredLoopInfo(); - AU.setPreservesAll(); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.393 - 1.394 --- Log message: First step of switch lowering refactoring: perform worklist-driven strategy, emit JT's where possible. --- Diffs of the changes: (+253 -180) SelectionDAGISel.cpp | 433 +-- 1 files changed, 253 insertions(+), 180 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.393 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.394 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.393Sun Mar 25 00:00:54 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Mar 25 10:07:15 2007 @@ -405,7 +405,9 @@ /// SwitchCases - Vector of CaseBlock structures used to communicate /// SwitchInst code generation information. std::vectorSelectionDAGISel::CaseBlock SwitchCases; - SelectionDAGISel::JumpTable JT; + /// JTCases - Vector of JumpTable structures used to communicate + /// SwitchInst code generation information. + std::vectorSelectionDAGISel::JumpTableBlock JTCases; /// FuncInfo - Information about the function as a whole. /// @@ -414,7 +416,7 @@ SelectionDAGLowering(SelectionDAG dag, TargetLowering tli, FunctionLoweringInfo funcinfo) : TLI(tli), DAG(dag), TD(DAG.getTarget().getTargetData()), - JT(0,0,0,0), FuncInfo(funcinfo) { + FuncInfo(funcinfo) { } /// getRoot - Return the current virtual root of the Selection DAG. @@ -497,6 +499,8 @@ // Helper for visitSwitch void visitSwitchCase(SelectionDAGISel::CaseBlock CB); void visitJumpTable(SelectionDAGISel::JumpTable JT); + void visitJumpTableHeader(SelectionDAGISel::JumpTable JT, +SelectionDAGISel::JumpTableHeader JTH); // These all get lowered before this pass. void visitInvoke(InvokeInst I); @@ -1065,7 +1069,7 @@ Cond = DAG.getNode(ISD::XOR, CondLHS.getValueType(), CondLHS, True); } else Cond = DAG.getSetCC(MVT::i1, CondLHS, getValue(CB.CmpRHS), CB.CC); - + // Set NextBlock to be the MBB immediately after the current one, if any. // This is used to avoid emitting unnecessary branches to the next block. MachineBasicBlock *NextBlock = 0; @@ -1092,8 +1096,10 @@ CurMBB-addSuccessor(CB.FalseBB); } +/// visitJumpTable - Emit JumpTable node in the current MBB void SelectionDAGLowering::visitJumpTable(SelectionDAGISel::JumpTable JT) { // Emit the code for the jump table + assert(JT.Reg != -1UL Should lower JT Header first!); MVT::ValueType PTy = TLI.getPointerTy(); SDOperand Index = DAG.getCopyFromReg(getRoot(), JT.Reg, PTy); SDOperand Table = DAG.getJumpTable(JT.JTI, PTy); @@ -1102,6 +1108,57 @@ return; } +/// visitJumpTableHeader - This function emits necessary code to produce index +/// in the JumpTable from switch case. +void SelectionDAGLowering::visitJumpTableHeader(SelectionDAGISel::JumpTable JT, + SelectionDAGISel::JumpTableHeader JTH) { + // Subtract the lowest switch case value from the value being switched on + // and conditional branch to default mbb if the result is greater than the + // difference between smallest and largest cases. + SDOperand SwitchOp = getValue(JTH.SValue); + MVT::ValueType VT = SwitchOp.getValueType(); + SDOperand SUB = DAG.getNode(ISD::SUB, VT, SwitchOp, + DAG.getConstant(JTH.First, VT)); + + // The SDNode we just created, which holds the value being switched on + // minus the the smallest case value, needs to be copied to a virtual + // register so it can be used as an index into the jump table in a + // subsequent basic block. This value may be smaller or larger than the + // target's pointer type, and therefore require extension or truncating. + if (VT TLI.getPointerTy()) +SwitchOp = DAG.getNode(ISD::TRUNCATE, TLI.getPointerTy(), SUB); + else +SwitchOp = DAG.getNode(ISD::ZERO_EXTEND, TLI.getPointerTy(), SUB); + + unsigned JumpTableReg = FuncInfo.MakeReg(TLI.getPointerTy()); + SDOperand CopyTo = DAG.getCopyToReg(getRoot(), JumpTableReg, SwitchOp); + JT.Reg = JumpTableReg; + + // Emit the range check for the jump table, and branch to the default + // block for the switch statement if the value being switched on exceeds + // the largest case in the switch. + SDOperand CMP = DAG.getSetCC(TLI.getSetCCResultTy(), SUB, + DAG.getConstant(JTH.Last-JTH.First,VT), + ISD::SETUGT); + + // Set NextBlock to be the MBB immediately after the current one, if any. + // This is used to avoid emitting unnecessary branches to the next block. + MachineBasicBlock *NextBlock = 0; + MachineFunction::iterator BBI = CurMBB; + if (++BBI != CurMBB-getParent()-end()) +NextBlock = BBI; + + SDOperand BrCond = DAG.getNode(ISD::BRCOND, MVT::Other, CopyTo, CMP, +
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp TargetLowering.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.391 - 1.392 TargetLowering.cpp updated: 1.99 - 1.100 --- Log message: switch TargetLowering::getConstraintType to take the entire constraint, not just the first letter. No functionality change. --- Diffs of the changes: (+28 -24) SelectionDAGISel.cpp |8 TargetLowering.cpp | 44 2 files changed, 28 insertions(+), 24 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.391 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.392 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.391Thu Mar 22 11:38:57 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Mar 24 21:14:49 2007 @@ -2633,9 +2633,9 @@ std::string *Current = C[0]; // If we have multiple constraints, try to pick the most general one ahead // of time. This isn't a wonderful solution, but handles common cases. - TargetLowering::ConstraintType Flavor = TLI.getConstraintType(Current[0][0]); + TargetLowering::ConstraintType Flavor = TLI.getConstraintType(Current[0]); for (unsigned j = 1, e = C.size(); j != e; ++j) { -TargetLowering::ConstraintType ThisFlavor = TLI.getConstraintType(C[j][0]); +TargetLowering::ConstraintType ThisFlavor = TLI.getConstraintType(C[j]); if (getConstraintGenerality(ThisFlavor) getConstraintGenerality(Flavor)) { // This constraint letter is more general than the previous one, @@ -2748,7 +2748,7 @@ case InlineAsm::isOutput: { TargetLowering::ConstraintType CTy = TargetLowering::C_RegisterClass; if (ConstraintCode.size() == 1) // not a physreg name. -CTy = TLI.getConstraintType(ConstraintCode[0]); +CTy = TLI.getConstraintType(ConstraintCode); if (CTy == TargetLowering::C_Memory) { // Memory output. @@ -2863,7 +2863,7 @@ TargetLowering::ConstraintType CTy = TargetLowering::C_RegisterClass; if (ConstraintCode.size() == 1) // not a physreg name. -CTy = TLI.getConstraintType(ConstraintCode[0]); +CTy = TLI.getConstraintType(ConstraintCode); if (CTy == TargetLowering::C_Other) { InOperandVal = TLI.isOperandValidForConstraint(InOperandVal, Index: llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp diff -u llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.99 llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.100 --- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1.99 Wed Mar 21 16:51:52 2007 +++ llvm/lib/CodeGen/SelectionDAG/TargetLowering.cppSat Mar 24 21:14:49 2007 @@ -1828,28 +1828,32 @@ //===--===// TargetLowering::ConstraintType -TargetLowering::getConstraintType(char ConstraintLetter) const { +TargetLowering::getConstraintType(const std::string Constraint) const { // FIXME: lots more standard ones to handle. - switch (ConstraintLetter) { - default: return C_Unknown; - case 'r': return C_RegisterClass; - case 'm':// memory - case 'o':// offsetable - case 'V':// not offsetable -return C_Memory; - case 'i':// Simple Integer or Relocatable Constant - case 'n':// Simple Integer - case 's':// Relocatable Constant - case 'I':// Target registers. - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': -return C_Other; + if (Constraint.size() == 1) { +switch (Constraint[0]) { +default: break; +case 'r': return C_RegisterClass; +case 'm':// memory +case 'o':// offsetable +case 'V':// not offsetable + return C_Memory; +case 'i':// Simple Integer or Relocatable Constant +case 'n':// Simple Integer +case 's':// Relocatable Constant +case 'I':// Target registers. +case 'J': +case 'K': +case 'L': +case 'M': +case 'N': +case 'O': +case 'P': + return C_Other; +} } + // TODO: Handle registers. + return C_Unknown; } /// isOperandValidForConstraint - Return the specified operand (possibly ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.392 - 1.393 --- Log message: Implement support for vector operands to inline asm, implementing CodeGen/X86/2007-03-24-InlineAsmVectorOp.ll --- Diffs of the changes: (+16 -4) SelectionDAGISel.cpp | 20 1 files changed, 16 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.392 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.393 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.392Sat Mar 24 21:14:49 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Mar 25 00:00:54 2007 @@ -2387,14 +2387,23 @@ if (RegVT == ValueVT) return Val; + if (MVT::isVector(RegVT)) { +assert(ValueVT == MVT::Vector Unknown vector conversion!); +return DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, Val, + DAG.getConstant(MVT::getVectorNumElements(RegVT), + MVT::i32), + DAG.getValueType(MVT::getVectorBaseType(RegVT))); + } + if (MVT::isInteger(RegVT)) { if (ValueVT RegVT) return DAG.getNode(ISD::TRUNCATE, ValueVT, Val); else return DAG.getNode(ISD::ANY_EXTEND, ValueVT, Val); - } else { -return DAG.getNode(ISD::FP_ROUND, ValueVT, Val); } + + assert(MVT::isFloatingPoint(RegVT) MVT::isFloatingPoint(ValueVT)); + return DAG.getNode(ISD::FP_ROUND, ValueVT, Val); } /// getCopyToRegs - Emit a series of CopyToReg nodes that copies the @@ -2407,7 +2416,10 @@ // If there is a single register and the types differ, this must be // a promotion. if (RegVT != ValueVT) { - if (MVT::isInteger(RegVT)) { + if (MVT::isVector(RegVT)) { +assert(Val.getValueType() == MVT::Vector Not a vector-vector cast?); +Val = DAG.getNode(ISD::VBIT_CONVERT, RegVT, Val); + } else if (MVT::isInteger(RegVT)) { if (RegVT ValueVT) Val = DAG.getNode(ISD::TRUNCATE, RegVT, Val); else @@ -3424,7 +3436,7 @@ // If this value was promoted, truncate it down. if (ResVal.getValueType() != VT) { if (VT == MVT::Vector) { - // Insert a VBITCONVERT to convert from the packed result type to the + // Insert a VBIT_CONVERT to convert from the packed result type to the // MVT::Vector type. unsigned NumElems = castVectorType(RetTy)-getNumElements(); const Type *EltTy = castVectorType(RetTy)-getElementType(); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.390 - 1.391 --- Log message: Change uses of Function::front to Function::getEntryBlock for readability. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.390 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.391 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.390Tue Mar 20 14:32:11 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Mar 22 11:38:57 2007 @@ -4328,7 +4328,7 @@ std::vectorSDOperand UnorderedChains; // Lower any arguments needed in this block if this is the entry block. - if (LLVMBB == LLVMBB-getParent()-front()) + if (LLVMBB == LLVMBB-getParent()-getEntryBlock()) LowerArguments(LLVMBB, SDL, UnorderedChains); BB = FuncInfo.MBBMap[LLVMBB]; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.389 - 1.390 --- Log message: Minor bug. --- Diffs of the changes: (+2 -1) SelectionDAGISel.cpp |3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.389 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.390 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.389Sat Mar 17 03:53:30 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Mar 20 14:32:11 2007 @@ -4009,7 +4009,8 @@ // Check if it is possible to fold the expression to address mode. if (UseTy -TLI.isLegalAddressExpression(Instruction::Add, BinOp-getOperand(0), +TLI.isLegalAddressExpression(BinOp-getOpcode(), + BinOp-getOperand(0), BinOp-getOperand(1), UseTy)) { DestBBs.insert(UserBB); MadeChange = true; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.388 - 1.389 --- Log message: Use SmallSet instead of std::set. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.388 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.389 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.388Sat Mar 17 03:22:49 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Mar 17 03:53:30 2007 @@ -3983,7 +3983,7 @@ return false; // DestBBs - These are the blocks where a copy of BinOp will be inserted. - std::setBasicBlock* DestBBs; + SmallSetBasicBlock*, 8 DestBBs; BasicBlock *DefBB = BinOp-getParent(); bool MadeChange = false; for (Value::use_iterator UI = BinOp-use_begin(), E = BinOp-use_end(); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.384 - 1.385 --- Log message: Sink a binary expression into its use blocks if it is a loop invariant computation used as GEP indexes and if the expression can be folded into target addressing mode of GEP load / store use types. --- Diffs of the changes: (+92 -0) SelectionDAGISel.cpp | 92 +++ 1 files changed, 92 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.384 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.385 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.384Thu Mar 8 16:29:47 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Mar 16 03:46:27 2007 @@ -13,6 +13,7 @@ #define DEBUG_TYPE isel #include llvm/Analysis/AliasAnalysis.h +#include llvm/Analysis/LoopInfo.h #include llvm/CodeGen/SelectionDAGISel.h #include llvm/CodeGen/ScheduleDAG.h #include llvm/CallingConv.h @@ -58,6 +59,9 @@ static const bool ViewISelDAGs = 0, ViewSchedDAGs = 0; #endif +static cl::optbool +EnableGEPIndexSink(enable-gep-index-sinking, cl::Hidden, + cl::desc(Sink invariant GEP index computation into use blocks)); //===-===// /// @@ -3703,6 +3707,8 @@ // FIXME: we only modify the CFG to split critical edges. This // updates dom and loop info. AU.addRequiredAliasAnalysis(); + AU.addRequiredLoopInfo(); + AU.setPreservesAll(); } @@ -3959,6 +3965,88 @@ return true; } +/// isLoopInvariantInst - Returns true if all operands of the instruction are +/// loop invariants in the specified loop. +static bool isLoopInvariantInst(Instruction *I, Loop *L) { + // The instruction is loop invariant if all of its operands are loop-invariant + for (unsigned i = 0, e = I-getNumOperands(); i != e; ++i) +if (!L-isLoopInvariant(I-getOperand(i))) + return false; + return true; +} + +/// SinkInvariantGEPIndex - If a GEP instruction has a variable index that has +/// been hoisted out of the loop by LICM pass, sink it back into the use BB +/// if it can be determined that the index computation can be folded into the +/// addressing mode of the load / store uses. +static bool SinkInvariantGEPIndex(BinaryOperator *BinOp, LoopInfo *loopInfo, + const TargetLowering TLI) { + if (!EnableGEPIndexSink) +return false; + + // Only look at Add / Sub for now. + if (BinOp-getOpcode() != Instruction::Add + BinOp-getOpcode() != Instruction::Sub) +return false; + + /// InsertedOps - Only insert a duplicate in each block once. + std::mapBasicBlock*, BinaryOperator* InsertedOps; + + bool MadeChange = false; + BasicBlock *DefBB = BinOp-getParent(); + for (Value::use_iterator UI = BinOp-use_begin(), E = BinOp-use_end(); + UI != E; ) { +Instruction *User = castInstruction(*UI); + +// Preincrement use iterator so we don't invalidate it. +++UI; + +// Only look for GEP use in another block. +if (User-getParent() == DefBB) continue; + +if (isaGetElementPtrInst(User)) { + BasicBlock *UserBB = User-getParent(); + Loop *L = loopInfo-getLoopFor(UserBB); + + // Only sink if expression is a loop invariant in the use BB. + if (isLoopInvariantInst(BinOp, L) !User-use_empty()) { +const Type *UseTy = NULL; +// FIXME: We are assuming all the uses of the GEP will have the +// same type. +Instruction *GEPUser = castInstruction(*User-use_begin()); +if (LoadInst *Load = dyn_castLoadInst(GEPUser)) + UseTy = Load-getType(); +else if (StoreInst *Store = dyn_castStoreInst(GEPUser)) + UseTy = Store-getOperand(0)-getType(); + +// Check if it is possible to fold the expression to address mode. +if (UseTy +TLI.isLegalAddressExpression(Instruction::Add, BinOp-getOperand(0), + BinOp-getOperand(1), UseTy)) { + // Sink it into user block. + BinaryOperator *InsertedOp = InsertedOps[UserBB]; + if (!InsertedOp) { +BasicBlock::iterator InsertPt = UserBB-begin(); +while (isaPHINode(InsertPt)) ++InsertPt; + +InsertedOp = + BinaryOperator::create(BinOp-getOpcode(), BinOp-getOperand(0), + BinOp-getOperand(1), , InsertPt); + } + + User-replaceUsesOfWith(BinOp, InsertedOp); + MadeChange = true; +} + } +} + } + + if (BinOp-use_empty()) + BinOp-eraseFromParent(); + + return MadeChange; +} + /// SplitEdgeNicely - Split the critical edge from TI to it's specified /// successor if it will improve codegen. We only do this if the successor has @@ -4021,6 +4109,8 @@ RegMap = MF.getSSARegMap(); DOUT \n\n\n=== Fn.getName()
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.385 - 1.386 --- Log message: Stupid bug. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.385 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.386 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.385Fri Mar 16 03:46:27 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Mar 16 12:50:20 2007 @@ -4009,7 +4009,7 @@ Loop *L = loopInfo-getLoopFor(UserBB); // Only sink if expression is a loop invariant in the use BB. - if (isLoopInvariantInst(BinOp, L) !User-use_empty()) { + if (L isLoopInvariantInst(BinOp, L) !User-use_empty()) { const Type *UseTy = NULL; // FIXME: We are assuming all the uses of the GEP will have the // same type. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.386 - 1.387 --- Log message: Turn on GEP index sinking by default. --- Diffs of the changes: (+0 -7) SelectionDAGISel.cpp |7 --- 1 files changed, 7 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.386 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.387 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.386Fri Mar 16 12:50:20 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Mar 16 13:32:30 2007 @@ -59,10 +59,6 @@ static const bool ViewISelDAGs = 0, ViewSchedDAGs = 0; #endif -static cl::optbool -EnableGEPIndexSink(enable-gep-index-sinking, cl::Hidden, - cl::desc(Sink invariant GEP index computation into use blocks)); - //===-===// /// /// RegisterScheduler class - Track the registration of instruction schedulers. @@ -3981,9 +3977,6 @@ /// addressing mode of the load / store uses. static bool SinkInvariantGEPIndex(BinaryOperator *BinOp, LoopInfo *loopInfo, const TargetLowering TLI) { - if (!EnableGEPIndexSink) -return false; - // Only look at Add / Sub for now. if (BinOp-getOpcode() != Instruction::Add BinOp-getOpcode() != Instruction::Sub) ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.383 - 1.384 --- Log message: implement support for floating point constants used as inline asm memory operands. --- Diffs of the changes: (+7 -2) SelectionDAGISel.cpp |9 +++-- 1 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.383 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.384 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.383Thu Mar 8 01:07:03 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Mar 8 16:29:47 2007 @@ -2882,9 +2882,14 @@ } else if (CTy == TargetLowering::C_Memory) { // Memory input. -// Check that the operand isn't a float. +// If the operand is a float, spill to a constant pool entry to get its +// address. +if (ConstantFP *Val = dyn_castConstantFP(I.getOperand(OpNum-1))) + InOperandVal = DAG.getConstantPool(Val, TLI.getPointerTy()); + if (!MVT::isInteger(InOperandVal.getValueType())) { - cerr Match failed, can't handle floats yet!\n; + cerr Match failed, cannot handle this yet!\n; + InOperandVal.Val-dump(); exit(1); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
// FIXME: Distinguish between a formal with no [sz]ext attribute from one // that is zero extended! if (FTy-paramHasAttr(j, FunctionType::ZExtAttribute)) - Flags |= 0; + Flags = ~(SDISelParamFlags::Signed); this should set the zext bit. case Promote: if (MVT::isInteger(VT)) { -unsigned ExtOp = isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; +unsigned ExtOp = Args[i].isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; Op = DAG.getNode(ExtOp, getTypeToTransformTo(VT), Op); } else { assert(MVT::isFloatingPoint(VT) Not int or FP?); This should use ZERO_EXTEND if zext, SIGN_EXTEND if sext, and ANY_EXTEND if neither, -Chris ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.380 - 1.381 --- Log message: Enumerate SDISel formal parameter attributes. Make use of new enumeration. --- Diffs of the changes: (+24 -22) SelectionDAGISel.cpp | 46 -- 1 files changed, 24 insertions(+), 22 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.380 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.381 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.380Sun Mar 4 18:00:42 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Mar 6 00:10:33 2007 @@ -3099,22 +3099,21 @@ for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I, ++j) { MVT::ValueType VT = getValueType(I-getType()); -bool isInReg = FTy-paramHasAttr(j, FunctionType::InRegAttribute); -bool isSRet = FTy-paramHasAttr(j, FunctionType::StructRetAttribute); +unsigned Flags = SDISelParamFlags::NoFlagSet; unsigned OriginalAlignment = getTargetData()-getABITypeAlignment(I-getType()); -// Flags[31:27] - OriginalAlignment -// Flags[2] - isSRet -// Flags[1] - isInReg -// Flags[0] - isSigned -unsigned Flags = (isInReg 1) | (isSRet 2) | (OriginalAlignment 27); // FIXME: Distinguish between a formal with no [sz]ext attribute from one // that is zero extended! if (FTy-paramHasAttr(j, FunctionType::ZExtAttribute)) - Flags |= 0; + Flags = ~(SDISelParamFlags::Signed); if (FTy-paramHasAttr(j, FunctionType::SExtAttribute)) - Flags |= 1; + Flags |= SDISelParamFlags::Signed; +if (FTy-paramHasAttr(j, FunctionType::InRegAttribute)) + Flags |= SDISelParamFlags::InReg; +if (FTy-paramHasAttr(j, FunctionType::StructRetAttribute)) + Flags |= SDISelParamFlags::StructReturn; +Flags |= (OriginalAlignment SDISelParamFlags::OrigAlignmentOffs); switch (getTypeAction(VT)) { default: assert(0 Unknown type action!); @@ -3136,7 +3135,9 @@ 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 0x07ff) | (1 27); + if (i 0) +Flags = (Flags (~SDISelParamFlags::OrigAlignment)) | + (1 SDISelParamFlags::OrigAlignmentOffs); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); } } else { @@ -3245,7 +3246,8 @@ if (TLI.getTypeAction(VT) != TargetLowering::Expand) { // if it isn't first piece, alignment must be 1 if (!isFirst) - Flags = (Flags 0x07ff) | (1 27); + Flags = (Flags (~SDISelParamFlags::OrigAlignment)) | +(1 SDISelParamFlags::OrigAlignmentOffs); Ops.push_back(Arg); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); return; @@ -3292,18 +3294,18 @@ for (unsigned i = 0, e = Args.size(); i != e; ++i) { MVT::ValueType VT = getValueType(Args[i].Ty); SDOperand Op = Args[i].Node; -bool isSigned = Args[i].isSigned; -bool isInReg = Args[i].isInReg; -bool isSRet = Args[i].isSRet; +unsigned Flags = SDISelParamFlags::NoFlagSet; unsigned OriginalAlignment = getTargetData()-getABITypeAlignment(Args[i].Ty); -// Flags[31:27] - OriginalAlignment -// Flags[2] - isSRet -// Flags[1] - isInReg -// Flags[0] - isSigned -unsigned Flags = (isSRet 2) | (isInReg 1) | unsigned(isSigned) | - (OriginalAlignment 27); - + +if (Args[i].isSigned) + Flags |= SDISelParamFlags::Signed; +if (Args[i].isInReg) + Flags |= SDISelParamFlags::InReg; +if (Args[i].isSRet) + Flags |= SDISelParamFlags::StructReturn; +Flags |= OriginalAlignment SDISelParamFlags::OrigAlignmentOffs; + switch (getTypeAction(VT)) { default: assert(0 Unknown type action!); case Legal: @@ -3312,7 +3314,7 @@ break; case Promote: if (MVT::isInteger(VT)) { -unsigned ExtOp = isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; +unsigned ExtOp = Args[i].isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; Op = DAG.getNode(ExtOp, getTypeToTransformTo(VT), Op); } else { assert(MVT::isFloatingPoint(VT) Not int or FP?); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.379 - 1.380 --- Log message: Unbreak VC++ build. --- Diffs of the changes: (+1 -1) SelectionDAGISel.cpp |2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.379 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.380 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.379Thu Mar 1 14:24:30 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Mar 4 18:00:42 2007 @@ -3301,7 +3301,7 @@ // Flags[2] - isSRet // Flags[1] - isInReg // Flags[0] - isSigned -unsigned Flags = (isSRet 2) | (isInReg 1) | isSigned | +unsigned Flags = (isSRet 2) | (isInReg 1) | unsigned(isSigned) | (OriginalAlignment 27); switch (getTypeAction(VT)) { ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.378 - 1.379 --- Log message: Lower eh filter intrinsic. --- Diffs of the changes: (+4 -1) SelectionDAGISel.cpp |5 - 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.378 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.379 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.378Wed Feb 28 12:37:04 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Mar 1 14:24:30 2007 @@ -2110,7 +2110,8 @@ return 0; } - case Intrinsic::eh_selector: { + case Intrinsic::eh_selector: + case Intrinsic::eh_filter:{ MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); if (MMI) { @@ -2120,6 +2121,8 @@ isaFunction(CE-getOperand(0)) Personality should be a function); MMI-addPersonality(CurMBB, castFunction(CE-getOperand(0))); + if (Intrinsic == Intrinsic::eh_filter) +MMI-setIsFilterLandingPad(CurMBB); // Gather all the type infos for this landing pad and pass them along to // MachineModuleInfo. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.377 - 1.378 --- Log message: MERGE_VALUES unnecessary. --- Diffs of the changes: (+4 -12) SelectionDAGISel.cpp | 16 1 files changed, 4 insertions(+), 12 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.377 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.378 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.377Sun Feb 25 20:56:58 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Feb 28 12:37:04 2007 @@ -2105,16 +2105,12 @@ setValue(I, Op); DAG.setRoot(Op.getValue(1)); } else { - SDOperand Op = DAG.getNode(ISD::MERGE_VALUES, TLI.getPointerTy(), - DAG.getConstant(0, TLI.getPointerTy()), - DAG.getRoot()); - setValue(I, Op); - DAG.setRoot(Op.getValue(1)); + setValue(I, DAG.getConstant(0, TLI.getPointerTy())); } return 0; } - case Intrinsic::eh_handlers: { + case Intrinsic::eh_selector: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); if (MMI) { @@ -2147,7 +2143,7 @@ if (Reg) CurMBB-addLiveIn(Reg); // Insert the EHSELECTION instruction. - SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); + SDVTList VTs = DAG.getVTList(MVT::i32, MVT::Other); SDOperand Ops[2]; Ops[0] = getValue(I.getOperand(1)); Ops[1] = getRoot(); @@ -2155,11 +2151,7 @@ setValue(I, Op); DAG.setRoot(Op.getValue(1)); } else { - SDOperand Op = DAG.getNode(ISD::MERGE_VALUES, TLI.getPointerTy(), - DAG.getConstant(0, TLI.getPointerTy()), - getValue(I.getOperand(1))); - setValue(I, Op); - DAG.setRoot(Op.getValue(1)); + setValue(I, DAG.getConstant(0, MVT::i32)); } return 0; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.375 - 1.376 --- Log message: Fix for PR1224: http://llvm.org/PR1224 . --- Diffs of the changes: (+50 -35) SelectionDAGISel.cpp | 85 ++- 1 files changed, 50 insertions(+), 35 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.375 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.376 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.375Sun Feb 25 12:40:32 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Feb 25 15:43:59 2007 @@ -500,6 +500,7 @@ // These all get lowered before this pass. void visitInvoke(InvokeInst I); + void visitInvoke(InvokeInst I, bool AsTerminator); void visitUnwind(UnwindInst I); void visitScalarBinary(User I, unsigned OpCode); @@ -1102,44 +1103,49 @@ } void SelectionDAGLowering::visitInvoke(InvokeInst I) { + assert(0 Should never be visited directly); +} +void SelectionDAGLowering::visitInvoke(InvokeInst I, bool AsTerminator) { // Retrieve successors. MachineBasicBlock *Return = FuncInfo.MBBMap[I.getSuccessor(0)]; MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)]; - // Mark landing pad so that it doesn't get deleted in branch folding. - LandingPad-setIsLandingPad(); - - // Insert a label before the invoke call to mark the try range. - // This can be used to detect deletion of the invoke via the - // MachineModuleInfo. - MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); - unsigned BeginLabel = MMI-NextLabelID(); - DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), - DAG.getConstant(BeginLabel, MVT::i32))); - - LowerCallTo(I, I.getCalledValue()-getType(), - I.getCallingConv(), - false, - getValue(I.getOperand(0)), - 3); - - // Insert a label before the invoke call to mark the try range. - // This can be used to detect deletion of the invoke via the - // MachineModuleInfo. - unsigned EndLabel = MMI-NextLabelID(); - DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), - DAG.getConstant(EndLabel, MVT::i32))); - - // Inform MachineModuleInfo of range. - MMI-addInvoke(LandingPad, BeginLabel, EndLabel); - - // Drop into normal successor. - DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(), - DAG.getBasicBlock(Return))); - - // Update successor info - CurMBB-addSuccessor(Return); - CurMBB-addSuccessor(LandingPad); + if (!AsTerminator) { +// Mark landing pad so that it doesn't get deleted in branch folding. +LandingPad-setIsLandingPad(); + +// Insert a label before the invoke call to mark the try range. +// This can be used to detect deletion of the invoke via the +// MachineModuleInfo. +MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); +unsigned BeginLabel = MMI-NextLabelID(); +DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), +DAG.getConstant(BeginLabel, MVT::i32))); + +LowerCallTo(I, I.getCalledValue()-getType(), + I.getCallingConv(), + false, + getValue(I.getOperand(0)), + 3); + +// Insert a label before the invoke call to mark the try range. +// This can be used to detect deletion of the invoke via the +// MachineModuleInfo. +unsigned EndLabel = MMI-NextLabelID(); +DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), +DAG.getConstant(EndLabel, MVT::i32))); + +// Inform MachineModuleInfo of range. +MMI-addInvoke(LandingPad, BeginLabel, EndLabel); + +// Update successor info +CurMBB-addSuccessor(Return); +CurMBB-addSuccessor(LandingPad); + } else { +// Drop into normal successor. +DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(), +DAG.getBasicBlock(Return))); + } } void SelectionDAGLowering::visitUnwind(UnwindInst I) { @@ -4216,6 +4222,10 @@ for (BasicBlock::iterator I = LLVMBB-begin(), E = --LLVMBB-end(); I != E; ++I) SDL.visit(*I); + + // Lower call part of invoke. + InvokeInst *Invoke = dyn_castInvokeInst(LLVMBB-getTerminator()); + if (Invoke) SDL.visitInvoke(*Invoke, false); // Ensure that all instructions which are used outside of their defining // blocks are available as virtual registers. @@ -4328,7 +4338,12 @@ } // Lower the terminator after the copies are emitted. - SDL.visit(*LLVMBB-getTerminator()); + if (Invoke) { +// Just the branch part of invoke. +SDL.visitInvoke(*Invoke, true); + } else { +SDL.visit(*LLVMBB-getTerminator()); + } // Copy over
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.376 - 1.377 --- Log message: track signedness of formal argument, though we have a fixme here. --- Diffs of the changes: (+8 -0) SelectionDAGISel.cpp |8 1 files changed, 8 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.376 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.377 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.376Sun Feb 25 15:43:59 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sun Feb 25 20:56:58 2007 @@ -3111,8 +3111,16 @@ // Flags[31:27] - OriginalAlignment // Flags[2] - isSRet // Flags[1] - isInReg +// Flags[0] - isSigned unsigned Flags = (isInReg 1) | (isSRet 2) | (OriginalAlignment 27); +// FIXME: Distinguish between a formal with no [sz]ext attribute from one +// that is zero extended! +if (FTy-paramHasAttr(j, FunctionType::ZExtAttribute)) + Flags |= 0; +if (FTy-paramHasAttr(j, FunctionType::SExtAttribute)) + Flags |= 1; + switch (getTypeAction(VT)) { default: assert(0 Unknown type action!); case Legal: ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.373 - 1.374 --- Log message: Deal with cases when MMI is not requested. --- Diffs of the changes: (+14 -0) SelectionDAGISel.cpp | 14 ++ 1 files changed, 14 insertions(+) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.373 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.374 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.373Fri Feb 23 15:45:01 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Feb 24 03:45:44 2007 @@ -2101,6 +2101,12 @@ SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1); setValue(I, Op); DAG.setRoot(Op.getValue(1)); +} else { + SDOperand Op = DAG.getNode(ISD::MERGE_VALUES, TLI.getPointerTy(), + DAG.getConstant(0, TLI.getPointerTy()), + DAG.getRoot()); + setValue(I, Op); + DAG.setRoot(Op.getValue(1)); } return 0; } @@ -2145,6 +2151,12 @@ SDOperand Op = DAG.getNode(ISD::EHSELECTION, VTs, Ops, 2); setValue(I, Op); DAG.setRoot(Op.getValue(1)); +} else { + SDOperand Op = DAG.getNode(ISD::MERGE_VALUES, TLI.getPointerTy(), + DAG.getConstant(0, TLI.getPointerTy()), + getValue(I.getOperand(1))); + setValue(I, Op); + DAG.setRoot(Op.getValue(1)); } return 0; @@ -2169,6 +2181,8 @@ unsigned TypeID = MMI-getTypeIDFor(GV); setValue(I, DAG.getConstant(TypeID, MVT::i32)); +} else { + setValue(I, DAG.getConstant(0, MVT::i32)); } return 0; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.372 - 1.373 --- Log message: Handle improper cast. --- Diffs of the changes: (+19 -6) SelectionDAGISel.cpp | 25 +++-- 1 files changed, 19 insertions(+), 6 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.372 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.373 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.372Thu Feb 22 10:10:05 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Feb 23 15:45:01 2007 @@ -484,7 +484,9 @@ unsigned Opc); bool isExportableFromCurrentBlock(Value *V, const BasicBlock *FromBB); void ExportFromCurrentBlock(Value *V); - void LowerCallTo(CallInst I, SDOperand Callee, unsigned OpIdx); + void LowerCallTo(Instruction I, + const Type *CalledValueTy, unsigned CallingConv, + bool IsTailCall, SDOperand Callee, unsigned OpIdx); // Terminator instructions. void visitRet(ReturnInst I); @@ -1118,7 +1120,11 @@ DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), DAG.getConstant(BeginLabel, MVT::i32))); - LowerCallTo((CallInst)I, getValue(I.getOperand(0)), 3); + LowerCallTo(I, I.getCalledValue()-getType(), + I.getCallingConv(), + false, + getValue(I.getOperand(0)), + 3); // Insert a label before the invoke call to mark the try range. // This can be used to detect deletion of the invoke via the @@ -2246,9 +2252,12 @@ } -void SelectionDAGLowering::LowerCallTo(CallInst I, +void SelectionDAGLowering::LowerCallTo(Instruction I, + const Type *CalledValueTy, + unsigned CallingConv, + bool IsTailCall, SDOperand Callee, unsigned OpIdx) { - const PointerType *PT = castPointerType(I.getCalledValue()-getType()); + const PointerType *PT = castPointerType(CalledValueTy); const FunctionType *FTy = castFunctionType(PT-getElementType()); TargetLowering::ArgListTy Args; @@ -2267,7 +2276,7 @@ std::pairSDOperand,SDOperand Result = TLI.LowerCallTo(getRoot(), I.getType(), FTy-paramHasAttr(0,FunctionType::SExtAttribute), -FTy-isVarArg(), I.getCallingConv(), I.isTailCall(), +FTy-isVarArg(), CallingConv, IsTailCall, Callee, Args, DAG); if (I.getType() != Type::VoidTy) setValue(I, Result.first); @@ -2333,7 +2342,11 @@ else Callee = DAG.getExternalSymbol(RenameFn, TLI.getPointerTy()); - LowerCallTo(I, Callee, 1); + LowerCallTo(I, I.getCalledValue()-getType(), + I.getCallingConv(), + I.isTailCall(), + Callee, + 1); } ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.370 - 1.371 --- Log message: Handle lowering invoke to call correctly. --- Diffs of the changes: (+97 -95) SelectionDAGISel.cpp | 192 +-- 1 files changed, 97 insertions(+), 95 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.370 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.371 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.370Wed Feb 21 16:53:45 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Feb 22 09:38:06 2007 @@ -484,7 +484,8 @@ unsigned Opc); bool isExportableFromCurrentBlock(Value *V, const BasicBlock *FromBB); void ExportFromCurrentBlock(Value *V); - + void LowerCallTo(CallInst I, SDOperand Callee, unsigned OpIdx); + // Terminator instructions. void visitRet(ReturnInst I); void visitBr(BranchInst I); @@ -1117,17 +1118,7 @@ DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(), DAG.getConstant(BeginLabel, MVT::i32))); - // Insert a normal call instruction. - std::vectorValue* Args; - for (InvokeInst::op_iterator OI = I.op_begin() + 3, E = I.op_end(); - OI != E; ++OI) { -Args.push_back(*OI); - } - CallInst *NewCall = new CallInst(I.getCalledValue(), Args[0], Args.size(), - I.getName(), I); - NewCall-setCallingConv(I.getCallingConv()); - I.replaceAllUsesWith(NewCall); - visitCall(*NewCall); + LowerCallTo((CallInst)I, getValue(I.getOperand(0)), 3); // Insert a label before the invoke call to mark the try range. // This can be used to detect deletion of the invoke via the @@ -2086,84 +2077,87 @@ case Intrinsic::eh_exception: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); -// Add a label to mark the beginning of the landing pad. Deletion of the -// landing pad can thus be detected via the MachineModuleInfo. -unsigned LabelID = MMI-addLandingPad(CurMBB); -DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, DAG.getEntryNode(), -DAG.getConstant(LabelID, MVT::i32))); - -// Mark exception register as live in. -const MRegisterInfo *MRI = DAG.getTarget().getRegisterInfo(); -unsigned Reg = MRI-getEHExceptionRegister(); -if (Reg) CurMBB-addLiveIn(Reg); - -// Insert the EXCEPTIONADDR instruction. -SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); -SDOperand Ops[1]; -Ops[0] = DAG.getRoot(); -SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1); -setValue(I, Op); -DAG.setRoot(Op.getValue(1)); - +if (MMI) { + // Add a label to mark the beginning of the landing pad. Deletion of the + // landing pad can thus be detected via the MachineModuleInfo. + unsigned LabelID = MMI-addLandingPad(CurMBB); + DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, DAG.getEntryNode(), + DAG.getConstant(LabelID, MVT::i32))); + + // Mark exception register as live in. + unsigned Reg = TLI.getExceptionAddressRegister(); + if (Reg) CurMBB-addLiveIn(Reg); + + // Insert the EXCEPTIONADDR instruction. + SDVTList VTs = DAG.getVTList(TLI.getPointerTy(), MVT::Other); + SDOperand Ops[1]; + Ops[0] = DAG.getRoot(); + SDOperand Op = DAG.getNode(ISD::EXCEPTIONADDR, VTs, Ops, 1); + setValue(I, Op); + DAG.setRoot(Op.getValue(1)); +} return 0; } case Intrinsic::eh_handlers: { MachineModuleInfo *MMI = DAG.getMachineModuleInfo(); -// Inform the MachineModuleInfo of the personality for this landing pad. -if (ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(2))) { - if (CE-getOpcode() == Instruction::BitCast) { - MMI-addPersonality(CurMBB, - castFunction(CE-getOperand(0))); - } -} - -// Gather all the type infos for this landing pad and pass them along to -// MachineModuleInfo. -std::vectorGlobalVariable * TyInfo; -for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { - if (ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(i))) { +if (MMI) { + // Inform the MachineModuleInfo of the personality for this landing pad. + if (ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(2))) { if (CE-getOpcode() == Instruction::BitCast) { - TyInfo.push_back(castGlobalVariable(CE-getOperand(0))); - continue; +MMI-addPersonality(CurMBB, +castFunction(CE-getOperand(0))); } } - TyInfo.push_back(NULL); + // Gather all the type infos for this landing pad and pass them along to + // MachineModuleInfo. + std::vectorGlobalVariable * TyInfo; + for
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.371 - 1.372 --- Log message: Tighten up error checking of args. --- Diffs of the changes: (+23 -17) SelectionDAGISel.cpp | 40 +++- 1 files changed, 23 insertions(+), 17 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.371 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.372 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.371Thu Feb 22 09:38:06 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Feb 22 10:10:05 2007 @@ -2104,25 +2104,26 @@ if (MMI) { // Inform the MachineModuleInfo of the personality for this landing pad. - if (ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(2))) { -if (CE-getOpcode() == Instruction::BitCast) { -MMI-addPersonality(CurMBB, -castFunction(CE-getOperand(0))); -} - } + ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(2)); + assert(CE CE-getOpcode() == Instruction::BitCast + isaFunction(CE-getOperand(0)) + Personality should be a function); + MMI-addPersonality(CurMBB, castFunction(CE-getOperand(0))); // Gather all the type infos for this landing pad and pass them along to // MachineModuleInfo. std::vectorGlobalVariable * TyInfo; for (unsigned i = 3, N = I.getNumOperands(); i N; ++i) { -if (ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(i))) { - if (CE-getOpcode() == Instruction::BitCast) { -TyInfo.push_back(castGlobalVariable(CE-getOperand(0))); -continue; - } +ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(i)); +if (CE CE-getOpcode() == Instruction::BitCast +isaGlobalVariable(CE-getOperand(0))) { + TyInfo.push_back(castGlobalVariable(CE-getOperand(0))); +} else { + ConstantInt *CI = dyn_castConstantInt(I.getOperand(i)); + assert(CI CI-getZExtValue() == 0 +TypeInfo must be a global variable typeinfo or NULL); + TyInfo.push_back(NULL); } - -TyInfo.push_back(NULL); } MMI-addCatchTypeInfo(CurMBB, TyInfo); @@ -2149,10 +2150,15 @@ if (MMI) { // Find the type id for the given typeinfo. GlobalVariable *GV = NULL; - if (ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(1))) { -if (CE-getOpcode() == Instruction::BitCast) { - GV = castGlobalVariable(CE-getOperand(0)); -} + ConstantExpr *CE = dyn_castConstantExpr(I.getOperand(1)); + if (CE CE-getOpcode() == Instruction::BitCast + isaGlobalVariable(CE-getOperand(0))) { +GV = castGlobalVariable(CE-getOperand(0)); + } else { +ConstantInt *CI = dyn_castConstantInt(I.getOperand(1)); +assert(CI CI-getZExtValue() == 0 + TypeInfo must be a global variable typeinfo or NULL); +GV = NULL; } unsigned TypeID = MMI-getTypeIDFor(GV); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.361 - 1.362 --- Log message: Add original alignment to function arguments flags. --- Diffs of the changes: (+30 -10) SelectionDAGISel.cpp | 40 ++-- 1 files changed, 30 insertions(+), 10 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.361 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.362 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.361Mon Feb 12 19:05:56 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Feb 13 07:50:08 2007 @@ -2933,8 +2933,13 @@ 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 @@ 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 0x07ff) | (1 27); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); } } else { @@ -3053,11 +3060,16 @@ /// 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, SmallVectorSDOperand, 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 0x07ff) | (1 27); Ops.push_back(Arg); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); return; @@ -3067,7 +3079,7 @@ 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 @@ 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 @@ 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; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
On Feb 13, 2007, at 5:50 AM, Lauro Ramos Venancio wrote: Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.361 - 1.362 --- Log message: Add original alignment to function arguments flags. --- Diffs of the changes: (+30 -10) SelectionDAGISel.cpp | 40 ++-- 1 files changed, 30 insertions(+), 10 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.361 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.362 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.361 Mon Feb 12 19:05:56 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cppTue Feb 13 07:50:08 2007 @@ -2933,8 +2933,13 @@ 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); + Some comments: 1. Why 27 - 31 instead of 3 - 6? Please add comment to SelectionDAGNodes.h (see CALL). 2. Purely a stylistic nitpick. Please add a space between // and the actual comment. Thanks, Evan switch (getTypeAction(VT)) { default: assert(0 Unknown type action!); case Legal: @@ -2954,6 +2959,8 @@ 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 0x07ff) | (1 27); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); } } else { @@ -3053,11 +3060,16 @@ /// 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, SmallVectorSDOperand, 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 0x07ff) | (1 27); Ops.push_back(Arg); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); return; @@ -3067,7 +3079,7 @@ 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 @@ 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 @@ 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; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.362 - 1.363 --- Log message: Add a space between // and the comment. --- Diffs of the changes: (+9 -9) SelectionDAGISel.cpp | 18 +- 1 files changed, 9 insertions(+), 9 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.362 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.363 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.362Tue Feb 13 07:50:08 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Feb 13 12:10:13 2007 @@ -2935,9 +2935,9 @@ bool isSRet = FTy-paramHasAttr(j, FunctionType::StructRetAttribute); unsigned OriginalAlignment = getTargetData()-getTypeAlignmentABI(I-getType()); -//Flags[31:27]- OriginalAlignment -//Flags[2] - isSRet -//Flags[1] - isInReg +// Flags[31:27] - OriginalAlignment +// Flags[2] - isSRet +// Flags[1] - isInReg unsigned Flags = (isInReg 1) | (isSRet 2) | (OriginalAlignment 27); switch (getTypeAction(VT)) { @@ -2959,7 +2959,7 @@ 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 it isn't first piece, alignment must be 1 if (i == 1) Flags = (Flags 0x07ff) | (1 27); Ops.push_back(DAG.getConstant(Flags, MVT::i32)); } @@ -3067,7 +3067,7 @@ bool isFirst = true) { if (TLI.getTypeAction(VT) != TargetLowering::Expand) { -//if it isn't first piece, alignment must be 1 +// if it isn't first piece, alignment must be 1 if (!isFirst) Flags = (Flags 0x07ff) | (1 27); Ops.push_back(Arg); @@ -3121,10 +3121,10 @@ 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 +// Flags[31:27] - OriginalAlignment +// Flags[2] - isSRet +// Flags[1] - isInReg +// Flags[0] - isSigned unsigned Flags = (isSRet 2) | (isInReg 1) | isSigned | (OriginalAlignment 27); ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
Re: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Some comments: 1. Why 27 - 31 instead of 3 - 6? I preferred to separate multi-bit values from boolean values. Please add comment to SelectionDAGNodes.h (see CALL). Added. 2. Purely a stylistic nitpick. Please add a space between // and the actual comment. Added. ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.363 - 1.364 --- Log message: revert my previous switch lowering change, which miscompiles a few programs. This will break a dj test until I have time to investigate. --- Diffs of the changes: (+2 -2) SelectionDAGISel.cpp |4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.363 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.364 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.363Tue Feb 13 12:10:13 2007 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Tue Feb 13 14:09:07 2007 @@ -389,8 +389,8 @@ struct CaseCmp { bool operator () (const Case C1, const Case C2) { assert(isaConstantInt(C1.first) isaConstantInt(C2.first)); - return castconst ConstantInt(C1.first)-getZExtValue() -castconst ConstantInt(C2.first)-getZExtValue(); + return castconst ConstantInt(C1.first)-getSExtValue() +castconst ConstantInt(C2.first)-getSExtValue(); } }; ___ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits