From resistor at mac.com Mon Jun 12 02:05:59 2006 From: resistor at mac.com (Owen Anderson) Date: Mon, 12 Jun 2006 02:05:59 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll Message-ID: <200606120705.CAA17911@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/LCSSA: 2006-06-12-MultipleExitsSameBlock.ll added (r1.1) --- Log message: Make sure that LCSSA works properly when it encounters an exit block that has more than one predecessor inside the loop. --- Diffs of the changes: (+28 -0) 2006-06-12-MultipleExitsSameBlock.ll | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+) Index: llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll diff -c /dev/null llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll:1.1 *** /dev/null Mon Jun 12 02:05:57 2006 --- llvm/test/Regression/Transforms/LCSSA/2006-06-12-MultipleExitsSameBlock.ll Mon Jun 12 02:05:47 2006 *************** *** 0 **** --- 1,28 ---- + ; RUN: llvm-as < %s | opt -lcssa | llvm-dis | grep "%X.1.lcssa" && + ; RUN: llvm-as < %s | opt -lcssa | llvm-dis | not grep "%X.1.lcssa1" + + declare bool %c1() + declare bool %c2() + + int %foo() { + entry: + br label %loop_begin + + loop_begin: + br bool true, label %loop_body.1, label %loop_exit2 + + loop_body.1: + %X.1 = add int 0, 1 + %rel.1 = call bool %c1() + br bool %rel.1, label %loop_exit, label %loop_body.2 + + loop_body.2: + %rel.2 = call bool %c2() + br bool %rel.2, label %loop_exit, label %loop_begin + + loop_exit: + ret int %X.1 + + loop_exit2: + ret int 1 + } From resistor at mac.com Mon Jun 12 02:10:29 2006 From: resistor at mac.com (Owen Anderson) Date: Mon, 12 Jun 2006 02:10:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/LCSSA.cpp Message-ID: <200606120710.CAA19412@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: LCSSA.cpp updated: 1.19 -> 1.20 --- Log message: Fix for 2006-06-26-MultipleExitsSingleBlock. If a single exit block has multiple predecessors within the loop, it will appear in the exit blocks list more than once. LCSSA needs to take that into account so that it doesn't double process that exit block. --- Diffs of the changes: (+7 -4) LCSSA.cpp | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) Index: llvm/lib/Transforms/Utils/LCSSA.cpp diff -u llvm/lib/Transforms/Utils/LCSSA.cpp:1.19 llvm/lib/Transforms/Utils/LCSSA.cpp:1.20 --- llvm/lib/Transforms/Utils/LCSSA.cpp:1.19 Sun Jun 11 14:22:28 2006 +++ llvm/lib/Transforms/Utils/LCSSA.cpp Mon Jun 12 02:10:16 2006 @@ -155,13 +155,16 @@ std::vector workList; for (std::vector::const_iterator BBI = exitBlocks.begin(), - BBE = exitBlocks.end(); BBI != BBE; ++BBI) - if (DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) { - PHINode *phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa", + BBE = exitBlocks.end(); BBI != BBE; ++BBI) { + Instruction*& phi = Phis[*BBI]; + if (phi == 0 && + DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) { + phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa", (*BBI)->begin()); - workList.push_back(phi); + workList.push_back(cast(phi)); Phis[*BBI] = phi; } + } // Phi nodes that need to have their incoming values filled. std::vector needIncomingValues; From rafael.espindola at gmail.com Mon Jun 12 07:28:36 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Mon, 12 Jun 2006 07:28:36 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Message-ID: <200606121228.HAA24354@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMISelDAGToDAG.cpp updated: 1.11 -> 1.12 --- Log message: lower more then 4 formal arguments. The offset is currently hard coded. implement SelectFrameIndex --- Diffs of the changes: (+50 -15) ARMISelDAGToDAG.cpp | 65 ++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 50 insertions(+), 15 deletions(-) Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.11 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.12 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.11 Mon Jun 5 17:26:14 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Jun 12 07:28:08 2006 @@ -74,30 +74,49 @@ return DAG.getNode(ISD::BRIND, MVT::Other, Copy, LR); } -static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) { +static SDOperand LowerFORMAL_ARGUMENT(SDOperand Op, SelectionDAG &DAG, + unsigned ArgNo) { MachineFunction &MF = DAG.getMachineFunction(); - SSARegMap *RegMap = MF.getSSARegMap(); - std::vector ArgValues; + MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType(); + assert (ObjectVT == MVT::i32); SDOperand Root = Op.getOperand(0); + SSARegMap *RegMap = MF.getSSARegMap(); - unsigned reg_idx = 0; unsigned num_regs = 4; - static const unsigned REGS[] = { ARM::R0, ARM::R1, ARM::R2, ARM::R3 }; - for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) { - SDOperand ArgVal; + if(ArgNo < num_regs) { + unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass); + MF.addLiveIn(REGS[ArgNo], VReg); + return DAG.getCopyFromReg(Root, VReg, MVT::i32); + } else { + // If the argument is actually used, emit a load from the right stack + // slot. + if (!Op.Val->hasNUsesOfValue(0, ArgNo)) { + //hack + unsigned ArgOffset = 0; + + MachineFrameInfo *MFI = MF.getFrameInfo(); + unsigned ObjSize = MVT::getSizeInBits(ObjectVT)/8; + int FI = MFI->CreateFixedObject(ObjSize, ArgOffset); + SDOperand FIN = DAG.getFrameIndex(FI, MVT::i32); + return DAG.getLoad(ObjectVT, Root, FIN, + DAG.getSrcValue(NULL)); + } else { + // Don't emit a dead load. + return DAG.getNode(ISD::UNDEF, ObjectVT); + } + } +} - MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType(); - assert (ObjectVT == MVT::i32); +static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) { + std::vector ArgValues; + SDOperand Root = Op.getOperand(0); - assert(reg_idx < num_regs); - unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass); - MF.addLiveIn(REGS[reg_idx], VReg); - ArgVal = DAG.getCopyFromReg(Root, VReg, MVT::i32); - ++reg_idx; + for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) { + SDOperand ArgVal = LowerFORMAL_ARGUMENT(Op, DAG, ArgNo); ArgValues.push_back(ArgVal); } @@ -164,8 +183,24 @@ ScheduleAndEmitDAG(DAG); } +static void SelectFrameIndex(SelectionDAG *CurDAG, SDOperand &Result, SDNode *N) { + int FI = cast(N)->getIndex(); + Result = CurDAG->SelectNodeTo(N, ARM::movrr, MVT::i32, + CurDAG->getTargetFrameIndex(FI, MVT::i32)); +} + void ARMDAGToDAGISel::Select(SDOperand &Result, SDOperand Op) { - SelectCode(Result, Op); + SDNode *N = Op.Val; + + switch (N->getOpcode()) { + default: + SelectCode(Result, Op); + break; + + case ISD::FrameIndex: + SelectFrameIndex(CurDAG, Result, N); + break; + } } } // end anonymous namespace From alenhar2 at cs.uiuc.edu Mon Jun 12 11:06:20 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 12 Jun 2006 11:06:20 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetLowering.h Message-ID: <200606121606.LAA31813@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetLowering.h updated: 1.76 -> 1.77 --- Log message: Start on my todo list --- Diffs of the changes: (+2 -3) TargetLowering.h | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/include/llvm/Target/TargetLowering.h diff -u llvm/include/llvm/Target/TargetLowering.h:1.76 llvm/include/llvm/Target/TargetLowering.h:1.77 --- llvm/include/llvm/Target/TargetLowering.h:1.76 Wed May 24 14:21:13 2006 +++ llvm/include/llvm/Target/TargetLowering.h Mon Jun 12 11:06:08 2006 @@ -25,7 +25,6 @@ #include "llvm/Type.h" #include "llvm/CodeGen/SelectionDAGNodes.h" #include -#include namespace llvm { class Value; @@ -654,9 +653,9 @@ // Div utility functions // SDOperand BuildSDIV(SDNode *N, SelectionDAG &DAG, - std::list* Created) const; + std::vector* Created) const; SDOperand BuildUDIV(SDNode *N, SelectionDAG &DAG, - std::list* Created) const; + std::vector* Created) const; protected: From alenhar2 at cs.uiuc.edu Mon Jun 12 11:06:55 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 12 Jun 2006 11:06:55 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200606121606.LAA31852@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.172 -> 1.173 --- Log message: Start on my todo list --- Diffs of the changes: (+4 -4) DAGCombiner.cpp | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.172 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.173 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.172 Wed May 31 01:08:35 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Jun 12 11:06:43 2006 @@ -3454,10 +3454,10 @@ /// multiplying by a magic number. See: /// SDOperand DAGCombiner::BuildSDIV(SDNode *N) { - std::list Built; + std::vector Built; SDOperand S = TLI.BuildSDIV(N, DAG, &Built); - for (std::list::iterator ii = Built.begin(), ee = Built.end(); + for (std::vector::iterator ii = Built.begin(), ee = Built.end(); ii != ee; ++ii) AddToWorkList(*ii); return S; @@ -3468,10 +3468,10 @@ /// multiplying by a magic number. See: /// SDOperand DAGCombiner::BuildUDIV(SDNode *N) { - std::list Built; + std::vector Built; SDOperand S = TLI.BuildUDIV(N, DAG, &Built); - for (std::list::iterator ii = Built.begin(), ee = Built.end(); + for (std::vector::iterator ii = Built.begin(), ee = Built.end(); ii != ee; ++ii) AddToWorkList(*ii); return S; From alenhar2 at cs.uiuc.edu Mon Jun 12 11:07:30 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 12 Jun 2006 11:07:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200606121607.LAA31879@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.66 -> 1.67 --- Log message: Start on my todo list --- Diffs of the changes: (+2 -2) TargetLowering.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.66 llvm/lib/Target/TargetLowering.cpp:1.67 --- llvm/lib/Target/TargetLowering.cpp:1.66 Wed May 17 13:22:14 2006 +++ llvm/lib/Target/TargetLowering.cpp Mon Jun 12 11:07:18 2006 @@ -1511,7 +1511,7 @@ /// multiplying by a magic number. See: /// SDOperand TargetLowering::BuildSDIV(SDNode *N, SelectionDAG &DAG, - std::list* Created) const { + std::vector* Created) const { MVT::ValueType VT = N->getValueType(0); // Check to see if we can do this. @@ -1559,7 +1559,7 @@ /// multiplying by a magic number. See: /// SDOperand TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG, - std::list* Created) const { + std::vector* Created) const { MVT::ValueType VT = N->getValueType(0); // Check to see if we can do this. From alenhar2 at cs.uiuc.edu Mon Jun 12 13:09:36 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 12 Jun 2006 13:09:36 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelLowering.cpp AlphaISelLowering.h AlphaInstrFormats.td AlphaInstrInfo.td AlphaRegisterInfo.cpp Message-ID: <200606121809.NAA32598@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelLowering.cpp updated: 1.49 -> 1.50 AlphaISelLowering.h updated: 1.16 -> 1.17 AlphaInstrFormats.td updated: 1.27 -> 1.28 AlphaInstrInfo.td updated: 1.120 -> 1.121 AlphaRegisterInfo.cpp updated: 1.45 -> 1.46 --- Log message: Let the alpha breakage begin. First Formals and RET. next Calls --- Diffs of the changes: (+102 -72) AlphaISelLowering.cpp | 141 +++++++++++++++++++++++++++----------------------- AlphaISelLowering.h | 10 +-- AlphaInstrFormats.td | 14 ++++ AlphaInstrInfo.td | 7 ++ AlphaRegisterInfo.cpp | 2 5 files changed, 102 insertions(+), 72 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.49 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.50 --- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.49 Tue May 16 12:42:15 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Mon Jun 12 13:09:24 2006 @@ -128,6 +128,8 @@ setOperationAction(ISD::VAARG, MVT::Other, Custom); setOperationAction(ISD::VAARG, MVT::i32, Custom); + setOperationAction(ISD::RET, MVT::Other, Custom); + setStackPointerRegisterToSaveRestore(Alpha::R30); setOperationAction(ISD::ConstantFP, MVT::f64, Expand); @@ -154,6 +156,7 @@ case AlphaISD::GlobalBaseReg: return "Alpha::GlobalBaseReg"; case AlphaISD::CALL: return "Alpha::CALL"; case AlphaISD::DivCall: return "Alpha::DivCall"; + case AlphaISD::RET_FLAG: return "Alpha::RET_FLAG"; } } @@ -175,116 +178,121 @@ // //#define GP $29 // //#define SP $30 -std::vector -AlphaTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) -{ +static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG, + int &VarArgsBase, + int &VarArgsOffset, + unsigned int &GP, + unsigned int &RA) { MachineFunction &MF = DAG.getMachineFunction(); MachineFrameInfo *MFI = MF.getFrameInfo(); + SSARegMap *RegMap = MF.getSSARegMap(); std::vector ArgValues; + SDOperand Root = Op.getOperand(0); + + GP = AddLiveIn(MF, Alpha::R29, &Alpha::GPRCRegClass); + RA = AddLiveIn(MF, Alpha::R26, &Alpha::GPRCRegClass); unsigned args_int[] = { Alpha::R16, Alpha::R17, Alpha::R18, Alpha::R19, Alpha::R20, Alpha::R21}; unsigned args_float[] = { Alpha::F16, Alpha::F17, Alpha::F18, Alpha::F19, Alpha::F20, Alpha::F21}; - - int count = 0; - - GP = AddLiveIn(MF, Alpha::R29, getRegClassFor(MVT::i64)); - RA = AddLiveIn(MF, Alpha::R26, getRegClassFor(MVT::i64)); - - for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(); I != E; ++I) - { + + for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) { SDOperand argt; - if (count < 6) { + MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType(); + SDOperand ArgVal; + + if (ArgNo < 6) { unsigned Vreg; - MVT::ValueType VT = getValueType(I->getType()); - switch (VT) { + switch (ObjectVT) { default: - std::cerr << "Unknown Type " << VT << "\n"; + std::cerr << "Unknown Type " << ObjectVT << "\n"; abort(); case MVT::f64: case MVT::f32: - args_float[count] = AddLiveIn(MF, args_float[count], getRegClassFor(VT)); - argt = DAG.getCopyFromReg(DAG.getRoot(), args_float[count], VT); - DAG.setRoot(argt.getValue(1)); + args_float[ArgNo] = AddLiveIn(MF, args_float[ArgNo], + &Alpha::F8RCRegClass); + ArgVal = DAG.getCopyFromReg(Root, args_float[ArgNo], ObjectVT); break; - case MVT::i1: - case MVT::i8: - case MVT::i16: - case MVT::i32: case MVT::i64: - args_int[count] = AddLiveIn(MF, args_int[count], getRegClassFor(MVT::i64)); - argt = DAG.getCopyFromReg(DAG.getRoot(), args_int[count], MVT::i64); - DAG.setRoot(argt.getValue(1)); - if (VT != MVT::i64) { - unsigned AssertOp = - I->getType()->isSigned() ? ISD::AssertSext : ISD::AssertZext; - argt = DAG.getNode(AssertOp, MVT::i64, argt, - DAG.getValueType(VT)); - argt = DAG.getNode(ISD::TRUNCATE, VT, argt); - } + args_int[ArgNo] = AddLiveIn(MF, args_int[ArgNo], + &Alpha::GPRCRegClass); + ArgVal = DAG.getCopyFromReg(Root, args_int[ArgNo], MVT::i64); break; } } else { //more args // Create the frame index object for this incoming parameter... - int FI = MFI->CreateFixedObject(8, 8 * (count - 6)); + int FI = MFI->CreateFixedObject(8, 8 * (ArgNo - 6)); // Create the SelectionDAG nodes corresponding to a load //from this parameter SDOperand FIN = DAG.getFrameIndex(FI, MVT::i64); - argt = DAG.getLoad(getValueType(I->getType()), - DAG.getEntryNode(), FIN, DAG.getSrcValue(NULL)); + ArgVal = DAG.getLoad(ObjectVT, Root, FIN, DAG.getSrcValue(NULL)); } - ++count; - ArgValues.push_back(argt); + ArgValues.push_back(ArgVal); } // If the functions takes variable number of arguments, copy all regs to stack - if (F.isVarArg()) { - VarArgsOffset = count * 8; + bool isVarArg = cast(Op.getOperand(2))->getValue() != 0; + if (isVarArg) { + VarArgsOffset = (Op.Val->getNumValues()-1) * 8; std::vector LS; for (int i = 0; i < 6; ++i) { if (MRegisterInfo::isPhysicalRegister(args_int[i])) - args_int[i] = AddLiveIn(MF, args_int[i], getRegClassFor(MVT::i64)); - SDOperand argt = DAG.getCopyFromReg(DAG.getRoot(), args_int[i], MVT::i64); + args_int[i] = AddLiveIn(MF, args_int[i], &Alpha::GPRCRegClass); + SDOperand argt = DAG.getCopyFromReg(Root, args_int[i], MVT::i64); int FI = MFI->CreateFixedObject(8, -8 * (6 - i)); if (i == 0) VarArgsBase = FI; SDOperand SDFI = DAG.getFrameIndex(FI, MVT::i64); - LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, DAG.getRoot(), argt, + LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, Root, argt, SDFI, DAG.getSrcValue(NULL))); if (MRegisterInfo::isPhysicalRegister(args_float[i])) - args_float[i] = AddLiveIn(MF, args_float[i], getRegClassFor(MVT::f64)); - argt = DAG.getCopyFromReg(DAG.getRoot(), args_float[i], MVT::f64); + args_float[i] = AddLiveIn(MF, args_float[i], &Alpha::F8RCRegClass); + argt = DAG.getCopyFromReg(Root, args_float[i], MVT::f64); FI = MFI->CreateFixedObject(8, - 8 * (12 - i)); SDFI = DAG.getFrameIndex(FI, MVT::i64); - LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, DAG.getRoot(), argt, + LS.push_back(DAG.getNode(ISD::STORE, MVT::Other, Root, argt, SDFI, DAG.getSrcValue(NULL))); } //Set up a token factor with all the stack traffic - DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other, LS)); + Root = DAG.getNode(ISD::TokenFactor, MVT::Other, LS); } - // Finally, inform the code generator which regs we return values in. - switch (getValueType(F.getReturnType())) { - default: assert(0 && "Unknown type!"); - case MVT::isVoid: break; - case MVT::i1: - case MVT::i8: - case MVT::i16: - case MVT::i32: - case MVT::i64: - MF.addLiveOut(Alpha::R0); - break; - case MVT::f32: - case MVT::f64: - MF.addLiveOut(Alpha::F0); + ArgValues.push_back(Root); + + // Return the new list of results. + std::vector RetVT(Op.Val->value_begin(), + Op.Val->value_end()); + return DAG.getNode(ISD::MERGE_VALUES, RetVT, ArgValues); +} + +static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) { + SDOperand Copy; + switch (Op.getNumOperands()) { + default: + assert(0 && "Do not know how to return this many arguments!"); + abort(); + case 1: + return SDOperand(); // ret void is legal + case 3: { + MVT::ValueType ArgVT = Op.getOperand(1).getValueType(); + unsigned ArgReg; + if (MVT::isInteger(ArgVT)) + ArgReg = Alpha::R0; + else { + assert(MVT::isFloatingPoint(ArgVT)); + ArgReg = Alpha::F0; + } + Copy = DAG.getCopyToReg(Op.getOperand(0), ArgReg, Op.getOperand(1), + SDOperand()); + if(DAG.getMachineFunction().liveout_empty()) + DAG.getMachineFunction().addLiveOut(ArgReg); break; } - - //return the arguments+ - return ArgValues; + } + return DAG.getNode(AlphaISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1)); } std::pair @@ -371,7 +379,12 @@ /// SDOperand AlphaTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { switch (Op.getOpcode()) { - default: assert(0 && "Wasn't expecting to be able to lower this!"); + default: assert(0 && "Wasn't expecting to be able to lower this!"); + case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG, + VarArgsBase, + VarArgsOffset, + GP, RA); + case ISD::RET: return LowerRET(Op,DAG); case ISD::SINT_TO_FP: { assert(MVT::i64 == Op.getOperand(0).getValueType() && "Unhandled SINT_TO_FP type in custom expander!"); Index: llvm/lib/Target/Alpha/AlphaISelLowering.h diff -u llvm/lib/Target/Alpha/AlphaISelLowering.h:1.16 llvm/lib/Target/Alpha/AlphaISelLowering.h:1.17 --- llvm/lib/Target/Alpha/AlphaISelLowering.h:1.16 Wed May 24 12:04:04 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.h Mon Jun 12 13:09:24 2006 @@ -42,7 +42,10 @@ CALL, /// DIVCALL - used for special library calls for div and rem - DivCall + DivCall, + + /// return flag operand + RET_FLAG }; } @@ -64,11 +67,6 @@ //Friendly names for dumps const char *getTargetNodeName(unsigned Opcode) const; - /// LowerArguments - This hook must be implemented to indicate how we should - /// lower the arguments for the specified function, into the specified DAG. - virtual std::vector - LowerArguments(Function &F, SelectionDAG &DAG); - /// LowerCallTo - This hook lowers an abstract call to a function into an /// actual call. virtual std::pair Index: llvm/lib/Target/Alpha/AlphaInstrFormats.td diff -u llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.27 llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.28 --- llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.27 Thu Mar 9 11:16:45 2006 +++ llvm/lib/Target/Alpha/AlphaInstrFormats.td Mon Jun 12 13:09:24 2006 @@ -75,6 +75,20 @@ let Inst{15-14} = TB; let Inst{13-0} = disp; } +class MbrpForm opcode, bits<2> TB, dag OL, string asmstr, list pattern, InstrItinClass itin> + : InstAlpha { + let Pattern=pattern; + bits<5> Ra; + bits<5> Rb; + bits<14> disp; + + let OperandList = OL; + + let Inst{25-21} = Ra; + let Inst{20-16} = Rb; + let Inst{15-14} = TB; + let Inst{13-0} = disp; +} //3.3.2 def target : Operand {} Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.120 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.121 --- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.120 Sat Jun 3 19:25:51 2006 +++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Mon Jun 12 13:09:24 2006 @@ -28,6 +28,9 @@ def Alpha_gprelhi : SDNode<"AlphaISD::GPRelHi", SDTIntBinOp, []>; def Alpha_rellit : SDNode<"AlphaISD::RelLit", SDTIntBinOp, []>; +def retflag : SDNode<"AlphaISD::RET_FLAG", SDTRet, + [SDNPHasChain, SDNPOptInFlag]>; + // These are target-independent nodes, but have target-specific formats. def SDT_AlphaCallSeq : SDTypeProfile<0, 1, [ SDTCisVT<0, i64> ]>; def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_AlphaCallSeq,[SDNPHasChain]>; @@ -425,8 +428,10 @@ def : Pat<(setune GPRC:$X, immUExt8:$Y), (CMPEQi (CMPEQ GPRC:$X, immUExt8:$Y), 0)>; -let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in +let isReturn = 1, isTerminator = 1, noResults = 1, Ra = 31, Rb = 26, disp = 1, Uses = [R26] in { def RETDAG : MbrForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", s_jsr>; //Return from subroutine + def RETDAGp : MbrpForm< 0x1A, 0x02, (ops), "ret $$31,($$26),1", [(retflag)], s_jsr>; //Return from subroutine +} def JMP : MbrForm< 0x1A, 0x00, (ops GPRC:$RD, GPRC:$RS, GPRC:$DISP), "jmp $RD,($RS),$DISP", s_jsr>; //Jump let isCall = 1, noResults = 1, Ra = 26, Index: llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp diff -u llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.45 llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.46 --- llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp:1.45 Wed May 17 19:11:53 2006 +++ llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp Mon Jun 12 13:09:24 2006 @@ -346,7 +346,7 @@ MachineBasicBlock &MBB) const { const MachineFrameInfo *MFI = MF.getFrameInfo(); MachineBasicBlock::iterator MBBI = prior(MBB.end()); - assert(MBBI->getOpcode() == Alpha::RETDAG + assert(MBBI->getOpcode() == Alpha::RETDAG || MBBI->getOpcode() == Alpha::RETDAGp && "Can only insert epilog into returning blocks"); bool FP = hasFP(MF); From lattner at cs.uiuc.edu Mon Jun 12 13:24:44 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 13:24:44 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll Message-ID: <200606121824.NAA32722@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Generic: 2006-06-12-LowerSwitchCrash.ll added (r1.1) --- Log message: New testcase that crashes llc --- Diffs of the changes: (+10 -0) 2006-06-12-LowerSwitchCrash.ll | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll diff -c /dev/null llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll:1.1 *** /dev/null Mon Jun 12 13:24:42 2006 --- llvm/test/Regression/CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll Mon Jun 12 13:24:32 2006 *************** *** 0 **** --- 1,10 ---- + ; RUN: llvm-as < %s | llc -fast + + float %test(uint %tmp12771278) { + switch uint %tmp12771278, label %bb1279 [ + ] + + bb1279: ; preds = %cond_next1272 + ret float 1.0 + } + From lattner at cs.uiuc.edu Mon Jun 12 13:25:42 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 13:25:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200606121825.NAA00371@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.255 -> 1.256 --- Log message: Make sure to update the CFG correctly if a switch only has a default dest. This fixes CodeGen/Generic/2006-06-12-LowerSwitchCrash.ll --- 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.255 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.256 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.255 Thu Jun 8 13:27:11 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Jun 12 13:25:29 2006 @@ -869,6 +869,7 @@ if (DefaultMBB != NextBlock) DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(), DAG.getBasicBlock(DefaultMBB))); + CurMBB->addSuccessor(DefaultMBB); return; } From lattner at cs.uiuc.edu Mon Jun 12 14:03:29 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 14:03:29 -0500 Subject: [llvm-commits] CVS: llvm/utils/NightlyTest.pl Message-ID: <200606121903.OAA00566@zion.cs.uiuc.edu> Changes in directory llvm/utils: NightlyTest.pl updated: 1.108 -> 1.109 --- Log message: Add a new -compileflags options, remove old externals location specifiers. People should just use -with-externals. --- Diffs of the changes: (+12 -25) NightlyTest.pl | 37 ++++++++++++------------------------- 1 files changed, 12 insertions(+), 25 deletions(-) Index: llvm/utils/NightlyTest.pl diff -u llvm/utils/NightlyTest.pl:1.108 llvm/utils/NightlyTest.pl:1.109 --- llvm/utils/NightlyTest.pl:1.108 Wed Jun 7 00:28:07 2006 +++ llvm/utils/NightlyTest.pl Mon Jun 12 14:03:17 2006 @@ -17,9 +17,6 @@ # -norunningtests. # -norunningtests Do not run the Olden benchmark suite with # LARGE_PROBLEM_SIZE enabled. -# -noexternals Do not run the external tests (for cases where povray -# or SPEC are not installed) -# -with-externals Specify a directory where the external tests are located. # -nodejagnu Do not run feature or regression tests # -parallel Run two parallel jobs with GNU Make. # -release Build an LLVM Release version @@ -43,14 +40,15 @@ # override the default. # -ldflags Next argument specifies that linker options that override # the default. -# -extraflags Next argument specifies extra options that are passed to -# compile the tests. +# -compileflags Next argument specifies extra options passed to make when +# building LLVM. # # ---------------- Options to configure llvm-test ---------------------------- -# -spec2000path Path to the benchspec directory in the SPEC 2000 distro -# -spec95path Path to the benchspec directory in the SPEC 95 distro. -# -povraypath Path to the povray sources -# -namdpath Path to the namd sources +# -extraflags Next argument specifies extra options that are passed to +# compile the tests. +# -noexternals Do not run the external tests (for cases where povray +# or SPEC are not installed) +# -with-externals Specify a directory where the external tests are located. # # CVSROOT is the CVS repository from which the tree will be checked out, # specified either in the full :method:user at host:/dir syntax, or @@ -100,8 +98,6 @@ my $NICE = ""; my $NODEJAGNU = 0; -my $LLVMTESTCONFIGARGS = ""; - sub ReadFile { if (open (FILE, $_[0])) { undef $/; @@ -334,23 +330,14 @@ if (/^-ldflags/) { $MAKEOPTS = "$MAKEOPTS LD.Flags=\'$ARGV[0]\'"; shift; next; } - if (/^-extraflags/) { + if (/^-compileflags/) { + $MAKEOPTS = "$MAKEOPTS $ARGV[0]"; shift; next; + } + if (/^-extraflags/) { $PROGTESTOPTS .= " EXTRA_FLAGS=\'$ARGV[0]\'"; shift; next; } if (/^-noexternals$/) { $NOEXTERNALS = 1; next; } if (/^-nodejagnu$/) { $NODEJAGNU = 1; next; } - if (/^-spec2000path$/) { - $LLVMTESTCONFIGARGS .= " --enable-spec2000=$ARGV[0]"; shift; next; - } - if (/^-spec95path$/) { - $LLVMTESTCONFIGARGS .= " --enable-spec95=$ARGV[0]"; shift; next; - } - if (/^-povraypath$/) { - $LLVMTESTCONFIGARGS .= " --enable-povray=$ARGV[0]"; shift; next; - } - if (/^-namdpath$/) { - $LLVMTESTCONFIGARGS .= " --enable-namd=$ARGV[0]"; shift; next; - } print "Unknown option: $_ : ignoring!\n"; } @@ -462,7 +449,7 @@ # if (!$NOCHECKOUT) { if ( $VERBOSE ) { print "CONFIGURE STAGE\n"; } - my $EXTRAFLAGS = "--enable-spec --with-objroot=.$LLVMTESTCONFIGARGS"; + my $EXTRAFLAGS = "--enable-spec --with-objroot=."; system "(time -p $NICE ./configure $CONFIGUREARGS $EXTRAFLAGS) > $BuildLog 2>&1"; if ( $VERBOSE ) { print "BUILD STAGE\n"; } From lattner at cs.uiuc.edu Mon Jun 12 15:17:56 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 15:17:56 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll Message-ID: <200606122017.PAA00979@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/SimplifyCFG: 2006-06-12-InfLoop.ll added (r1.1) --- Log message: TEstcase that makes simplifycfg infloop. --- Diffs of the changes: (+613 -0) 2006-06-12-InfLoop.ll | 613 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 613 insertions(+) Index: llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll diff -c /dev/null llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll:1.1 *** /dev/null Mon Jun 12 15:17:54 2006 --- llvm/test/Regression/Transforms/SimplifyCFG/2006-06-12-InfLoop.ll Mon Jun 12 15:17:44 2006 *************** *** 0 **** --- 1,613 ---- + ; RUN: llvm-as < %s | opt -simplifycfg -disable-output + + void %main(int %c) { + entry: + %tmp.9 = seteq int %c, 2 ; [#uses=1] + br bool %tmp.9, label %endif.0, label %then.0 + + then.0: ; preds = %entry + ret void + + endif.0: ; preds = %entry + br bool false, label %then.1, label %endif.1 + + then.1: ; preds = %endif.0 + ret void + + endif.1: ; preds = %endif.0 + br bool false, label %then.2, label %endif.2 + + then.2: ; preds = %endif.1 + ret void + + endif.2: ; preds = %endif.1 + br bool false, label %then.3, label %loopentry.0 + + then.3: ; preds = %endif.2 + ret void + + loopentry.0: ; preds = %endif.2 + br bool false, label %no_exit.0.preheader, label %loopexit.0 + + no_exit.0.preheader: ; preds = %loopentry.0 + br label %no_exit.0 + + no_exit.0: ; preds = %endif.4, %no_exit.0.preheader + br bool false, label %then.4, label %endif.4 + + then.4: ; preds = %no_exit.0 + ret void + + endif.4: ; preds = %no_exit.0 + br bool false, label %no_exit.0, label %loopexit.0.loopexit + + loopexit.0.loopexit: ; preds = %endif.4 + br label %loopexit.0 + + loopexit.0: ; preds = %loopexit.0.loopexit, %loopentry.0 + br bool false, label %then.5, label %loopentry.1 + + then.5: ; preds = %loopexit.0 + ret void + + loopentry.1: ; preds = %loopexit.0 + %tmp.143 = setgt int 0, 0 ; [#uses=4] + br bool %tmp.143, label %no_exit.1.preheader, label %loopexit.1 + + no_exit.1.preheader: ; preds = %loopentry.1 + br label %no_exit.1 + + no_exit.1: ; preds = %endif.6, %no_exit.1.preheader + br bool false, label %then.6, label %shortcirc_next.3 + + shortcirc_next.3: ; preds = %no_exit.1 + br bool false, label %then.6, label %shortcirc_next.4 + + shortcirc_next.4: ; preds = %shortcirc_next.3 + br bool false, label %then.6, label %endif.6 + + then.6: ; preds = %shortcirc_next.4, %shortcirc_next.3, %no_exit.1 + ret void + + endif.6: ; preds = %shortcirc_next.4 + br bool false, label %no_exit.1, label %loopexit.1.loopexit + + loopexit.1.loopexit: ; preds = %endif.6 + br label %loopexit.1 + + loopexit.1: ; preds = %loopexit.1.loopexit, %loopentry.1 + br bool false, label %then.i, label %loopentry.0.i + + then.i: ; preds = %loopexit.1 + ret void + + loopentry.0.i: ; preds = %loopexit.1 + br bool %tmp.143, label %no_exit.0.i.preheader, label %readvector.exit + + no_exit.0.i.preheader: ; preds = %loopentry.0.i + br label %no_exit.0.i + + no_exit.0.i: ; preds = %loopexit.1.i, %no_exit.0.i.preheader + br bool false, label %no_exit.1.i.preheader, label %loopexit.1.i + + no_exit.1.i.preheader: ; preds = %no_exit.0.i + br label %no_exit.1.i + + no_exit.1.i: ; preds = %loopexit.2.i, %no_exit.1.i.preheader + br bool false, label %no_exit.2.i.preheader, label %loopexit.2.i + + no_exit.2.i.preheader: ; preds = %no_exit.1.i + br label %no_exit.2.i + + no_exit.2.i: ; preds = %no_exit.2.i, %no_exit.2.i.preheader + br bool false, label %no_exit.2.i, label %loopexit.2.i.loopexit + + loopexit.2.i.loopexit: ; preds = %no_exit.2.i + br label %loopexit.2.i + + loopexit.2.i: ; preds = %loopexit.2.i.loopexit, %no_exit.1.i + br bool false, label %no_exit.1.i, label %loopexit.1.i.loopexit + + loopexit.1.i.loopexit: ; preds = %loopexit.2.i + br label %loopexit.1.i + + loopexit.1.i: ; preds = %loopexit.1.i.loopexit, %no_exit.0.i + br bool false, label %no_exit.0.i, label %readvector.exit.loopexit + + readvector.exit.loopexit: ; preds = %loopexit.1.i + br label %readvector.exit + + readvector.exit: ; preds = %readvector.exit.loopexit, %loopentry.0.i + br bool %tmp.143, label %loopentry.1.preheader.i, label %loopexit.0.i + + loopentry.1.preheader.i: ; preds = %readvector.exit + br label %loopentry.1.outer.i + + loopentry.1.outer.i: ; preds = %loopexit.1.i110, %loopentry.1.preheader.i + br label %loopentry.1.i85 + + loopentry.1.i85.loopexit: ; preds = %hamming.exit16.i + br label %loopentry.1.i85 + + loopentry.1.i85: ; preds = %loopentry.1.i85.loopexit, %loopentry.1.outer.i + br bool false, label %no_exit.1.preheader.i, label %loopexit.1.i110.loopexit1 + + no_exit.1.preheader.i: ; preds = %loopentry.1.i85 + br label %no_exit.1.i87 + + no_exit.1.i87: ; preds = %then.1.i107, %no_exit.1.preheader.i + br bool false, label %no_exit.i.i101.preheader, label %hamming.exit.i104 + + no_exit.i.i101.preheader: ; preds = %no_exit.1.i87 + br label %no_exit.i.i101 + + no_exit.i.i101: ; preds = %no_exit.i.i101, %no_exit.i.i101.preheader + br bool false, label %no_exit.i.i101, label %hamming.exit.i104.loopexit + + hamming.exit.i104.loopexit: ; preds = %no_exit.i.i101 + br label %hamming.exit.i104 + + hamming.exit.i104: ; preds = %hamming.exit.i104.loopexit, %no_exit.1.i87 + br bool false, label %no_exit.i15.i.preheader, label %hamming.exit16.i + + no_exit.i15.i.preheader: ; preds = %hamming.exit.i104 + br label %no_exit.i15.i + + no_exit.i15.i: ; preds = %no_exit.i15.i, %no_exit.i15.i.preheader + br bool false, label %no_exit.i15.i, label %hamming.exit16.i.loopexit + + hamming.exit16.i.loopexit: ; preds = %no_exit.i15.i + br label %hamming.exit16.i + + hamming.exit16.i: ; preds = %hamming.exit16.i.loopexit, %hamming.exit.i104 + br bool false, label %loopentry.1.i85.loopexit, label %then.1.i107 + + then.1.i107: ; preds = %hamming.exit16.i + br bool false, label %no_exit.1.i87, label %loopexit.1.i110.loopexit + + loopexit.1.i110.loopexit: ; preds = %then.1.i107 + br label %loopexit.1.i110 + + loopexit.1.i110.loopexit1: ; preds = %loopentry.1.i85 + br label %loopexit.1.i110 + + loopexit.1.i110: ; preds = %loopexit.1.i110.loopexit1, %loopexit.1.i110.loopexit + br bool false, label %loopentry.1.outer.i, label %loopexit.0.i.loopexit + + loopexit.0.i.loopexit: ; preds = %loopexit.1.i110 + br label %loopexit.0.i + + loopexit.0.i: ; preds = %loopexit.0.i.loopexit, %readvector.exit + br bool false, label %UnifiedReturnBlock.i113, label %then.2.i112 + + then.2.i112: ; preds = %loopexit.0.i + br label %checkham.exit + + UnifiedReturnBlock.i113: ; preds = %loopexit.0.i + br label %checkham.exit + + checkham.exit: ; preds = %UnifiedReturnBlock.i113, %then.2.i112 + br bool false, label %loopentry.1.i14.preheader, label %loopentry.3.i.preheader + + loopentry.1.i14.preheader: ; preds = %checkham.exit + br label %loopentry.1.i14 + + loopentry.1.i14: ; preds = %loopexit.1.i18, %loopentry.1.i14.preheader + br bool false, label %no_exit.1.i16.preheader, label %loopexit.1.i18 + + no_exit.1.i16.preheader: ; preds = %loopentry.1.i14 + br label %no_exit.1.i16 + + no_exit.1.i16: ; preds = %no_exit.1.i16, %no_exit.1.i16.preheader + br bool false, label %no_exit.1.i16, label %loopexit.1.i18.loopexit + + loopexit.1.i18.loopexit: ; preds = %no_exit.1.i16 + br label %loopexit.1.i18 + + loopexit.1.i18: ; preds = %loopexit.1.i18.loopexit, %loopentry.1.i14 + br bool false, label %loopentry.1.i14, label %loopentry.3.i.loopexit + + loopentry.3.i.loopexit: ; preds = %loopexit.1.i18 + br label %loopentry.3.i.preheader + + loopentry.3.i.preheader: ; preds = %loopentry.3.i.loopexit, %checkham.exit + br label %loopentry.3.i + + loopentry.3.i: ; preds = %endif.1.i, %loopentry.3.i.preheader + br bool false, label %loopentry.4.i.preheader, label %endif.1.i + + loopentry.4.i.preheader: ; preds = %loopentry.3.i + br label %loopentry.4.i + + loopentry.4.i: ; preds = %loopexit.4.i, %loopentry.4.i.preheader + br bool false, label %no_exit.4.i.preheader, label %loopexit.4.i + + no_exit.4.i.preheader: ; preds = %loopentry.4.i + br label %no_exit.4.i + + no_exit.4.i: ; preds = %no_exit.4.i.backedge, %no_exit.4.i.preheader + br bool false, label %endif.0.i, label %else.i + + else.i: ; preds = %no_exit.4.i + br bool false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit + + no_exit.4.i.backedge: ; preds = %endif.0.i, %else.i + br label %no_exit.4.i + + endif.0.i: ; preds = %no_exit.4.i + br bool false, label %no_exit.4.i.backedge, label %loopexit.4.i.loopexit + + loopexit.4.i.loopexit: ; preds = %endif.0.i, %else.i + br label %loopexit.4.i + + loopexit.4.i: ; preds = %loopexit.4.i.loopexit, %loopentry.4.i + br bool false, label %loopentry.4.i, label %endif.1.i.loopexit + + endif.1.i.loopexit: ; preds = %loopexit.4.i + br label %endif.1.i + + endif.1.i: ; preds = %endif.1.i.loopexit, %loopentry.3.i + %exitcond = seteq uint 0, 10 ; [#uses=1] + br bool %exitcond, label %generateT.exit, label %loopentry.3.i + + generateT.exit: ; preds = %endif.1.i + br bool false, label %then.0.i, label %loopentry.1.i30.preheader + + then.0.i: ; preds = %generateT.exit + ret void + + loopentry.1.i30.loopexit: ; preds = %loopexit.3.i + br label %loopentry.1.i30.backedge + + loopentry.1.i30.preheader: ; preds = %generateT.exit + br label %loopentry.1.i30 + + loopentry.1.i30: ; preds = %loopentry.1.i30.backedge, %loopentry.1.i30.preheader + br bool %tmp.143, label %no_exit.0.i31.preheader, label %loopentry.1.i30.backedge + + loopentry.1.i30.backedge: ; preds = %loopentry.1.i30, %loopentry.1.i30.loopexit + br label %loopentry.1.i30 + + no_exit.0.i31.preheader: ; preds = %loopentry.1.i30 + br label %no_exit.0.i31 + + no_exit.0.i31: ; preds = %loopexit.3.i, %no_exit.0.i31.preheader + br bool false, label %then.1.i, label %else.0.i + + then.1.i: ; preds = %no_exit.0.i31 + br bool undef, label %then.0.i29, label %loopentry.0.i31 + + then.0.i29: ; preds = %then.1.i + unreachable + + loopentry.0.i31: ; preds = %then.1.i + br bool false, label %no_exit.0.i38.preheader, label %loopentry.1.i.preheader + + no_exit.0.i38.preheader: ; preds = %loopentry.0.i31 + br label %no_exit.0.i38 + + no_exit.0.i38: ; preds = %no_exit.0.i38, %no_exit.0.i38.preheader + br bool undef, label %no_exit.0.i38, label %loopentry.1.i.preheader.loopexit + + loopentry.1.i.preheader.loopexit: ; preds = %no_exit.0.i38 + br label %loopentry.1.i.preheader + + loopentry.1.i.preheader: ; preds = %loopentry.1.i.preheader.loopexit, %loopentry.0.i31 + br label %loopentry.1.i + + loopentry.1.i: ; preds = %endif.2.i, %loopentry.1.i.preheader + br bool undef, label %loopentry.2.i39.preheader, label %loopexit.1.i79.loopexit2 + + loopentry.2.i39.preheader: ; preds = %loopentry.1.i + br label %loopentry.2.i39 + + loopentry.2.i39: ; preds = %loopexit.5.i77, %loopentry.2.i39.preheader + br bool false, label %loopentry.3.i40.preheader, label %hamming.exit.i71 + + loopentry.3.i40.preheader: ; preds = %loopentry.2.i39 + br label %loopentry.3.i40 + + loopentry.3.i40: ; preds = %loopexit.3.i51, %loopentry.3.i40.preheader + br bool false, label %no_exit.3.preheader.i42, label %loopexit.3.i51 + + no_exit.3.preheader.i42: ; preds = %loopentry.3.i40 + br label %no_exit.3.i49 + + no_exit.3.i49: ; preds = %no_exit.3.i49, %no_exit.3.preheader.i42 + br bool undef, label %no_exit.3.i49, label %loopexit.3.i51.loopexit + + loopexit.3.i51.loopexit: ; preds = %no_exit.3.i49 + br label %loopexit.3.i51 + + loopexit.3.i51: ; preds = %loopexit.3.i51.loopexit, %loopentry.3.i40 + br bool undef, label %loopentry.3.i40, label %loopentry.4.i52 + + loopentry.4.i52: ; preds = %loopexit.3.i51 + br bool false, label %no_exit.4.i54.preheader, label %hamming.exit.i71 + + no_exit.4.i54.preheader: ; preds = %loopentry.4.i52 + br label %no_exit.4.i54 + + no_exit.4.i54: ; preds = %no_exit.4.backedge.i, %no_exit.4.i54.preheader + br bool undef, label %then.1.i55, label %endif.1.i56 + + then.1.i55: ; preds = %no_exit.4.i54 + br bool undef, label %no_exit.4.backedge.i, label %loopexit.4.i57 + + no_exit.4.backedge.i: ; preds = %endif.1.i56, %then.1.i55 + br label %no_exit.4.i54 + + endif.1.i56: ; preds = %no_exit.4.i54 + br bool undef, label %no_exit.4.backedge.i, label %loopexit.4.i57 + + loopexit.4.i57: ; preds = %endif.1.i56, %then.1.i55 + br bool false, label %no_exit.i.i69.preheader, label %hamming.exit.i71 + + no_exit.i.i69.preheader: ; preds = %loopexit.4.i57 + br label %no_exit.i.i69 + + no_exit.i.i69: ; preds = %no_exit.i.i69, %no_exit.i.i69.preheader + br bool undef, label %no_exit.i.i69, label %hamming.exit.i71.loopexit + + hamming.exit.i71.loopexit: ; preds = %no_exit.i.i69 + br label %hamming.exit.i71 + + hamming.exit.i71: ; preds = %hamming.exit.i71.loopexit, %loopexit.4.i57, %loopentry.4.i52, %loopentry.2.i39 + br bool undef, label %endif.2.i, label %loopentry.5.i72 + + loopentry.5.i72: ; preds = %hamming.exit.i71 + br bool false, label %shortcirc_next.i74.preheader, label %loopexit.5.i77 + + shortcirc_next.i74.preheader: ; preds = %loopentry.5.i72 + br label %shortcirc_next.i74 + + shortcirc_next.i74: ; preds = %no_exit.5.i76, %shortcirc_next.i74.preheader + br bool undef, label %no_exit.5.i76, label %loopexit.5.i77.loopexit + + no_exit.5.i76: ; preds = %shortcirc_next.i74 + br bool undef, label %shortcirc_next.i74, label %loopexit.5.i77.loopexit + + loopexit.5.i77.loopexit: ; preds = %no_exit.5.i76, %shortcirc_next.i74 + br label %loopexit.5.i77 + + loopexit.5.i77: ; preds = %loopexit.5.i77.loopexit, %loopentry.5.i72 + br bool undef, label %loopentry.2.i39, label %loopexit.1.i79.loopexit + + endif.2.i: ; preds = %hamming.exit.i71 + br label %loopentry.1.i + + loopexit.1.i79.loopexit: ; preds = %loopexit.5.i77 + br label %loopexit.1.i79 + + loopexit.1.i79.loopexit2: ; preds = %loopentry.1.i + br label %loopexit.1.i79 + + loopexit.1.i79: ; preds = %loopexit.1.i79.loopexit2, %loopexit.1.i79.loopexit + br bool undef, label %then.3.i, label %loopentry.6.i80 + + then.3.i: ; preds = %loopexit.1.i79 + br bool false, label %no_exit.6.i82.preheader, label %run.exit + + loopentry.6.i80: ; preds = %loopexit.1.i79 + br bool false, label %no_exit.6.i82.preheader, label %run.exit + + no_exit.6.i82.preheader: ; preds = %loopentry.6.i80, %then.3.i + br label %no_exit.6.i82 + + no_exit.6.i82: ; preds = %no_exit.6.i82, %no_exit.6.i82.preheader + br bool undef, label %no_exit.6.i82, label %run.exit.loopexit + + run.exit.loopexit: ; preds = %no_exit.6.i82 + br label %run.exit + + run.exit: ; preds = %run.exit.loopexit, %loopentry.6.i80, %then.3.i + br bool false, label %no_exit.1.i36.preheader, label %loopentry.3.i37 + + else.0.i: ; preds = %no_exit.0.i31 + br bool false, label %then.0.i4, label %loopentry.0.i6 + + then.0.i4: ; preds = %else.0.i + unreachable + + loopentry.0.i6: ; preds = %else.0.i + br bool false, label %no_exit.0.i8.preheader, label %loopentry.2.i.preheader + + no_exit.0.i8.preheader: ; preds = %loopentry.0.i6 + br label %no_exit.0.i8 + + no_exit.0.i8: ; preds = %no_exit.0.i8, %no_exit.0.i8.preheader + br bool false, label %no_exit.0.i8, label %loopentry.2.i.preheader.loopexit + + loopentry.2.i.preheader.loopexit: ; preds = %no_exit.0.i8 + br label %loopentry.2.i.preheader + + loopentry.2.i.preheader: ; preds = %loopentry.2.i.preheader.loopexit, %loopentry.0.i6 + br label %loopentry.2.i + + loopentry.2.i: ; preds = %endif.3.i19, %loopentry.2.i.preheader + br bool false, label %loopentry.3.i10.preheader, label %loopentry.4.i15 + + loopentry.3.i10.preheader: ; preds = %loopentry.2.i + br label %loopentry.3.i10 + + loopentry.3.i10: ; preds = %loopexit.3.i14, %loopentry.3.i10.preheader + br bool false, label %no_exit.3.preheader.i, label %loopexit.3.i14 + + no_exit.3.preheader.i: ; preds = %loopentry.3.i10 + br label %no_exit.3.i12 + + no_exit.3.i12: ; preds = %no_exit.3.i12, %no_exit.3.preheader.i + br bool false, label %no_exit.3.i12, label %loopexit.3.i14.loopexit + + loopexit.3.i14.loopexit: ; preds = %no_exit.3.i12 + br label %loopexit.3.i14 + + loopexit.3.i14: ; preds = %loopexit.3.i14.loopexit, %loopentry.3.i10 + br bool false, label %loopentry.3.i10, label %loopentry.4.i15.loopexit + + loopentry.4.i15.loopexit: ; preds = %loopexit.3.i14 + br label %loopentry.4.i15 + + loopentry.4.i15: ; preds = %loopentry.4.i15.loopexit, %loopentry.2.i + br bool false, label %loopentry.5.outer.i.preheader, label %loopentry.7.i + + loopentry.5.outer.i.preheader: ; preds = %loopentry.4.i15 + br label %loopentry.5.outer.i + + loopentry.5.outer.i: ; preds = %loopexit.5.i, %loopentry.5.outer.i.preheader + br label %loopentry.5.i + + loopentry.5.i: ; preds = %endif.1.i18, %loopentry.5.outer.i + br bool false, label %no_exit.5.i.preheader, label %loopexit.5.i.loopexit3 + + no_exit.5.i.preheader: ; preds = %loopentry.5.i + br label %no_exit.5.i + + no_exit.5.i: ; preds = %then.2.i, %no_exit.5.i.preheader + br bool false, label %loopentry.6.i, label %endif.1.i18 + + loopentry.6.i: ; preds = %no_exit.5.i + br bool false, label %no_exit.6.preheader.i, label %loopexit.6.i + + no_exit.6.preheader.i: ; preds = %loopentry.6.i + br label %no_exit.6.i + + no_exit.6.i: ; preds = %no_exit.6.i, %no_exit.6.preheader.i + br bool false, label %no_exit.6.i, label %loopexit.6.i.loopexit + + loopexit.6.i.loopexit: ; preds = %no_exit.6.i + br label %loopexit.6.i + + loopexit.6.i: ; preds = %loopexit.6.i.loopexit, %loopentry.6.i + br bool false, label %then.2.i, label %endif.1.i18 + + then.2.i: ; preds = %loopexit.6.i + br bool false, label %no_exit.5.i, label %loopexit.5.i.loopexit + + endif.1.i18: ; preds = %loopexit.6.i, %no_exit.5.i + br label %loopentry.5.i + + loopexit.5.i.loopexit: ; preds = %then.2.i + br label %loopexit.5.i + + loopexit.5.i.loopexit3: ; preds = %loopentry.5.i + br label %loopexit.5.i + + loopexit.5.i: ; preds = %loopexit.5.i.loopexit3, %loopexit.5.i.loopexit + br bool false, label %loopentry.5.outer.i, label %loopentry.7.i.loopexit + + loopentry.7.i.loopexit: ; preds = %loopexit.5.i + br label %loopentry.7.i + + loopentry.7.i: ; preds = %loopentry.7.i.loopexit, %loopentry.4.i15 + br bool false, label %no_exit.7.i.preheader, label %hamming.exit.i + + no_exit.7.i.preheader: ; preds = %loopentry.7.i + br label %no_exit.7.i + + no_exit.7.i: ; preds = %no_exit.7.i, %no_exit.7.i.preheader + br bool false, label %no_exit.7.i, label %loopexit.7.i + + loopexit.7.i: ; preds = %no_exit.7.i + br bool false, label %no_exit.i.i.preheader, label %hamming.exit.i + + no_exit.i.i.preheader: ; preds = %loopexit.7.i + br label %no_exit.i.i + + no_exit.i.i: ; preds = %no_exit.i.i, %no_exit.i.i.preheader + br bool false, label %no_exit.i.i, label %hamming.exit.i.loopexit + + hamming.exit.i.loopexit: ; preds = %no_exit.i.i + br label %hamming.exit.i + + hamming.exit.i: ; preds = %hamming.exit.i.loopexit, %loopexit.7.i, %loopentry.7.i + br bool false, label %endif.3.i19, label %loopentry.8.i + + loopentry.8.i: ; preds = %hamming.exit.i + br bool false, label %shortcirc_next.i.preheader, label %loopexit.8.i + + shortcirc_next.i.preheader: ; preds = %loopentry.8.i + br label %shortcirc_next.i + + shortcirc_next.i: ; preds = %no_exit.8.i, %shortcirc_next.i.preheader + br bool false, label %no_exit.8.i, label %loopexit.8.i.loopexit + + no_exit.8.i: ; preds = %shortcirc_next.i + br bool false, label %shortcirc_next.i, label %loopexit.8.i.loopexit + + loopexit.8.i.loopexit: ; preds = %no_exit.8.i, %shortcirc_next.i + br label %loopexit.8.i + + loopexit.8.i: ; preds = %loopexit.8.i.loopexit, %loopentry.8.i + br bool false, label %no_exit.9.i.preheader, label %endif.3.i19 + + no_exit.9.i.preheader: ; preds = %loopexit.8.i + br label %no_exit.9.i + + no_exit.9.i: ; preds = %no_exit.9.i, %no_exit.9.i.preheader + br bool false, label %no_exit.9.i, label %endif.3.i19.loopexit + + endif.3.i19.loopexit: ; preds = %no_exit.9.i + br label %endif.3.i19 + + endif.3.i19: ; preds = %endif.3.i19.loopexit, %loopexit.8.i, %hamming.exit.i + br bool false, label %loopentry.2.i, label %loopexit.1.i20 + + loopexit.1.i20: ; preds = %endif.3.i19 + br bool false, label %then.4.i, label %UnifiedReturnBlock.i + + then.4.i: ; preds = %loopexit.1.i20 + br label %runcont.exit + + UnifiedReturnBlock.i: ; preds = %loopexit.1.i20 + br label %runcont.exit + + runcont.exit: ; preds = %UnifiedReturnBlock.i, %then.4.i + br bool false, label %no_exit.1.i36.preheader, label %loopentry.3.i37 + + no_exit.1.i36.preheader: ; preds = %runcont.exit, %run.exit + br label %no_exit.1.i36 + + no_exit.1.i36: ; preds = %no_exit.1.i36, %no_exit.1.i36.preheader + br bool false, label %no_exit.1.i36, label %loopentry.3.i37.loopexit + + loopentry.3.i37.loopexit: ; preds = %no_exit.1.i36 + br label %loopentry.3.i37 + + loopentry.3.i37: ; preds = %loopentry.3.i37.loopexit, %runcont.exit, %run.exit + br bool false, label %loopentry.4.i38.preheader, label %loopexit.3.i + + loopentry.4.i38.preheader: ; preds = %loopentry.3.i37 + br label %loopentry.4.i38 + + loopentry.4.i38: ; preds = %loopexit.4.i42, %loopentry.4.i38.preheader + br bool false, label %no_exit.3.i.preheader, label %loopexit.4.i42 + + no_exit.3.i.preheader: ; preds = %loopentry.4.i38 + br label %no_exit.3.i + + no_exit.3.i: ; preds = %no_exit.3.i.backedge, %no_exit.3.i.preheader + br bool false, label %endif.3.i, label %else.1.i + + else.1.i: ; preds = %no_exit.3.i + br bool false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit + + no_exit.3.i.backedge: ; preds = %endif.3.i, %else.1.i + br label %no_exit.3.i + + endif.3.i: ; preds = %no_exit.3.i + br bool false, label %no_exit.3.i.backedge, label %loopexit.4.i42.loopexit + + loopexit.4.i42.loopexit: ; preds = %endif.3.i, %else.1.i + br label %loopexit.4.i42 + + loopexit.4.i42: ; preds = %loopexit.4.i42.loopexit, %loopentry.4.i38 + br bool false, label %loopentry.4.i38, label %loopexit.3.i.loopexit + + loopexit.3.i.loopexit: ; preds = %loopexit.4.i42 + br label %loopexit.3.i + + loopexit.3.i: ; preds = %loopexit.3.i.loopexit, %loopentry.3.i37 + %tmp.13.i155 = setlt int 0, 0 ; [#uses=1] + br bool %tmp.13.i155, label %no_exit.0.i31, label %loopentry.1.i30.loopexit + } From lattner at cs.uiuc.edu Mon Jun 12 15:18:13 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 15:18:13 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/SimplifyCFG.cpp Message-ID: <200606122018.PAA00991@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: SimplifyCFG.cpp updated: 1.97 -> 1.98 --- Log message: Fix an infinite loop on Transforms/SimplifyCFG/2006-06-12-InfLoop.ll --- Diffs of the changes: (+10 -1) SimplifyCFG.cpp | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletion(-) Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp diff -u llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.97 llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.98 --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp:1.97 Sun May 14 13:45:44 2006 +++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp Mon Jun 12 15:18:01 2006 @@ -1515,12 +1515,21 @@ // keep getting unwound. if (PBIOp != -1 && PBI->getSuccessor(PBIOp) == BB) PBIOp = BIOp = -1; - + // Finally, if everything is ok, fold the branches to logical ops. if (PBIOp != -1) { BasicBlock *CommonDest = PBI->getSuccessor(PBIOp); BasicBlock *OtherDest = BI->getSuccessor(BIOp ^ 1); + // If OtherDest *is* BB, then this is a basic block with just + // a conditional branch in it, where one edge (OtherDesg) goes + // back to the block. We know that the program doesn't get + // stuck in the infinite loop, so the condition must be such + // that OtherDest isn't branched through. Forward to CommonDest, + // and avoid an infinite loop at optimizer time. + if (OtherDest == BB) + OtherDest = CommonDest; + DEBUG(std::cerr << "FOLDING BRs:" << *PBI->getParent() << "AND: " << *BI->getParent()); From lattner at cs.uiuc.edu Mon Jun 12 15:32:56 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 15:32:56 -0500 Subject: [llvm-commits] CVS: llvm-www/pubs/2006-06-07-LewyckyChecker.html 2006-06-07-LewyckyChecker.pdf 2006-06-07-LewyckyChecker.ps Message-ID: <200606122032.PAA01227@zion.cs.uiuc.edu> Changes in directory llvm-www/pubs: 2006-06-07-LewyckyChecker.html added (r1.1) 2006-06-07-LewyckyChecker.pdf added (r1.1) 2006-06-07-LewyckyChecker.ps added (r1.1) --- Log message: New thesis --- Diffs of the changes: (+5254 -0) 2006-06-07-LewyckyChecker.html | 56 2006-06-07-LewyckyChecker.pdf | 0 2006-06-07-LewyckyChecker.ps | 5198 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 5254 insertions(+) Index: llvm-www/pubs/2006-06-07-LewyckyChecker.html diff -c /dev/null llvm-www/pubs/2006-06-07-LewyckyChecker.html:1.1 *** /dev/null Mon Jun 12 15:32:54 2006 --- llvm-www/pubs/2006-06-07-LewyckyChecker.html Mon Jun 12 15:32:44 2006 *************** *** 0 **** --- 1,56 ---- + + + + + + Checker: a Static Program Checker + + + +
+ Checker: a Static Program Checker +
+
+ Nicholas Lewycky, B.Sc. Thesis +
+ + +

Abstract:

+
+

Automated software analysis is the process of testing program source + code against a set of conditions. These may be as simple as verifying + the coding standards, or as complicated as new languages which are + formally verifiable by a theorem solver.

+ +

Checker is able to find two small classes of errors, one is memory + faults, the other, non-deterministic behaviour. Lacking interprocedural + analysis, checker can not be applied to real-world software.

+
+ +

Published:

+
+ Checker: a Static Program Checker.
+ Undergraduate Thesis, Computer Science Dept., Ryerson University, June 2006. +
+ +

Download:

+ + +

BibTeX Entry:

+
+   @MastersThesis{Lewycky:Checker06,
+     author  = {Nicholas Lewycky},
+     title   = "{Checker: a Static Program Checker}",
+     school  = "{Computer Science Dept., Ryerson University}",
+     year    = {2006},
+     address = {Toronto, ON},
+     month   = {June},
+     note    = {{\em See {\tt http://wagon.no-ip.org/checker}.}}
+   }
+ 
+ + + Index: llvm-www/pubs/2006-06-07-LewyckyChecker.pdf Index: llvm-www/pubs/2006-06-07-LewyckyChecker.ps diff -c /dev/null llvm-www/pubs/2006-06-07-LewyckyChecker.ps:1.1 *** /dev/null Mon Jun 12 15:32:56 2006 --- llvm-www/pubs/2006-06-07-LewyckyChecker.ps Mon Jun 12 15:32:44 2006 *************** *** 0 **** --- 1,5198 ---- + %!PS-Adobe-2.0 + %%Creator: dvips(k) 5.95a Copyright 2005 Radical Eye Software + %%Title: thesis.dvi + %%Pages: 18 + %%PageOrder: Ascend + %%BoundingBox: 0 0 612 792 + %%DocumentFonts: CMR17 CMR12 CMBX10 CMR10 CMBX12 CMTT12 CMMI12 CMR8 + %%+ CMSY10 CMMI8 CMITT10 CMTI12 + %%DocumentPaperSizes: Letter + %%EndComments + %DVIPSWebPage: (www.radicaleye.com) + %DVIPSCommandLine: dvips -tletter thesis.dvi -o thesis.ps + %DVIPSParameters: dpi=600 + %DVIPSSource: TeX output 2006.06.07:2255 + %%BeginProcSet: tex.pro 0 0 + %! + /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S + N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 + mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 + 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ + landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize + mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ + matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round + exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ + statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] + N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin + /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array + /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 + array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N + df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A + definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get + }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} + B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr + 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S + /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy + setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask + restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn + /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put + }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ + bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A + mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ + SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ + userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X + 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 + index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N + /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ + /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) + (LaserWriter 16/600)]{A length product length le{A length product exch 0 + exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse + end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask + grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} + imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round + exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto + fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p + delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} + B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ + p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S + rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + + %%EndProcSet + %%BeginProcSet: texps.pro 0 0 + %! + TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 + index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll + exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 + ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ + pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get + div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type + /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end + definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup + sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll + mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ + exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} + forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def + end + + %%EndProcSet + %%BeginProcSet: special.pro 0 0 + %! + TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N + /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N + /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N + /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ + /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho + X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B + /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ + /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known + {userdict/md get type/dicttype eq{userdict begin md length 10 add md + maxlength ge{/md md dup length 20 add dict copy def}if end md begin + /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S + atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ + itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll + transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll + curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf + pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} + if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 + -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 + get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip + yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub + neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ + noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop + 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get + neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr + 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr + 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 + -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S + TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ + Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale + }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState + save N userdict maxlength dict begin/magscale true def normalscale + currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts + /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x + psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx + psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub + TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def + @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll + newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto + closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N + /@beginspecial{SDict begin/SpecialSave save N gsave normalscale + currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} + N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs + neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate + rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse + scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg + lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx + ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N + /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ + pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave + restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B + /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 + setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY + moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix + matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc + savematrix setmatrix}N end + + %%EndProcSet + %%BeginFont: CMTI12 + %!PS-AdobeFont-1.1: CMTI12 1.0 + %%CreationDate: 1991 Aug 18 21:06:53 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTI12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMTI12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 54 /six put + dup 65 /A put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 71 /G put + dup 73 /I put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 87 /W put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 121 /y put + dup 122 /z put + readonly def + /FontBBox{-36 -251 1103 750}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 + 525003F3DBE5BF07B2E83E66B7F97DDD7CE0EEB75A78BD9227BF359D002B6ADB + 8AC57A33FED4EF021A7085B1E2B933DE602F0FF71467ECD501744AE338AF29A0 + 26F7D368AC6F25CCB882DB7B7343566192BD687E1349225982823027D3B66703 + 3B0DB7A7E680A682B98023D39C7FAE81A5D5B867A0A66C8AA0DBC83B1596A84F + 0436AC6A7900B767BDCCE0060A4811003C79FDCC71D73F7F2D0A6675E93AD21A + 56B4CD8EF75EED3DE8C0A18BEBF7B9D1BE72504872D56EDB272F1E97FC726CB6 + 68C85C713059DA19F6C2E0F3E12710A59B6FC4699AE883DE8C8615B7292AC25C + D5714B6CFB14EF0EF11EB13009BEBA4F345A5D3D6D9926ABC2BAD7DB1328651E + 437BFB3C46DA7B62219660FC368CF3D3704DAD3AB461C28F711665BF484BF61C + 052093D231CA65618EA463D63E406ECE858D180A6C0589B2FEDC321371C28E77 + DE974D655DF5FF7D41ED01FE717D928A885F6FA6CFE4D2C0807F8E7F937916E0 + 96EDD1A3BA67802B1F4A49100E75613BA0356D9DCBBAD4DAB3C59E70A47058F5 + 2163D1730F0EE4D1F87C3A4AE723A23CFD7986FC4FBD399347E9F5946354E013 + D860FC446AFF0B0744F5DA27CC777C96ADB388D1E835DDCBE123FB517679B9B7 + EE5A3DDDCD392415AF58CE22EA55B7F47031138C6F27798B40F7E18FDD315912 + BE99F33ADE0FDD538A8A3E5DE58AF68A54732AE69F188F3F7E0458D848205648 + CBE820C287ADC2394520F03BBB97DB893F6A12154B1B7F8626D35CE6B70F8524 + CB128DE87821A0E32F1E825F6C50AE8B4BE37FAA3183BA4D678E896CC7E61CC9 + D0226FC38B9CAE0939D19149D987979B96A86EB69A105807AB426639292FF5FB + EFF0817FCFD5E517837AD66AE8E3BBE34EC130F8F3F6460A712601686071854A + 3D983D84F6EEC4E6F04912E37ABB067121E0BFD5DBCB38065D15A73B4F148829 + 7932E91870ED3566BC3384F562C824ED4211BF793113943CCFAC49B348361C48 + 036E01364F9CA555CFF8E5E888D90B1BBA51911B9E72C8A20C99645E95BBA4D6 + 2000318B2ECC2322B8504044707C15ED5C5A5F3E62518774C1001132C36B2497 + 6A5962DD93B8E612EB1C3EC92BAE2E1316E0254540CEF9C8947D1A732FDD6973 + 2A84D2660A873E495DFB3BB0FF79F2CA458A905871C6B6E1DFABBD7CBED979A4 + DFC77FDBCEE671F3B9DD5D637A2E5C521F1F725B5A54B15A3635F7A336CEB18C + 20D3333E0DF79CAA0A60E7DD01B134CD62688F542F0D2CF79B9DA7F8BB4A73EF + 509409716FE59E0C9F72E3DEC73C5FEE424C12AD1A6C365E14927259CACE09C0 + D8AA5D4E19CA34F74ADCAAB1E51021461D123FB8765589264DA08BCF5F72BE4E + 10AAA1471988D1E82B12422CC216E2E4470BE5B3D804E2C8A14A35295562C87B + 0ED837729143A45C9BA0FA438D5B68BECDBFEFA31460D3850CE54B41FEA8DFEB + F7F1A7C9A8BF03ACA079667AE235A758E5C9A37AB28F3AE3FDBAB76AEBBE7B7E + 3B91405401924F6E9EB91E04982627EDF68FD26E613ED250CEFB075765C2E86E + 38C5E3AA947DE0DA39183A09F58C0185D8F6AE76EFA0A8C41A55256FA3838406 + E160882C068567636E964ED3EFF87105F68AC486270377C4B570CDF4247C28E3 + 34774671A882665D740C400694826E9754F679EA3007A442EF179F738FB2E182 + E2EF67A411EAF4307841A5ABB2EBDF3790510543FE0E6FFAED60331EA96D17DC + EF734BD076DBC41BC01483822BA048713938FACDF503A580168CBFF824433F1B + C1EA34BEF484B8BC95FE6A21FA636BAD34AE91167BFBB2438EF085F0B294FBEE + 34959A6B91DF7A82E8A9AA11C0060234E221BDC52D0D2F336D72D465FFBC5636 + EB42E45087341A590ACA40AB2F7614541AD635ECD8E908338383380380E7BCC9 + AA6D72D7BAFF984CF7F884CDEFBBA6EFDECDA511871808AB076E2097D15E0276 + AA0B097806AE7D9171E93F6EDC6ACF6A40119DB5F64AF313DCCAACA46DB3E64E + 0881F1AF2898AEEDAA4A9AFBB3A24C7271C5DA9B05A4BD8C8D206874D483B832 + F47B6D8C7A2FD120B43FB75F7AE3621F42212CC2325387960A37E05014F060EB + 2D33A5D518C8F69EF97E6B9A2BCA43376F354583784263E782D05936FEFC5218 + E2352768B438D0529EC7830EA0387FC77F9960C188A2DB296244AFF1115DA8E5 + B39D19D0EA1B1BFE0CA2E1B02AF37CD400ECFEAC03055AA61998BF07B6C0F06B + 29A94E287485E6E652329F38DAC877AA06BBA70BA564F5B16F5B9096D818880A + 1500A89B834587F253912AC55F1A70BCB0410D743B63699711E5252E46502C9D + 3CCF98AF85DB3B89DE5AB3DABF274C3A1225E683F27A2D0D28E43A1F679494A5 + 385D18D1DA5507617BC194D473D54C27A9905C589F00F80C5FCF9F5082E1C067 + E94526A9A7168C555956FEF1E8374127E26745AD6249A2585C8B83E546CE409B + 7E4B767B457A6F4A14E4FD34B613F93B907E49E5623E70B86B06FF8566FB2B1B + 74FB517792BA42F2D2F1B4B234118D306A49468809B5630854EAA748479FA397 + 77C2E9545DF0AC4B9C66F44DADB1A53F361C20B130BBF69078BED68BB497EB61 + FFAD51AA160059B923D2E3546F23C46C060F9BAAE8AF4E90EDE47121354E8E89 + 5FD249EA1D922D80A4FFD37D5BAF406FA0E11B31B14E48A3FE291CC302D598A3 + 9FCD893561FBEB0FA73B33420FDE3AEAE44792D98B94EC2C41201912AD16183B + E556F3F3E9C3F0A41CC2113CB8C35A84BE2C70E8456AC38A332A3BEBF581199E + 25A29034BED4D2C57A1731762D9F6B672A21F6A265B33999D504D2288639341A + 054988A037F73F7CB95342D40996F677714389E071603097B17912EA405B3DEE + EC6E719045850B404F7B24DE391C59F84C14FF96026085C428FB791C74917BAC + F12B23578ADE04270AB790F171A1D740C82135B4467B6DCDB833525DAC0D3D48 + F36954006EDE6F94A8DCF01A57F3E019C9DC0DF1E1EE984E0EF1DB67EDD9FAE3 + 86DA83DC039AD0E128FCC6C6A80F6F09DEA11A3A4A61A2E5B7AEE869E1DFEEBC + 8EC0201178BBD107662F4BC402DF289B4B40A5D3B69595762D58AED124EDAF99 + C665B79A36D73473A0C291A4AEEE1F6FB1FD9A53100D23EF7A2DC9D8033CA919 + 3B5A7E2CFC6DC4B162A120208179AD3B3168DC9ECECCC10B81EC3A9C536B2A81 + 40DE5D3623210EB092FB5924339981E44B1B6198D875F421F2A77E648122BA48 + A919A36AD41317C5A2531D7A5B00FD332AC7E60B1470B183FC59859851DC2A65 + 878D6C025830DD7FD59A9855F98FADBA37467379043C9E8BABEC72CF6FAE1CB3 + 0E10AD79606AB5D1EFFEAF75A5DF50A33270BD8723E71B58C8DA509C292FFF02 + A2C623DCDB0B679642B8D9EAF91B988768EEE14EFC7C6A8B0A7B2FAD355E848B + 208BE353D48864B3255FDC4C625BC2759D73DD11429C33ABD695386A5B03098D + EBB02E9081B1B94C5E384C191068DFDD070C1CD3A319BB9E620BF4D69E1BACC2 + 178AC549562699DB847C4FF61E1F21CCCAE13A0D5B68F568DDFD38D8244E3053 + AF49B62D313DF7DE909D2020B63EDA601CF3DEBC8185CFE808870D004DBD7BB2 + C11298E61CA27EAEA6B973D3A7636E68ED370E95FC4BAB32DF3D431F8F3D8F16 + 1CEDB9A22CD93ED2DD6B2C99858BB3912C7156B54442395E82AB6B6FC5E87460 + 85136638A6B012988880ADA78784241C248604768940D3AAD47C01CA722B3373 + A2E79360E5763D6562EFD556CC831C208D0B00813FA13407B237CB7E4BE7B661 + DA3DC5C6AE78C3F564EF56AEF786E47A156390A1C03A2E23BB497CFD4984F450 + A7848CEE650815F7280F295B2D70AB36BB1EBC9E8DAE981C0EADF10C1079AD9C + C858783AAC36E8504DC854C77248D9A0B80FFA6A5740FAFD315C3340333D57FE + D9B77960147A6CF8FCF98D6B59F7C799B9FD473CCA05BC559E728B610913F7C7 + D6D1BE16D307B0DBDFFBC7ED49C6DF887DD619EDEAF0BA4F12A9BCDDCEB9F73D + A8CF34E25183189EACD4DA70258D117E201CE334491DB96DB962D8835D5DE14D + 2748FF52E7EC157400E98150D1870E0720D48BF5CA9DF315E2814A4F35402C0F + A1172954DC7C14960FEBE46C56A2CB6E9E83C3D75D6D647BD494CC8FEA58A7B7 + 6D4FD65DF3C44A91744B678D8F218E69C16AFBC80A53B3F2A9997C6DF910A985 + 544B326306BAF7987C01173046C746E17003DF7A2E3F500F33F679E89495DB50 + 350398791856447A32ABB40D299BC53AF53933D1FB844B72C2B2A6312B09B7F7 + 480C05D5CBA02CF5CDB7C33FE774B7339D7C8F9C4DD41247AB44F76AF6E861B6 + F2B6203CB0DFFE40E539B398A81D757F322716011EC5BA16907DAAB1CF7C93F0 + E9EA33DCCEB5C2F6BF3B7682B020879A296A8D4041715581654DCF6BCB9F230C + 81032D6AC76396119AADDFDE75E0E299C9BFDDB36E9F255A6D0C87B7DFF05C36 + 0261081D67E039CB1A84055C87BADD5303402978A7CC87D997D0A7A5A0B98160 + 3AE4B129B4E76464F7AA4CDDEADF73C53ABB4BDEA5863D7D33FB9BF1A24CD9A3 + 7113B8F8E599AD7A76A3560BC713A829A6E7B2EDE9FF92039CD50C50E94CEBCD + 596B3FE640BE1A1112684AA65AEABE7A29794024682EAC59E2E209C7DB8D6820 + 7CB55C4530E3DBCEE65B6A147A67BB1EC84B4ADBE30D6DEEDBE0183513BAC0BE + 7F8AF036B002E7132EF64AB1A19FBE232592F3421AC9DFDF316E2A71DDC13689 + E84A3F52BFE24AABF7CDBDE974D45C047535BF1A202F8C3EEC0EEB20708A17F6 + 04C674C1391A02FD89FFDEB5E7E7A8D87A4F976565F7293BD65B2FBE2B78B079 + C8FCC8B55625C27EC2E493C8A567CC7C7003CE6F714CFC051291EE884CC305E7 + 77819FAB9FB7940984DDDD5F5C6E246A659FF68F6549F513F93C855658FA11F1 + 859DEAADDEF02BC24C3F7596812D828F090FF3E1091185E4D748C6E0C0313B58 + 3E790CFC61CFDC6E2EB92268C4DA69AD0BC9FAF87FC670190B90CDBE9A6E6CE3 + F194734028388FDDD2587AD5C5FB011BB9DA23C974B05ED60A0A012F9A5C5CA7 + 7E556661553807F47CD6A87904D97042CD9E97E3ED87EFD08F282FDB5BC663A2 + 2EE0C20639E6B0D1DD62271E96BEB5E7BC7984CAE0E448ECD903627F690C1F08 + 3CE9B9343AEA9247B6B977464C2A8228F3CBEFFBF767E2481D80F64AB5AC2E75 + 36766125CD5AA6992459195A689EA5F9A745B61F3F99F7DC0F09BBCAC83F74B9 + 19006200AC42573A3582D48BB729BAD07C81105D6F41C1EF33D6604E13C8E649 + 6777415618F685F5FAA1F9734C28E139745F4FD92C57D2389B43E2536E93D090 + FECB26BE4A95EC042E79EAB974015362696601A895E9743DBAB525A0F8926B0D + 7C77B9422F584498470A182123174EA68D08D7B5BA761BF14A17A7FDD441D3C6 + 28663A0633BCB5BF735C7F0AD11D05B984BBFFF562CB4AC1B6BFA72B0422DAF8 + 7D24ABF1560CEA8A78B90E3133A804F3AE2ACBB2050FAF141C9E0561FFEA0966 + D119C7F41858B18987CE96363CEAFCEFBF09956AEB0EB44ABDEABC4D9435554B + 46F29202DE2E7AD45A4170638B43E2A44B014EE6E7C975364C558076D62B165C + 2B44716E05F4F3D989E1D6BE3F001A1B093825A63BBA029EFE234E5FFB94D732 + 8DEF9FBBE5E62CFBDDD3BB45091660396AD61B7A24F610E902D213E1721C5398 + A982C8EE862F1369003466CCA88BFAF17901DDD21E632B6405940E162B7CBEEF + A8F3D1A411A77FD80F69EA91816396EDA4616815E7B410AD827637E43AFEFD8A + A3AC37119FC0A095942711FB34875F301712299F3F93E2474C8A45E073442DF0 + A666F46DF0721548AB589D4D495A43317CAE1F67C740B88E9780E2AABF7486A4 + 201B277B9DB1E35515602F1CC003F392C6515A62FE3F106C02C26DEA4BD5A463 + B8708CFDFD3B64BB79D262A96D3416F7C5DD4E8E6C87C2292A783ECCEDA8659D + D4C1BFEFC5F009F9CF158E7EA3FF1307EC574637B7C22528C927083161CA9146 + 30E86B2F11636E71990E35FA26F43E1539DFEB444389A2DEFD41E00B8A5B5889 + FCC1B1DE520CEDCD4C3327FB997B8C6982703EF83DC2E5C35D1476C0D3754732 + 64136F5EE31ADE0493EA580C785EAF181EC545270EB7A30C873D369D5B64A034 + 8A1FAB6E48FF6433ED5D8A44CC91683406ADB7C52CD7E5D738EF8E9E3DD290B2 + 0101856BE8E22FDE7BB5A0A6EDEBA3E9DECC8573C65FE92278F3746716D72494 + 58D1B0F07082B7D7B32A3B9B32A997B11D682FE942F6DC15EC4094D1651197CD + 786043787F465CB5B5107FE9CECC0448CEA354B32906C6A07436B05B287DA9DD + 1DC29DD5E6EAEA80B673FF6F7A815782093059E5694ABC419FE85AC6D35494B7 + E195BD1978C10F3194686827ED4EFFCF9B24F1444B739982754493DC333430BB + 1D5B686B73E342C155009719EEDE5C0016B406C00606B523950A40E4327DB919 + CC607122AF22E65BE80C429F8A0E9D63B8684B8D5DBC81D5EF2736FD36CA43EE + 030DA8ECD039578940D4B3F8E41E16579DD93C88F2FC95E29A3C3CA073D9E047 + E647C328A2CB464613B34BD7C68422C964E8B014592DBFFB4C669DF10ED97F26 + 317D234E84BF6DE673E07547EB9A76B040989090B30FA3BDFFEB7B301D3085ED + F7C913AC6281229CE2B162B075FDE95BCD7F8740B8FA7B83715C63B1CA6EEA56 + BDB152199CF75BCEDDE656A49364246EA9ACFC7A1E95A46864A1ACEE20D8A2A9 + 2E7D7AF33E8931CE7FE587F746BDB5F3FDEE0E27346EB755AB8361F6350D1457 + BF84234F6BE443E586131FF27E5AB8B6FAC34ED59468D0C6B2D5E19BD51C0A9F + 5CFCC5F1878A86808C2A2FA6CC881DD64FA33BB2A776C87FF17411A356BE9FF1 + 97B2586C4390F33627EB38CA48D14C428094AAAE368AFF888FC66C23D20DC418 + 3969E25FCBE7B698828DC78C93F85D3B3EBD4DABE889E4FD9E985D978CE8882F + F365F56BC3D0F92A6D4D0DF3BDE5ED16E61BE2972A7AA74299CEB247363A8D13 + D3B572F9029841AAC8CB3A28485E1FFD4E74A1108E726EFAF9A35FEEC202AB01 + 28541C1FCDED32986163EF1D715B50494B0ACA419BF5081BC370F09DEC2A3537 + 52D00621A326D36E231CE778A9B9E143A3EFD6008FA631CD9BA6C3B67B6A2262 + 698931C5DA263EEB9C44AE02089084B6C0BEB8FBFF8675C2678B181456A2EB68 + 7C447352942DE6B3021E95B5DF006E1E57AE28D8EFE0C29DA59209FD1785CBAB + 6B24E7778BF463E7E9703C8EC754A1A1012F49A0CE52AC2C4E2ADC533E8BC542 + AA6345F011D79C63DD2E96FD415FD628BC32D31C42BE12D41118024134D325F6 + 272A201A6D896052FB89EFF6AB18FB60C9E7647C4EBC2CB84D370E619639548E + 58019B167474031C5C0962BAC15CF7BE61E3BCB7F2A52D5FEA85B908FE100C04 + 701E6B54EBDB524E751F0A302A324D78F736C177E0559045BA95095A71665665 + D7766CD26969C07F5E88F0684A46D2C7AD1B9E3113D0CFA1FC6136BEBAFFEBB3 + 893AB3B8538F4E74EE502D51D1A5078E5C9AB9E98417D5D08475A0186B50CA80 + 5DB4F98B3334810F3CB0D2EA73DA94BEA2B1E41C1C318571903BC33BB516C497 + 07E1EC708FDD9E50EAB59639424DD88935CE6F8C31712EE8BF48A3FE3FAE7755 + 3396E92B0AEAECD6900B5F326B728D424FD62687C6811318D7CFF58EFA2A9C24 + BE5A5950C29A51934460FFCD52697CA9A89B59F1ADA99DA4A1F21D20B0D0105B + AB8EF83ECD6A1B9C6DF4A5EA93E9380479CC97998207F92ECF54986D502FA024 + B5EFC5BBFBBB9824044B9984A7DA08F2481CBE5D1DF4BE7215E16F0FCDE6DF39 + 6FCCBD77DEF61FFAB08E2610C309377257144A2AD8B136BDEC8065B40762652E + 31176BD7DF5E21AB32DB7FD0A10C782883FC5C7EB9F16EB358FFA0812464910F + E98547B0562411C5FEEDB503FF4C1F7EF83D389AE01A7282FE41EEBC1C638A10 + F72A4473A2DCC402F227A6D7A0F1C46A2D445359DA350B4487CB105DA3939CD1 + 61F703E43DCE95B8CF9A3D563EB47AF9900364F8616BF9F3E0A22F04B26CAAA1 + FAD3D1C99E46AAF3A1C6799772EF6DC26C33D369E543039C49B39129FD4D6836 + 1ADEF1E2835F08419A48045ACB9183C1438DE74B50A0192F7A25053F9AF68A78 + 72D13974BF26BD3945F5EABBCB150096BD0BF39A4D9A8FD14DB7025F6726E477 + 8A4CEF395F01393AF7F58C27679612EBFC6A4DC0EAA1D2396604698CF13336FC + E39E34B84C346446D4BCB36A29CD6D599450E842B7EA42FD3C3740F53003C2AE + 01368EFCAD5B8C19363A678B9AEC7B60641DAE7B643CB2C88C81757FB8EC3D77 + B8E18AF54E32477AAADE7E2B77D61C586054F6547942261FF4F6F297F102040F + 755923298C7DD39ECB2825DCBF88446724A2F0CD9F7AF416F807AF74E3C70B5C + F11D4C5BE0E61BF9A1CD9A3F1079EBAD910E7BF875CE89A7489214FFDFE46AC8 + 2C53B0DA76A5434C3053EB68EAD681C7AA2411A3DC8042A55B1DD9E7E88D0FA6 + 236C6CFC8EB1ABC6CC2C02C9E0BB00FEC3392F2FFF63DD402A9B6162FEDA6FF5 + 592E6E5D2FC6E5C9EB06439E5F181772D9A3655AB736153D42C192A4AB88FC94 + 6888118535D7DE59C4AAAF7D3F6B3C0D1F3FA727115D5834A9D791A78812B360 + 5F67D2778D3ECC400101143D4F0C85BFC09E61278699F390671021624CE354D2 + 6FB0B975789CC1CE332AA164A9A3B1601D403AF9688EC2FB14BF696D14FC9460 + 3438F8EF0D5D76193DCBCD66FA2D0A7E10BE2C4658BA2155DC82A65D4528112F + 51D2DF6F486B6F74FBCA742BDA4E4FCF2CE771AA37A905B95957D54DA78B463E + 6AE1545E3D0BDFDBED754C34C5BD978BAF59D35E1FD687E5596DC2AAB6E68C19 + 6D9148EC3AF5287DC7D77D2859F2489B00E318DDC736A3B32704CB62371D9A11 + B7C3F3E8BAB8D3C39CA8F9CB3D032E6B6AA272CF660BF5F0AA2503E4B6620F9F + 93ACF9F38D40190B2314A78BF8960786B26177D2D5D6F1D55C2D619843ECB00B + FF7420DA5DEB6B2F18D41B84ED5AF30C7FF7355B8D598091D8CADBAB25AEBF77 + 39ED64737C4D25A4F4DB7DF00999E60041A4582F4A162C55A43C7F63A8F4FF0A + B27A7E98F7AF974C7BE28533066AC6DBD1683C4A882DD49C2352BF9DA7B39837 + 34D03FC9B71484BDD9DE3AFDB9B85E2063681BCFE2FEC77E6FC1DAA6F4045570 + 7EFAA7E584C19EAE66875A8B701E81FE354B2CF79F32579B6A49C0790FBF8D0F + EE821B1DE1EC062F1326C83DCFB3F0626059A712516A3B14C2C8F2D72214B04B + 50C707477B55C03F51F6AF5E9642B772C8E687A2B1EEBF2F8083DAD90429F720 + 962C110024384506EB61656CB3241193B5C9B005821BFAA5E46F0005A281DA7E + E04576606897B61C016D2B77B8481B2772F565696434F2BDFA26B082A7E6D4CC + EE62DF9046356D5F8A0FE74782C4CC8D7133D7FC1B5D39E4E6145EE4CCEAAB0F + 1063C932537AE481BF66F2559F6542DC7C735766FEF189841F37F46F0B07A960 + 71EBD713A573D519AE94B4F93035834C223A875BF5132B5B4C9462C541A77B1C + EA01C4AC078AEF8E463943FA66D612037CB76A9887F6F207193524B5E1E5A85B + CA66AFB1A9B812FBF5CFA55D1F0F6CFAC26CFD53484E7D81D31E53BB94CAC5CC + 568A18ACBCDB5893A90AD0950D75C194FD2C5121276D1006B1C43040FB8D3D4F + 5A907D95395B53382087BAB21AF6FF83D78A804BAFEF00C57A7E2A8E5C5E5D04 + 3CD46CBD6CB22B4A77B61B1E5C8086057F90D908579D04D04CB0960E3CCC093E + F6D0C01E2A2438A7726CD2519EC1DD43E9DAA33DC0299D2C7FD9A368D346B8AA + FF1EDA2F3DEBEEA2EDEDB8D441454A69A8338E81E125330924BFF168E877C913 + 84A44375A6A59B96F9921F4D5AD527D36D7F377FF2D164B33D839B2EA7ABF221 + 4DB582E66D186073D8223B5C8F6E13B3FF0A30C71D2891AA3AB775362A492E43 + F4654344D9C1AE6216D269B4BED78119100864B0C02B15877F5CEA18B88E28E9 + 15BC86CE328AD0BBA335C649431F253FFD98646A21035822092765A5278BA757 + 64C9FA40D6FD942E750BAC922145EA32156D47FCFA706D066280A8484B1E91C1 + B8E7389888A23EA3F8664C3EE61B728386C969E31E6062C9F289089E53E3B546 + 2ABDA0B01C04F5A48F7484B14480638A826B526935F65ED5839F4BB47C11A5CF + 6BCF01DD84DB75EC782934AEC675B6CAA627D90DBD4A4762935448AC58E96BC2 + 9FB9854AF81407EF479C88E72076E1EE57E3D2A6150C9E05FD3FE10CEDA15598 + FFD5FE72FC48B29501B466EDC6EBDD439BAD9D8C1E406DCD63B0B7CBBE692BBF + 02B28109B1E04CF7DE63C5987FFF86F555D0A25E80D57FCB83874F592AE9F151 + 376D99334B6A45269B0BAC8422860006B169EF2195F0E6F878D1D4CA50059513 + 00F1A94FFFE4081BA50A92874B1013AA004F921EBFDD8972264E981574B822F7 + 2417BEF9AEA160C56619F3266AD96FE06F39120784F5BD80C2F520A648AF8DC2 + 1640E5178DFC7239A1B65B9D8C4660C4076D9C02A19541C9DE47AC697B8491E1 + 911535BE527886B51E4BB0113E8FD2A64B2711F8A6818850799D457E6FE0C928 + E18C7A1F3DF2444049711EABF6AF60FFBF92A159503B919E605E76FB3FAC89D2 + 9D6FC985C5EA667F8ABFF293DBD11280A3E8EDE8A46F6D92D48AD171BB6EFC98 + 1689504DB71708D919E5195C99B2F3421FA50BEB143B5F3C660B4AB869172681 + 9D603DCE1C8A7ECA8DBB9CB4A443C417350D14E106D2FBECC04178A23AF2FD1F + 660A7434E43769BE89C75A544D8E3912C174BEF56F9230B2C5BDCAEAF60F10EA + F44635B054097A6AE1B3B12619F559F07612CFD172B460173CE4CC18EE88F562 + 494F7BB57672EE1B51A42110F5C8581AA40757ECB39CFBE9061DA22E0FEA84AE + 60FC96F92C223C5B28B5814FA246C50EBE75FA47E1D2C13B0F52BA2C74326B8F + 2BAD42E168217F60C159324BCE12181E8FE4D5D11E6FBC201E344900B54394A0 + 1116918B5A8428D45021F9B99009E53A5B09900085A2159E7D1CE1B34D2FCA35 + 8A2E8EB1457AADABC6C896C696378A0FFA02DE82A6D8D842409A520DC8CD7482 + 5565A6AC5D1AE93FBB09C1B06CEA5115D873AA21F7B7E1D9A66B320E26FEEF1D + D31C768656412ACBC0150935863955B71EDD8283958A53110922C88198D306DD + AAE7D18FF14AF73A60234BEC6F05D2D7095A57C46850C9F9B782F255D8190D83 + 719A8DF1248597D280EB8F33B01BC110FDD8A4C913F36DB729E31E768F5AD1D2 + 65A0A3B13A25F04CE22477E327457EF54D4068E63E0423F3967F31CD0A7F9060 + DF6922C843C6F7A4C7356B1573B99697CE8CA1290BF5C3FBEF08E37E7E731088 + C425857E6343E02EE79CE17D0A5473DB7BE00586989F239307C70E5AC7DF7DB5 + D8A868DC8D2A7400996AAA245124B7B446A802D5CB88C25292713F3FD3A3E9F5 + 4A6D7242B663619B69495025165705F34DCF1D0F77350F4B18412072958AB7E8 + 167CC13D9F886F57E15EAC57B68C10C3F1A282325F823B36A45B152CF11103FC + EE0889061EA1479F83CD2CCB1C1BD628F802C76952F4D0B8AD19F937AB2BEA8E + C72A824EC1ADA661C60A65D3BBB20E9D31D5EDFC3D76ED55B6AC0D66A5B92212 + D4001F8B23C0D21152795CEC56C011295278DF8200F15661AD45E4DFFD72279F + FB101284F18AF8D6DE41EB10434B520F09B749170836D1E5B856E258CD5AD8AC + 544A66C723459252F25FD8DB60844853F2714305F83F0BC9248B42EDE9EF122F + 63F0D0363C456CD31FFAE9F46BE96B985020B2FCC6A45FCC6783ABED9BC9305B + 506145E39679D73AE210AE34A5114BBA173DD2687A80109BA970F0383DFD77C0 + 86AABC65D4ECFE53849B522CBA0C1C675657E320541BE652EEA51CEB951CAA89 + 27C312422113F4FDC834D05F76920907ABDA7BE1BCAD76A63FF75D1D1E12F93E + B6312431EA4EB3F42E89CD00163320F6FFEAFFA1385E29D4792B2B64DDF65C27 + 49FBC3D726E13C9FFE15CF2CD0730583A82BA1EE46C593BB0AB03DCE565B0ACA + 4313C1528DFD323EF9DE816227984BE43370B9FEADFB4FECE55CB262C8F52329 + DD3B6F751E80E442FA22FD928D3016254414D8668F9FC2D70FD253493C8EC915 + 175D3626700C8FF1095A904CA49A6254BA6226FDDE75CD34B09625B6F20AAA54 + 5C3E4BF0399F4A84F875FC085E3D85F8791FB2D32C0A32F118AA3E37C5914382 + 1F641EADF6CF001AE2089E0CF3CFFF5F313EF4C88521827211F8D1261FFE8B1C + 2665C0F3C7F6E3676DCF07F20FAFE88124FFC4D39E17EAE771ED72DEBB897E8F + 09CB50BF488A645E4CEA19E4F0C336E8903D375C170F158CA15D8E201905C5FA + 5797CA0679C080A78BAD847F5087BC031EA36BA8DE92D40468D2410ABA3358BD + 6A0916575015BAF85E840CF94B5AC8984F3886E282851773BD1A1605813D86A7 + 8583B6CE5512DBB5F23D0BDF37A1A760CF9FCF4F57658081AD5359FA02945FD0 + 6863B791B274F1F8123A73C3C98F68C2A466B9894EAC5DE1B611D95638B42FFE + 620EDEFA266EDEFA770BA2FD37D71E0FBAEC369949771CE6F780B51948811A7A + 7DEE58A45A899A1F7C73A8DF3D3A1708765178DF8693AD20673FA29563D85CEC + C375EDBD8D33F2ADD104CC6C3F54A6AC2DCD9EA399E4F88837A51D492167639D + 134A97E25D0C890CBAADE7100BAB50872BA03633AEA7FEAE4D2780986EBEF394 + B867154B03EEDFC8DCC1634B487C8BBFB5CD0ED68B93029CF932551A9F9ADC19 + 5C90EF70593AD34F9314316D253049F65C0A8181C11428AEE46373D0224E1ACA + 54706F7DF4CF6BF0DF193A0A80AFFD8B1575015132CB56BB755E8121C051B000 + 521841EDF0E6AF26DB57314ACDB9B31F835A27BDCC247CD2961E1079E4C69857 + 2BA028862344B1A351289D1648528DEA0D4599E64375DB4C2B37B832D29FA9A8 + F949C8E72D1D1C642A49A2C7801BE0D583975639C63E8F45B3E886CA8A87F6C2 + 83D7640BA3230ABB8B30E72DE41AF5C58D97D183914091DE2C3238D0FA1365CC + 607E9734320804FAD45122F9455FEAF4DD1B5B5F328E32119B39D93E521D366A + B523630524D5861D01BC4B8985C5DF86735FACE85E55199EBF0BB83E87317258 + E27444278034ABFC785F9277199B7E4A9CEBACAD1E8A2B19BFDD860C5E194FD4 + 38878D4D037C02E2DF53477E336463E1DF3DF07E133E022E7AA3E6D39C676544 + 0196C86AFE74C1ED8C7640922EBBDCAC82333AF422C1483D9ABF8DCC3F55C9AF + D3BE0C9CCA7D22593FA72654AEE54E8BD0A10F02BE1104E2B778E2E3D8079D90 + 49E25C4F0056DFD2EFC66369AADBEC2EF14D6139A3C67AC3075B023A3A4C23D1 + ED719C49075FF2B63E54F338EAF328FD0E92022CE7ED0FE4D5471B7A1447B547 + 329197976D534C2FD4558D5D555F1DACD23B34A304CC35C59B088ABB9974D53C + 9536A02E4BA6D909A8AF24021CC4BC61B891E41E96F211904A50C5123569547C + 5C564A4BA3D78B1F2909ECE4E5609D05BF1E6C4D2CBD11F2813BB09BDB08D43C + DD96DD7E88A5AA56D4826F171546C39A07A124F57ABAD8C59C15EC83567ACD8A + 17A4DB5EBA59842C02D5F064E6BDB891DDA0B5F7EB00C44BD3B66EA445AC0EFD + 2EE5204A255C7DE6370A07C0E6C61B0FDF6DC3210C214B5DDA2B28A19EC2BCF2 + 93C9F4015965DFB688884CA76B83BF12A8AA68ACC102128A0A63858D6608817F + 91B397627F7ACD00989EC1F10485864C4C2E389578EB0BC64DE05E9E221D70E9 + 9842035EAE98FE4C65B1A87173FF22A0DFEC551EF5BAEF79F75380FFA30F43FE + 5A1F272E4955B6DA9F93FBB01187B27472C4F5B6F118D8862A66933A24AA1044 + 4A49EC37F711E6A784A416BB81 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMITT10 + %!PS-AdobeFont-1.1: CMITT10 1.0 + %%CreationDate: 1991 Aug 18 17:48:50 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMITT10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch true def + end readonly def + /FontName /CMITT10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 101 /e put + dup 112 /p put + dup 116 /t put + dup 121 /y put + readonly def + /FontBBox{11 -233 669 696}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D004D606918A40B8D7BFA821B73E118040992A4 + E1BF99740F8FAA47E4349853C8149C0F8BE2F23C6F332BC0373C867D0715E8FA + FF163A60AFD0FED665D5829739975C5DE12EB30895604D211F645D4E13330DB7 + 64B6E35463C93B752F691FDDC44595B0A0E9E57C6F649809C4DBC7DB58102A60 + 46349E9A5740893A1BD4536B99ECE72B147B713619037400669C07291022F84F + 4F3302F8244D2F0F1380466E81E0B5E00AF33E021A55620A7A93F3BD49C7040A + 67C096167F502EF2051B526405B9391B4340A3FFEC103E317E315A88D31661E1 + 7E4104A2B925D1DDA9586861904FF6FFCE6A8E808385E4C4014F5A494874E2FB + C3758D6989AB68C4CEF82F92B9439794FC404A29D086ED6B27997735BC3A24F0 + 473FFD74BAECF5282E2EBFCB92D69B81C568D394055E2E30A7E3F448796E4EB8 + 019AC2E075377F777183BD87FDD194E855ABFA35AFA73304DBB181C267431B16 + 70456FD8470B525011891C1E140B8FF24A474B89F1CEAAB509F91FCAF512E16D + 8413BAC0C664FDCD31245C5996F4883305D3EDF1C8D1E6F0B1E79A06028BBDDF + 6AA5B515DF33BA8FFF2394262F3FE1DF95AD661322BFA5179E325BD1B1EECE49 + 69F64789FF1BE8DE5CD7485571A07471BD6CAB4891BAB122BE4C4A1B7176F33E + A1A434F745811B71EA8AF73407F32E9F4EAAE1C1FAA979523C18A24F754C307C + CE056DCB71B20292D4FBCBF9AB9E9B81DADAB90E60BE926315049E5BF0F50315 + 66D82E4963CB556F19461F43EF80302912AC1168884A1692AC59BFBC431B14AC + A5FC06C4AB595F9DF66CE5EB69568038445A9EDDE20CF92BA308A235A872B15E + 8EE6356F4041C28B24C085EF70B6626241A3AD73D4DD274D5B7A4C0BCA80F121 + 957D0E504B12C2484E2B7DFF711F704995A9AD468B796B294473D338BB8C8B76 + E53D7C1D6A92F0B332F505A7FCECEA75BAAE4C92ED1397FAB77F6F69A2D42568 + 52D623D1AC829D0B2F8642868CFCED6F86EAAE43C1C63F61E3FCFF126CDE44FD + 6BF01F8482B9CF1D0314714E91338BB4E6EA1ACA6492AF6AE6C06843E097D24C + 58E56D593B06EDEEF7EE67580E12C56F4864E82E695F36EFD7994279BEA7DB23 + 9FB1233C13B431E4F635773B95DE3CBED208F23C6438D11BFCD53ED7D5729D94 + 041A3F335433F1133CBC08D2BF20CDF11A0260107D3BEE61DA885174B857E004 + FCDBA83E6AFE7402A8CD877D4E27E19ED64E33BBA1778734617B1A3DDDAD0567 + 2F2F62EE5F3A3FE42339FAB24C3FB5FF14014E48685D42B9F90778D17B37858F + 054571505F374FB3F555B52744079428CDA68F1545930C7DB7E1A445E377CA7E + 52C626F0B937A58ACB848017B2B314644F02A8AA161D89DCBB6F635918E16617 + FFBB21C9C32CF0C0D56DB3AA7B8FF877075F4D082B0E773A7E948E62B46EEF02 + 3C6AE396CB348E796FA4D8DED175A3C3E2B45472CE234B25AF8439C811D1E2B4 + 598F4BBB7FE866C55BCC8B910A7EC4496CA6A5351C5C432CC4B41A49B7ABE305 + C7103DE7D32AB13C0811AE8D2A348FD9663DB21EED4BB174992D807BB526A5A6 + 1B07776263573616BCBBB050047F72BF772185A4DF4A191B69F69104F8A87193 + 9239BAF696BAF74DE2913439FD159805C18569E537D1926A873969FF738FA1BD + A82AAA4CE46F41AFF1EE4A294530447E7AC9A581162E6A00A024EB67EE126A23 + 3CBC806316A3496CA6BC44A824D91DDCC348709FC4EB028D92A47074CF2FB889 + A161425C354DB2F1445A1659BB410EB100D5D96D4480AE37565EA4B52FE18347 + C9D1519C76A4C657709E30074C512069B747D56F5DDC11528AF703B63BE3EC26 + 81A983C0C2FC601FEA4D7784A8069E21B03FE63FAAE988C6D4E8700D215E4854 + B292C1D1FFC5D7938601D8D9D903A0ABFDE8A3572EF5EE092FE21193D146C41F + B07273556ECB3871730BE4E26B68C1517B659E9827BAC29B02906CF842BA950F + B946665707CE509DB3B6427ABF01D9D8C5784EE61B746330 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMMI8 + %!PS-AdobeFont-1.1: CMMI8 1.100 + %%CreationDate: 1996 Jul 23 07:53:54 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.100) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMMI8) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMMI8 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 110 /n put + readonly def + /FontBBox{-24 -250 1110 750}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 + 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC + 4391C9DF440285B8FC159D0E98D4258FC57892DDF753642CD526A96ACEDA4120 + 788F22B1D09F149794E66DD1AC2C2B3BC6FEC59D626F427CD5AE9C54C7F78F62 + C36F49B3C2E5E62AFB56DCEE87445A12A942C14AE618D1FE1B11A9CF9FAA1F32 + 617B598CE5058715EF3051E228F72F651040AD99A741F247C68007E68C84E9D1 + D0BF99AA5D777D88A7D3CED2EA67F4AE61E8BC0495E7DA382E82DDB2B009DD63 + 532C74E3BE5EC555A014BCBB6AB31B8286D7712E0E926F8696830672B8214E9B + 5D0740C16ADF0AFD47C4938F373575C6CA91E46D88DE24E682DEC44B57EA8AF8 + 4E57D45646073250D82C4B50CBBB0B369932618301F3D4186277103B53B3C9E6 + DB42D6B30115F67B9D078220D5752644930643BDF9FACF684EBE13E39B65055E + B1BD054C324962025EC79E1D155936FE32D9F2224353F2A46C3558EF216F6BB2 + A304BAF752BEEC36C4440B556AEFECF454BA7CBBA7537BCB10EBC21047333A89 + 8936419D857CD9F59EBA20B0A3D9BA4A0D3395336B4CDA4BA6451B6E4D1370FA + D9BDABB7F271BC1C6C48D9DF1E5A6FAE788F5609DE3C48D47A67097C547D9817 + AD3A7CCE2B771843D69F860DA4059A71494281C0AD8D4BAB3F67BB6739723C04 + AE05F9E35B2B2CB9C7874C114F57A185C8563C0DCCA93F8096384D71A2994748 + A3C7C8B8AF54961A8838AD279441D9A5EB6C1FE26C98BD025F353124DA68A827 + AE2AF8D25CA48031C242AA433EEEBB8ABA4B96821786C38BACB5F58C3D5DA011 + 85B385124C2B6534F3CD1866AF92009D93B97F763AA3CF46C60636D7FC1564CF + 1DDFBC12CA37D27A79B11F2AFF2D70DBEE03CF1DFA5B864A2DC22266E4FA43DC + 3F2CC229231F1F72874E6A74A90E8003B9AF1BFAA55C071FDDE5C94E4AE3C5BF + 936EDFD4164624881410AB9EF0593F823D40BA7D059992104D08E41EBAD8F276 + A84EE2C9AEBC7CCB72AA6B6E6FE52293DC7BC34C2D1B69418392608FC5920291 + 733654FA401E05F3E647B1C6AF4BECC3E802F9963344B05EC3DE8C774293CDB4 + 3F057D6F258BD341848FA7FDCFD4D1923FCAB51FA8ADAE6D9F19C1FFA6EB5E9F + ECF844CEC6C1320D3F00C7259EF5812526F58248C61F89A42D9C9288CA8076FA + 77E1C950940D8D6A7D852A0D0ABEBF2EDEDCDF6DDE0C8CCAC8DA9B28207D9CF8 + 46446E1153D8D8795EE914B12349137D4BE461BCF5A6A3CF15FA5B9E91EB9B90 + 0483916D0CD40EDC29EB0B996B16462A64F3B19B57802D9AFE3F1D91D9A8553C + 531EB8B4E975037ED620EED3020388BFE705958B1E3AD4638B9CC8644C2F4024 + 5DACD97151C3DF7A448CC3 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMSY10 + %!PS-AdobeFont-1.1: CMSY10 1.0 + %%CreationDate: 1991 Aug 15 07:20:57 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMSY10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.035 def + /isFixedPitch false def + end readonly def + /FontName /CMSY10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 15 /bullet put + dup 32 /arrowleft put + dup 102 /braceleft put + dup 103 /braceright put + readonly def + /FontBBox{-29 -960 1116 775}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964 + 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4 + A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85 + E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A + 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A + 27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF + 5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09 + 0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730 + DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A + 71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09 + 4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C + 515DB70A8D4F6146FE068DC1E5DE8BC57030ACE57A0A31C99BEDB251A0ECAD78 + 253AB321023D15FF7F55A3CE81514C1E7E76240C1FB36CD4874DDB761CC325F5 + D588700B294849D690F93526EF438A42B9B5B0508584EA3766D35F5B8D51C458 + ECB9FBD23A4A81F55A82F06621BF584C1717AF88B76BEED8CB031423DADAAB95 + DEC610063D014DBD78BB0FA0699BBB5D3799867A7CFB9F5C34155617102AAB23 + 3E4D0062E70596FFAD7B3E6BDF575D90AF573FC0D41E161EBF02619CB8C7B31E + 0FCD68A6EDD049AD899CDD867F0060838EE3F8FE1D3406CE29D7B91CDD01121C + 1847D58D23A9754104AAA45D4E6D0DE1325FC6E215120702185CB3839D58722A + 8339AC5484CB21500210BD3FECA95A437F2A18DE2B8D0B70B675101F51510545 + F294E807DECB64DC608160DF38B61E5ABF1578FB31C627C92AC31E0D86AE68C4 + B3C133ED939E6D26FE1EE6F13336BB8B3C69E86AA8867E1261730CD3FCBC61D5 + 65665D91616A413FCE7DE2BC9AD4C6A7CD20D866589F7896F26E8D10AC7FE78E + C929CFD56FEA4962DB4E96A96F6DB3ABD4C2A0818AD705F0D4558B985447BC78 + A10A7CBE81456824395BD345B3C0BC4DDDE9C577315A7A8C5EFCCA320DE62241 + 7FA45252B47B70B25B8F445C377DB4C71C74299CDC798D725DA32E653CC104BC + 31514DA89F92457C59F1724D16CB4689980B23EF9884A9DD7B4DB4682069B63B + A3776EBFF52662E21414B4974C7F0945B5E35D9FBBC1AFD62D811F80226632B0 + FB47DC3E41D51F9BC88C0F264AFA751FB6635B95CD29844BEED5150CC3128177 + E1B92C56909D907898B6A6FC126EB3A7827F2D99880E004AA33EF65FF1A55226 + 179EE22837147838EF3DC149498B2D50DC9975B888F7364832F62CFB94CA9182 + BB5E1590968FD16CE930824218BC80DE826E6BF8504EF6A2DB70EFFFE2E16A6A + 51707E389EC6C6195C16A303D63BAE66F7189E9B3F87812C5E991D0904EBAF1A + B816104F7BC633921B9411AC41EFD8DD78E93B353D2FD1844AB38BBA + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR8 + %!PS-AdobeFont-1.1: CMR8 1.0 + %%CreationDate: 1991 Aug 20 16:39:40 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR8) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR8 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 43 /plus put + dup 49 /one put + dup 50 /two put + readonly def + /FontBBox{-36 -250 1070 750}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C + 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 + 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65 + 48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3 + 9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB + 0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB + 8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F + EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466 + FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3 + 9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62 + D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8 + 9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5 + ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6 + 10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582 + 83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493 + 2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA901C077A059F709F30 + 4384CB5FA748F2054FAD9A7A43D4EA427918BD414F766531136B60C3477C6632 + BEFE3897B58C19276A301926C2AEF2756B367319772C9B201C49B4D935A8267B + 041D6F1783B6AEA4DAC4F5B3507D7032AA640AAB12E343A4E9BDCF419C04A721 + 3888B25AF4E293AACED9A6BDC78E61DA1C424C6503CC1885F762BFD4563ABA4F + D926227FAD2B2D4975835541F5A97E7A70F5CB40266CB9B4E609B94B31263442 + 35FBADB202B4032E1C3165F83176413544AECC056C371F4B41C04121C4D20A7A + CE519F46C3999F58F5F43BF799D624FDF62A229D8B9189CF5AFAE6141FF16B53 + BB2B3EE9FB2467181C50CD8F8F32BC6609385D9D111EE2A589687D84C6C2FB75 + A48CDD9A85F106AB9D3F906105C56CD993793C20FC7E5202428340F3DD4F10DB + 561A3958B4CD377D1B833D27F6F9F233CB9D99F95309D20134DD6A47A5291D43 + E49BF013864BA87ED38FB9755A8077105EDF397023D0C1A1B21B951AB1A4FFA2 + 72990283B3B455447DA9E68C7CE660F8BCC18F5FD82371D89BBB363EA0FDA552 + 3059558108DEC9D2E6BED7BDD5C0243485F642DAF3B3A719E098D25B24E2D1F7 + 9B9DE8CAD714415F9DC0F0A7BF618BE0FBD81618CAA161548B2038163020318F + 18C088D44BEFB4397412661EA87CE38799B3AAEE28A008A3FF638C665DE01D88 + 1604BA57E90D82855317F1A99B9C6FE3E6B46F5EEC32DAA013BB124E6701FDBB + 821E8527C2BD04E8D9770BB5037793DC4DFE6CBFB2F0850B29BE67083451B071 + 413B07804AD37CA3AAD6D799091E5ABB2F5C55FDD77C4E421D4070EAB055C3CD + 4DF259F039687CD598BCCA951367BD9CACFFA93F12F96BB0211EED9DF6276E2C + E2469BDFE697A61CB583EBB9CABE24568FB504C42AF29F9F90739AEF6412A1FE + C3B3B587A034F1 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMMI12 + %!PS-AdobeFont-1.1: CMMI12 1.100 + %%CreationDate: 1996 Jul 27 08:57:55 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.100) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMMI12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle -14.04 def + /isFixedPitch false def + end readonly def + /FontName /CMMI12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 30 /phi put + dup 58 /period put + dup 59 /comma put + dup 60 /less put + dup 97 /a put + dup 98 /b put + dup 105 /i put + dup 110 /n put + dup 120 /x put + dup 121 /y put + readonly def + /FontBBox{-30 -250 1026 750}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE + 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B + 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470 + B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B + 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE + D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5 + 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC + 4391C9DF440285B8FC159D0E98D4258FC57892DCC57F7903449E07914FBE9E67 + 3C15C2153C061EB541F66C11E7EE77D5D77C0B11E1AC55101DA976CCACAB6993 + EED1406FBB7FF30EAC9E90B90B2AF4EC7C273CA32F11A5C1426FF641B4A2FB2F + 4E68635C93DB835737567FAF8471CBC05078DCD4E40E25A2F4E5AF46C234CF59 + 2A1CE8F39E1BA1B2A594355637E474167EAD4D97D51AF0A899B44387E1FD933A + 323AFDA6BA740534A510B4705C0A15647AFBF3E53A82BF320DD96753639BE49C + 2F79A1988863EF977B800C9DB5B42039C23EB86953713F730E03EA22FF7BB2C1 + D97D33FD77B1BDCC2A60B12CF7805CFC90C5B914C0F30A673DF9587F93E47CEA + 5932DD1930560C4F0D97547BCD805D6D854455B13A4D7382A22F562D7C55041F + 0FD294BDAA1834820F894265A667E5C97D95FF152531EF97258F56374502865D + A1E7C0C5FB7C6FB7D3C43FEB3431095A59FBF6F61CEC6D6DEE09F4EB0FD70D77 + 2A8B0A4984C6120293F6B947944BE23259F6EB64303D627353163B6505FC8A60 + 00681F7A3968B6CBB49E0420A691258F5E7B07B417157803FCBE9B9FB1F80FD8 + CA0A265B570BA294792DD2FC75CE2C83DCC225B902551DBD11E687EAC6E85D2B + 02C28359A40AE66A6A6A8862CB17815B41E280313F0EFAA9981755611F7F683D + 35603984D60BB0C772054355A97A5E03C689E23B04DA79080CE4579CC90EF38B + 1A64CDD92B907AE83192C3C46C5FC40BB412F6656DC6349E6D29B5936DCE94CB + 98E3B465FFF7574095F57BB3750F1A55F20456933FCA64CC1B060E260782BEF6 + 721D38BF65DF1F1DA5439DBC802B4A9D803BD635C05B9ACA4D26C28195A1F4C4 + CC623B30B076D4861E89B93E2CF26F6DF07199C03BA5466FA3EFBD7F77EFE068 + E55B7186855063934C5716EDC3F5056BDA963B6B933B546475BCFF91C512F411 + 8D14B1C32C9735281E536F87ADBF1AD9AA04D7DE2096413AB8B3C9E8B1F6F338 + 3B80D637D761A7A992CF58188FB0A04FD6C6886A60F27EF31C45E92F4717D8FB + D4A0844A8D9036D5F2BBCA2C170F3042F22DEB8D151C7135AB91DA289886604B + 70B9F2A25A7D576FA1D70DC935CDD3E81915E9BE11CB03C9FDCFDE3700BDDAAE + D61CD52A78B075FF4FB8BE949FCC4B04813776A3451FE65A47D57D7B66499E99 + B97C5141D2E05BA86C59535C34BA975381F96A4EC47EA032C6BEEF9F2E6565A0 + 0712528976CD8FD94E2F8F2607FEE1B55382A62B35FA16C62707F805DDD68FAF + F18133F16F5D312246BE70BD7BDE367A314CDE17E9E69A7D63DE373262D397EF + 45C542582B6F56F890EC5EE8DD9D075383DAB8FB7A9F111BABBB8C52EA764237 + BB66DD71D1AE8253B62B760DF589FB2A1EFC7012142611205589FA4C2263FAF8 + 31B150E964FB49C0899A9FF862A4DED7EEF9D6D3DFC472576307A8DC809B6620 + C88AC1B10B7BFACC1EFAFD38D3EDDB3E1A341AF31E0DD72AA1D6735F23ED2BF6 + 3A091BDA83CA7D1FC1A124D3C9624699D76D7351A4A78FC2B506F8A6798B274B + 84C99DD186ABE4DF6BE93E260F9FADE88399CDF4A06BC71B8C4409385E2D6043 + 7EFB9C2EEA1DD84D36DD07B023C872DE6CBEDC4ABE75AF0516EF9344ABC2DFD6 + 7B4DADA727B8A442D650FA720E86EB4CA627A0A59116F5FF1F95AB2FC4F299FC + 03D49B22BED974852B206F88EC9AA95201EC771E406A663BC935A67F4D299496 + A224B7734AB7E7AE516413704EA012C4B0FAF944039691400EEE74C7357BD781 + 12B6B09688A1AA4A7DCC5E78FA932E224D5EE06C7EA40186133BAEA9EC247C99 + 53297EBE63BEB61BB1E7F99C912C44AFEBB5DE375C26ECB81DE54223C9929EF7 + 3C2D7B1FFF5BD1ABC0FD23A0D40F7F7B292A418A8F4DFCF697084FA2DC165F36 + 2F68FE518A6064175EDF884739DF60D1C2D1287C50D510C0A182E42DBCA47F9C + 4A5202DFA349F802FECA28916D34C2440C46CC9CD6F92150DAFD5B90327012A9 + 8BE35631A6CA673C349CE8AFE1E5840DE663EB244E7399787825B07040970B48 + D52E597C959639CC6EA0BC2579D8C44FFC5E9AF212C80BB0897D475FDBB70E13 + 3E587ED6A4CA371D307D10CAA0E1195BCD2A0BF0B453C70EF581CA58E104E32B + 7FAFA0797385433EAB43126ABE49D1315794A6A7C5EE2D8F051C68FC093D49D7 + E5356F991B754CA5432BB12729E3E98734CF7F1BC7A0ECFDBB8BB5DDF4C43AA7 + 245304F1441A503C18BCBC6BBC9DACDFF3043D975C950F92E4733E60909EE94D + 60FD56205E48F874E4DB08E4E49E8DE95382D618B180F05C9C114E1C0C79E1F7 + D8C8E2A172481FBEE6DC709D578348C16665B409AC0ED16F7678A54F049ECB0A + CF1399D18507F750541D9734231A55EF10C8653671D1B4BA6481A5546A75D80F + C7B04D02787AE1F44D30FF551D280383680B0F5A5DF3EC84C7BDF769A604BC5E + 171FDDE45D8FC1F26FC89F73347334D8A5F044E8EB4B43D52972DF4787E390C1 + D350C68E5DF98D5B3E2DB44DD90C706446EA2FEEFB9A46C2FFDFC14D24C8D2C5 + 08D1789204C1F38EA04EF84B2412FC45E9A0AA71AA98AF3A0FC8F2C5F7339859 + 6AAFF3A6522AAFB2576E75D4FD27192C650E64CBEFE7A537087A23D4C3DCA02C + DE4797C66BA3AF8FC8BD8C1C91047583B99DD5F9C6CBF6FDA591F8F2D558BFC3 + 9EFA3EB42B99EEBADA30FA41C4CFE28E76137A3CC89E3E42362292D6639FD205 + 36EE07BE6C21268A5EF01102F4DEBE916D70FA72586AC15762B36C4E2D326141 + 29CDB773F7B5E675C7E6BF9B82D888A1C23BA275FA89A62A6ED355572227DE22 + E5283F2CCF3D2E5C16A6F9E99D39146AC157B6C091519C2035FA7BC1093E4854 + 928B51B394DBDF0AE4CD040D4982F6CBC8AA1AA7D9D3546F032DA5F1D50FBA0D + E4DB4C1FA6F29562CA9B1FC3FEC423565D9D9C7A7CCA6A76469426EC95EBACA4 + EA15216B498DCC42B0FE42DD0DD305FF7FB6DDF28BF5F861A4C5D0D98424D005 + 005A3BE48004035861768617610FE7E92DF08F0AF3EF98B0FE0FB9CF0BE00414 + 66972F7E5F5E88518727D49EE9F5AFF6E467B739D29B892EE9F3BF8BF9561E54 + C8A11259CF3CCA94074587B10E57B67D5B9377FB9B0FE98001D074794D5B19CE + 95CD7BED7AF53357205A1AA463F94C15F784C266EC8B046A5378DDDFA189CCF3 + 1FFD7379078554AC01A6080636F3856283A898B0BD707396681492AB6546EEBC + 4751A4256929DFA1BC8D8A895359CF814CE5DB1C157EC1A20842B358D0D3EC7D + B2DE43A7D47822E981AD5192FF3A53E183B91F11A47C061B8C14628577383A35 + D252E5176897A04F12FBE0EE1B0276F9D848398E0B8F610C0BDFBFC84A3B4495 + 6B7F59449DA10B4D6168C7FE60EE5DE638955BEF47E235D42E4F4E71908A7005 + 55309999A7639B8F8A1AEFEDBEB35D017316DCEA6ED307332773180656EF8EA9 + EFC183DDCF1E95481B4672761BDF58E08B8352ED34519B38CCA0DDBBD494B551 + 752FFF4CEA4D15AD4871B067A03491AC73DA4C07407989BB59341FB6AD8C5A7A + BEA3B2CA7451CB669FCF9CBC249323708C670F038CA4D08858EDD752DF3E34F2 + 92E98938670453403DBA8C731D1364B0C114A28252F33EDA13FE51BFE229910C + 69FEB3535D057A460F79B2D51D2E8011296C07DD65D5D42ADA0384D01E9D7874 + 202C39394D9DD62B33F32FC467A0F2B320104E3E5CBA31844E49E63FA77532B0 + B631AC4B345BD126C630924CACBE724077EC43CE2586D7D0A675F1D1665B77D2 + F5092B1D4C203172DC7DF0C9B28AD3C2109089AE026691710A4B41EAECBB0CFE + 1E458F3B067FA83ACF3AE4C6A360FB77F7524381CC7FF6B893E80A89E376EF49 + 119C41EFBD35373D73EE275C17202E948AFB67EABA10D3507B5B76B03E57C78B + BA9500D83379D1E20A5C9AC698DBC2AABACB93FB093AAB27BFDF35ABF576940D + BEE36DD2F1F51B367EAC4089BD05909D8713DFD792CF81DBEDAEF75A5CBC3676 + D237B40D1190B5E148849F01ABBA4E6CB3FEB48D030574AFBE7722FEB201DEEB + 8A6DC51B68A3D7EB9EA4694C8472DEF5B1859F68AA54ADB8F89BFA1B974BF969 + 25C93D95698DA1168B7EA8B81CB61C3176ABF37E62107392D451252153575E3F + 98C6348C06F7208A49F64934FEBD8F1722D15D71B18FB62C98A7C16D4D870B27 + 6A627E2D3CE60F4F1A6893993770085CE8C20019D4A397B3BE51905D4E672F61 + 279F81661F4B16C01D9A6A2A71113C43A70FE4205203B626D075655B1D92615C + AB892B2C0626F477FC72B5901917867E1A3F79553388D9140A042E9ABBC48F9A + B8FD865FF575DD59A22165446736CE543016D3D606DC098D61E4DBC1F826E5FB + 0E265E351478EF08728273404D2B8E11A1F8882A44A81FE054A848CC6126017A + F3B0 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMTT12 + %!PS-AdobeFont-1.1: CMTT12 1.0 + %%CreationDate: 1991 Aug 20 16:45:46 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMTT12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch true def + end readonly def + /FontName /CMTT12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 33 /exclam put + dup 34 /quotedbl put + dup 35 /numbersign put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 42 /asterisk put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 56 /eight put + dup 58 /colon put + dup 59 /semicolon put + dup 60 /less put + dup 61 /equal put + dup 62 /greater put + dup 70 /F put + dup 83 /S put + dup 88 /X put + dup 91 /bracketleft put + dup 92 /backslash put + dup 93 /bracketright put + dup 95 /underscore put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 123 /braceleft put + dup 124 /bar put + dup 125 /braceright put + readonly def + /FontBBox{-1 -234 524 695}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F0364CD5660FE13FF01BC20148F9C480BCD0E + C81D5BFC66F04993DD73F0BE0AB13F53B1BA79FE5F618A4F672B16C06BE3251E + 3BCB599BFA0E6041FBD558475370D693A959259A2699BA6E97CF40435B8E8A4B + 426343E145DF14E59028D4E0941AB537E34024E6CDE0EA9AF8038A3260A0358D + D5B1DB53582F0DAB7ADE29CF8DBA0992D5A94672DFF91573F38D9BFD1A57E161 + E52DA1B41433C82261E47F79997DF603935D2A187A95F7A25D148FB3C2B6AA32 + 6B982C32C6B25867871ED7B38E150031A3DE568C8D3731A779EAAF09AC5CE6C5 + A129C4147E56882B8068DF37C97C761694F1316AF93E33FF7E0B2F1F252735CE + 0D9F7BCE136B06EE967ABE0C8DF24DCBBF99874702ED252B677F407CB39678CC + 85DDFC2F45C552BA967E4158165ED16FECC4E32AC4D3B3EB8046DCDD37C92FDF + F1F3710BB8EF5CA358ABACA33C7E5ACAD6BF5DC58BDFC3CF09BA2A38291D45A4 + C15FF1916FE2EC47FDC80911EB9C61F5D355BEDFC9DB17588547763AC5F0B1CC + 12D2FFB32E0803D37E3281DA9CE36C5433655526ACFB3A301C56FAB09DF07B5D + 048B47687348DEB96F3F9C53CE56DDD312B93D3918CD92AF53FB9461864D11B8 + 0138918D0B1270C54873C4012CDE6F886DB11BCEA04B023EBB43E0D0A06BE725 + 741D08B9DB688731A6C9886C15A83C28DADCC81385EA239E045E8F3670CE03DB + 9EE77ED067036595C9F3B1854343BE3A12E486B6E5A2F8AC44FA5378D28DCCEE + 306B0E283AA444423F9A4FF38E2B56DCF67A39CEB2C643DAE86865517D5D0371 + CB8797208ADEC637330A3A57902C9A88EDB75A7C16FA9850075D9F19578EC666 + 1353CC1FC512D59DFF847ACCD483BCCE2DAD5F5A411208FB90EFF327E22C30B5 + 58F9D34483864B061F425FC7837F26253B0A74AF24851B7A997FCB58C7FE029E + 2D6EE0CFF083B9D45DBC297188FEFD438BFF56CE6F01365BA970623AA85341CA + 43322A57E6CE91B3BBCFD2F24D9A0DEF275E19C8AA735CBD4A5CB2DDFC091B2B + D6C16961F6B6B993AE9B578CC97DE56A323AEC779AEA26B78D7F25920A3773BE + 20D249BB8F853EFE95030A2B4275B1AD9A8C562D53CF73AABB149B8892157C64 + EB1CB07A4DF6D50B39A5A6793AB367B7EE2613B14F59DF18F6977D7E79A45DB1 + D8F282781CB96F87C034DA6D52F69D352A1C5ECC547DEE096BAD6F2B3FBA11F3 + 0B770BF39C38CC2E5C0E61EB0FE0AAE17246580F5F026E5AB84C9EB4E92036DF + BB4102C968D748A846169C4130F00C294236C6ABA13D115BBD0349D5E6900BD1 + C74B078ADB1FD9B4F2E8ABA04BD2FDEAB68AE36687B974B5D915EB25937FCCFC + 43C29EE6A7FADCEBC96C380A2ECF828D2BE47BD6660A7CCFED5BCE7983A2834D + 3D831520519904A6225FFDFCCD3E83AEB70D34AF33696C020BE63435317C1E4F + 4FE8458DE8231F0BD97F16DEF04B1473626C1FC7D23EEC85ACAA4DEE0D45113D + 634E6E83700B45F5A54482D90B857FAEE51BBF207ACA9268A97C430568DD37E2 + 7AA98F9EDC71CB8F1E6AAA51D24F532E0867071564E935FE57934130CD6BDD59 + D93B22FD7A78B5F313B52C98BE6C02BE4A8C1B5F410F0C77E69023B0BBF509CA + AC41D417ED564AF9E0598CB52E0DA5E0307884C12FC01DAC3C37A8888AFB85C3 + 82743DD123DDA7AE74199ED4CBF9DBB62CAFADE135DAD58383758A2FD103DDDE + A14FC73AF7CFF537CD8C2B47711CD0D1721802046E1BD57CD59C0DB10EFC08AD + 5334EA27A75702C8FDEA5A495D716B1198F3F53836E3A8D5185F42C392826272 + 1E04E91ED50AA3F81E7D15E47C854DD91927CB1186E1AD74B7BC7839590CB68F + 9DDBC299ADCCBDE2AE156FDF26D57AC44DC229FF1ADDB386C4A6D8EF531CAB72 + CA8402BD9839980A4D42A9E478B9AE57ACF542697F2E5203B9D04110CC3D1B17 + 1E5F0841BF57D4233B62EC7AFDC82C3E7A29BE87786B9B2D5EF2DF83BE27D437 + 13D8F29E2924A68582BBF9138EC23EE532E538661B8438B91ECEDC54D6619467 + D2360571AF66A4B9D9BBBDFBE3526713C1E40D1B9A372483D7998C856ED18DE6 + 10826EB5B841D48E04099D4148B97CD648ED0682D30B379A05B176C747798DD6 + 28124460D17EB94CA7C34782DD1DEFEE7E7BA42492D3C668F13F23F08D9C090B + 68D3E03CF3A93DA5369379F28939B20D79E6B0D769FD7FEEE152DB695A1F28D9 + 03AABAE3659AC73171847E2F83007D81C497CEEF2C9BF24D48CB0854FED6FBD8 + 0DF4B3689776B16A85E33C2D0E27702B9D72A2744D0F5170B51EAACB0FE627F2 + 1EF5D945AC6FA8722419D1C759D6DA435E356D879254ACF4201B9EB39670B44B + 752CA9FB041CF906E030A8B5E69E17706937003FBA14CA3D8DAF52465E3AACF1 + D4F36AE7B276E9DAA4AA94F5EF3A779C9B2741379AAD0F43800C3DA5D0BB503F + 34F8CCD7FE5E8D80E02022B9419AC915BF69FEEDA3BE0DCA6A9E6F99851E643B + 9B4DCCDAEAB90A7EBCA89FD40356F07E710B58C534282DB337F2985546BCD286 + AE21BFAF894566482D99F544BDD3DCF0F344F3BD1C8F7FAD6300AC7702DB32BF + 1B9903C7532C8BD79F6812BA6D50F1BA9A4CCF21006EF848E417D250DAD72FA7 + 618622D7CFB0F2C3C607FDF538FB29057965E6C246786FDA42B8B0B4A3739A26 + 112313A034EDA5355F210ADE6CBCB282DCBCEAF2EA902442896B2A8EB440BD44 + 0AE05FD820ECB3B418CDA353909A8D16D65FF3BF3C0C683D9B4D741837B7262B + 078303D329DBE4BD6282D3BFE573C619E2907062FB7F0A1A96C11D502A3FB68C + 3D7A8947CF03C708640FEE7E6DE028C3B0349348910DC6C4339F01494B99F5D9 + 5AB5B2A6D8DE926D32129D3BEF991AC10907CA228C8A5DDB4F4C9E02E388A665 + 708336326D905ACE5FCEDD5219EA0C552EFCCE3F1675E679DD8E507EEA278D37 + 4AE6DD004F7A5F9E6AC53AD04170B14435F1FD5DE6B9D44FC53E73D78A7D727F + B9DFA5D36C3A59980DAE290DA3462FA191565102B32FBA9CC15370A3CAA159CA + 4B6673376290880B44935B523E648E0E13EF9652E736DE8E296D598E6D2BA590 + B7489444A31621C4FD30F063F0239C4B412B06D87CC1B6AC783CCF1C6EE177C5 + 034AF9307576247A9DE3F2E34DE9D494AA4A7676D0E6D45A1C8962DABB04288B + 6F9DB917FA305848FE81D04EA17A3CC9FEAF499EAAB38FC6933D7D9DFB2B668E + A7721BD0D85E6C23761A2A133C571919293A7EABA1CC0B00D71467DFBA741FFE + C7556B58391F8A1388D50314E634A13388BD75062104D5551C20545E41B0DAC2 + 855F7A7BFF4F31D09F560EF0CC1B4BFE0F50EFA82BBB87D00D06413DC60E7E01 + 7B91F09187E8A8A2930E25D9CD866C04BCA80A2E02E5F785FB5B979B751F4CB3 + E5EBD182ED6767336233E32971F3F91EA893ED0D2B7A9CC34C2A7FA17933DE28 + EA1AB135BF215012C189CC53F2844161E5D5B5E8839237A645604800F645F5BD + D621D0A90286D73AE85E486FA67FA6C62AD412BC2381B709335EFD2DC1D3CC1A + 66102591683FE8E512C55C42CAD7CDAD35B61391FE787796A7A068E5ED5298D5 + 81A5ED5B28AD0C85FD0FA75B5FB0D6849E8E1B60043F3FE6DB8B6CB152397E58 + 605CD8D7D2CF5B9BEFCC2EBD1EAC808355994E61BC3D3D4A4D2537CC449730B4 + FF5EC3D8566A77BFFE6B1C638D77ADE861EA726C3F0A01899CD8160AE7C9B712 + 3EC9BB9FF97B131523A8A9FF99011292E2AD1FEE407D5D5BAF518BC6EDEAFCDE + 2D01F8486BCAD41D38321640F46593D1D60A2AE0543A7BF8A6C60EF1E800D9B5 + F85DECC999360B2BA2EB51FB0E9E20114180BB6C6378F2F941EF5E7F3AEC7C93 + F30E2B907019FD1FA81FF60C65A79CE036274E510233FA2CE3BF5F6DA936B779 + 8B3FD05135266983B07D9BA27A15CE4B30750604FD1FAB9FCC4FB10FFF2F2093 + CA7734D13C8D16D3551987EB3FD64C306B24FA5F661ED2896425132EFCA62CD9 + A6A6A84B8EC86B8349A3EE8B8EAC3455337E6D50CB2B8FBE5749D474747DAEB4 + AC335923F1B02FB750454FE7AFD0868CEE23934146E38882F4DD59D8221614B4 + B7A90D24E362D086162F31E12D941622394398AFFF122E37D2421CF65932A5FA + 1BD94AA669BB7FD60FDC2E5D58755BE3FE4A95090BA4C3A41503CEFB24C725B7 + C65A86C51C99C43A4974EA5011901B09CF228A8DE63F47D314D906D14F6220FE + 4299D72926AE26C7CDE22021405129C767EEE3FCC1B0D112C4B7D9BF377D058C + 75173E8A83390707383D89ECD49B2494742E63C2B2F969237103018A42B5CEEE + EAC96EF6B918498AF057D95C73D5CEB7653097FE87352C5BF8CC39DF9CEF53F0 + DC64C1408BE9692F702333794F428AE6A711DB8F3A6366EE387A53BF2EF48510 + C02FE69B979A7D6ED148F88B9972CDA8C3D3BDD86B0AC125107B6F67EAB63726 + CC59B6F75508B8F6EA073FDF5B71B5D4A0B2F7F3E4E89E74254170E7FA3AD21A + 0EAEA2879B1A28AAD5373186C47597FD01F43DFD339241961EA8D5C82EA196F8 + 086F3B446D27C96490F390F430CF5907660C7EDD7B5AF4A3456CB9F9B0ADD010 + E3BF53FFD97425CF881C1415FB02ED8EC3774AA40C8687CDD976AB3F3B412C76 + 88DF07D18CA19B56DFFFC9C41E1C51BC93BBA012819268F066865C8E52453478 + CDE92C62768B53A006F2AA82DE089D67F052CC2BA15231AD50A51171C7870974 + 8A4E4910EC70E3F1F244DCEBA0449587FE9F945FA055C6D5FB2AE5E5244C7BDC + 0843B7B3AD2C55E98C9B0721FB7597CAAE335232D119EDDDD42DC64A8AE473AA + 325781498A59C6E445856C7EDBEEA2BB62AC019A5746F9C3D34CFE4D350E5EC3 + 1C43664D9BBED9D76A6A57DAE4AD963D5554C0B924A0416EA1AB368DA5FDFDAD + 64DC00846BF45E55E77955B166A7D2D173AB2837538E3F37F1E689D1CF831B39 + 1486044B673652F8712257C312D244CFFB5AA1115BD3B4E4AE092B9F8F7042EE + 112E13B614A3A28C2C6A7F51326BCC06059E3D8A8896A3CD0713B53E039B356F + FB38212C86FEB1B145D80CA9DB1B6CD516DA2164FC7D8332BD63117074689AF2 + B912A5748FB7E4D73B21BAC1BE0DB4E1BEA67223869F9AE2DC259C853CA5426E + BAC081E4DB6E8ABCB84E8973CA114F521EB3C1D5780C6447768C8D5B792B9E3E + 7DBB93DC140DDB6F83EF347ADC89EA0EB5A0D57E175A71C5556E597E89805056 + D30DF726D38ACDB2BC6E06AF31E6F0A2A5C05A8933E5BA8FF7FC2C0FBF68986B + A5754C2E77EC87A59F080DA547BD0DD8AB5C5CE6330F731DDF5AC87F9E333153 + 652D4E7D2209006FC68ED820CCF516BEB9330B836F46886566A6FAFE13D303DE + 4A259B6CEE9748827F2ECC9F919E003BF196050DBB6CE2B94CB4D90A7C72EDC3 + DA4E0632DCF2556325E6E3DF806407898952D197D6B5A347877A644F72A9BDCF + CB21414D294DA922D6954E1154D9D35930D59384F20935A1BF68BE9AB9F81EBC + 4BB8202BE5A9B1033906D04C5CD719F266E19D890B126370A96B991399C1C83A + 56019D9263405E1AD580CD69C2D690C7623BAEFF52B58F12C792AC8D984F2164 + 810E7578B8EE8F106D62B67849002E572E57CE4A833BC8071C1882B9B16E8AD8 + 4A2E01425C2BEDF771EC873802021FECD0A2B060B9351EE0A90ADE1F604AABFF + 5081950588F9F4CE2F5B3A0BA0271089780746C322CFC3A200A0A592EB69693B + 294DFAFF804AF657D31566FAAD42B3664830B33A8EB6875A39AA3C7E2BA1B584 + AA57CFBC689F3E2F6FDC8CE0639F6D62E154D71FFF42F31A6DB757EC1AA8CF5E + E9595F3AEBF2E70568F1B7302EBD7184EF1E2E22A892925E83EDA721A2A69A3A + DC94D83558F2B608EB708825116B8994B001F9A2F64B30EFEA518D90A99E1D5F + 2416206F3699544F49D54A2A7E5FC952199DFBBDC3ED3847609C7CBEEE6EF7B9 + DC905D343EBB37433B6DDB2206382F58FD1C191258000337B47ECB49669584D9 + 485FC8DD09630244D9EEA94F144EB04820AFA27204003F09602CAED53979FAC3 + C8BFC4436A4E25171D8C98D0DF628CA790E60C40EEB9F4BC7AA99D3536A90D1B + B9BC619F915068ABB0D16F746BFD81333854CFDD27D45B5C3C46E5EF9B3BB429 + A82EACEAFE064E1B9619BC9FD3FE4C5835A6CA1E9CABD53AB70840309708FEE1 + 7E67F90F723F89349E5CB2E8C5D1A554628FC093067031221B00F5B929CAFF1C + CF7B0D9462139575F4FC9BBD8730F9ED46BA3E7ED90BEF448A4CA3CACF826114 + C477633354EC4E4468769E1529AC6326F0C038E761841CACE5C605119B09396E + DE09C0D4C6BED20EFC037E504C91F34B2894F0683ACFA419636435F52BAA0D82 + A899348E2C48A9FD9A4BE604FCF50996240A620EF13C63784892B3037FF75EDA + C8CC1505D0E212EE41D869824F10DACD8A4F51B3F381D599829229F5CFD89A9F + C384313F404EF577B2CAC2976C1DAB640250928EFA5069481F04DFEF946CE74B + 71291633849F73A517C74BC99A2A917C0E6C984B8266E2721346EFF5C0CCE804 + B4E9104725CBF6D8E3301694233FDA06BBC7D8952CC333EB845F70452CAA9D63 + F5907A05DB61AFFD9FEE9F3762896311A86047A03FA3A488F966B841B4E8B715 + A899DE001B5C31B5180903EA5623B85FA4392D2EC56E16902066CB771D66153B + 47C8215AE56E2615C0C432AC6B6C2F761EE8572D7FC53E5C0145EADDDF3F78D2 + A5616992C67CFF190B0BDE1F697487C3934951B22F8DF2B45045BB1331C917AC + 4B1A76816B86EAF180A10A046F8A97AA966388B8766914F2C2392613DDE8E262 + 7DE8BA612038390FB64E65F3DB2657E3F68FFF1C37BB28F581EB7A574D9538EA + 2342C3FF3433F03A0507859C58EB089970B5539180D291E9F978DB158EE4ADA4 + 1B3EF68C8B881321D4112AA048FA2B162D7911D7B28DD6C50FEF80D5AB740DF7 + EE757A73AC98615E517085DE0F69E4A40BFEA1A7B5A8C28D72FDEDCEACD21591 + 0B8419ED6F7BCB9FD6EB5C00CB351E4B437708988A3288A370750D90A86B3113 + A8A09E4F74CEDF48F956C094CE5E860F1DFCB05B9C8B74B9BC4DA4E4189C5C00 + F24F20FCA0EBBBB37B0912F72E581A66685C9EBB7DD2C5E2C09E42B4D8F30E72 + FCAF31C64F0D189506F8EF093DDF6AEF64DBE187ED72296913E7D3AA9DF90429 + A35D5DD2BA16B012302382E8B660C300CFFB9D8576C56677DC8F9075861C7FD6 + 654D6D77F37ABC1E2536AA7AE6E8898DD5FE9171913C9D0F1752CE059CD588DE + 69AC912C213D470D047D8929FFE8F25B2ABD7FAD061C322E6B8D1A6E5EA86CC8 + D72122E7D7377AB248E31054D5E5BA5F74452628522EA7587E447915A2370910 + A5AFB919734AB0244C47822ADDBDF68CDB4C8DF044110AE7C3911D23E7A2F601 + 85CBA1C6DED6D8FC0269F7ACAA4F52F1E6DF469FAC6AD69F51A52D8E1CB058D0 + 539C1CE0E5D9A3547A962680022A2A748612ECD7A269D29847C04DFA2AC0045E + 342A0442621C1E7E7CA0D8D0816FA87AEB353088958FFCB3975EAAFD0BAB592B + 15D6730A03C2F3D20F0FC535D47904621EF708D619051C27B968DB287E601A0B + 0AE1AB4E8C8121727AE9A82610C4F5C361DACE4E4244B03524D08C9C09D6BE4D + 0EDA5C606027BEA677BAA3C50F26509330BAA946610447351C6A3F24FC854006 + 77455645D5B70333CB44D79D326D47AB24F2DEEBDF4DCDF8BB46054C045E8D72 + B65911BEC3390544611E7B769FC32276484EBE6705753E0CDF7593AC96064B80 + 40C09B0549DF57DA5C5BB29E4DD3ADA5A6D6C1B86CC5F522A9E19581504E515D + B13B84FC82F469585D69B0D0D95C28DC50B992C441C5D014FED62DB7E4004153 + 8BCD90C83980410409C290DB88DFC3B79C0899748AC33E7349E2B0E8C0FA84B6 + 79B3F53E5EF82C3D0B74400E4FD5C07DDF4CC70145FAA532BA2339B4803BF586 + 86590FD91146989B9B2D4C5C1D5EA44EE04699FA55DFFC6A915A4B4045787A3F + 4D8A7536DC6DF5C55BA461FD7C3FFD071E61FC8B051ADC83725109F29468EFE6 + E5F17EDF557D923938A81E6D4265B3FAD7738A378F34DF361F2319D6D15488C3 + 86B30376DAC6206B86276AD88DAAF8B5C1D4332866FF2C3A6C69A871427A4B3D + 2E0154C1340C1B7ED0D16D2E36D3495BA4C0542D9130971BAA988E9A54939131 + 009D6FA0BAC308804DC61507219D19857ABEE64407E0F2842DC94DA6897F5465 + 655A208F8F9F851B441AA107163A9F281BAE1D17566512B7F68F407E329DB887 + 1A67CE0FA1B5180708C4D093619EB5C28CEE09EA025B018D97FABD4E433E524E + AD6684FF86637D756FC188541E74E7FCD3ACAB68A63010999B16477880FC8292 + 29FA9E5917708FF4CEFD36FB874F2DD9C11A9EE392F8B811785C5A5D80903E48 + C591B5A9B4646B0B7D1FAA8FD38E3AE0D0F9A3477BAAFC02C8C46EEA1282811E + 4D4BA037B0CE28D2CEC3E726603AE9FE0F4639271EEEA9151E29BA6D4A9EA0C0 + AAB44FD653C78B32B371AFBF35928C4E24D4843791573705DDE2E72E369B5A9F + C13D3782AF038471340521500514DD1CE917654FA216587879F8D6B39A9A842B + E2391CE9F60E384BBA6F6C2B81972BCB087250CF77C0BEFED70AB21B507C7851 + F9D293586F8682E1535CC4221637B81CAA4C411FF33EFF17F0EC1965047B9384 + A992791ABA3C39184159DA1E01813F96DCD6142C8CC2ED4A38812D6C99D89A6E + FE8F29F3575ECBD0A6A9BFCF9A73EECA210F6F67BF6E268DBB5F7C7DB1ADC731 + 3460BB937106114D16E07AE4DD6DD70ED65D04FB2C32DA3E14B4FE309A59DBA5 + 712DF7174603E88DDC35F72CE9AA8D64A0C2DED67424A810F599E6E3C6D7A3B6 + 7A6BDB0617103214A6735783C3A12DD2A295B5F23F9990CC28A16BCB7D661BEF + 360FA1F53FEB2A0F6381865455E320B2942A1B5701F420AD1FC95CC8521922A4 + 5679C3F78A120F4DBE90CC18E062A7C34CA272D85C23EFEEE3817FB4D995D4A1 + 3788640F4C5FA971AF5E99AF3AC7B7A6B83E525F27D4FC5DD494C1367FF27AF3 + 1365894D78F9424BA04847EC64CF7BB6604B6EE8392DE79E475E53DE1DB1BAB1 + 0F959679E6EE3B28917DBA62CE563511D4D57B0EEAF3BFE31BB79AF726963F45 + 4F438501D6F7EA2840C7C34B2FD72339622F9AFBEB1991007E72A281D64D108D + 49ACB642C6AF85F078F9EDCE4F2734F09FDDE1DC72DBB11C7A16EDF7D965EC69 + C920611ECD1353AE6C972D5ECF2F4B22FD6D7F889C2F65C2218880D9D4D02C26 + 2F28E22F4B1321D6F43E43539B597194766D1ACAA2817367EAD3B93164D65E0B + B0424DB395AEBE58CED32D075E5C0698A69C1F1524FFC4C7AA96828953665E50 + 9436AF7369216AADB5C1EBD17AF7C3B866C0155E2ED93925CE2E5676EAF72259 + 10645DFFA5AE6C8CE62EE5C68AFABF5AA8DAF2B5D81193718DD58C215E171831 + B3BDADACDE9A6E3910DB58E52F2063E80317906EDB49D2BB52B790511AF89381 + E729165B2A79452D832C166FB88F638557F36DA1D408DB3806E93843F452C2B2 + 64281A352C1F73B1C8B0240117010DEB0B68281FB292BBA3DB688D97F5D839AC + DA21EEA9BA22747E96CDE6976C1E780E0DB1601752C35A09020BF3D6F94A4C70 + 9CBEDCE49B4C165682F8A261902FF98BBE5D7DA4C8A0A24481551B9B12165113 + 048B5E3915403FF736D37AD5E2590136F1C47C2E0A88A355016EA3590A0B193D + 2DE01CA58B21B1099E293080BB2F29204B1D13394A6C698A2E2CCB555D2EE25A + 0142BDE2B2F0CE8B38181506FE1921DFD5D6161B46E86C694A7C2F54C8C6BB68 + F230DB3E81F4BAA2CFF88EC1D69999588BD2D8515CD56C7866885C0AFBFFAF65 + 84E898B2D715B83C7F0DB41F2C978AE030A875FBF76E1C5F07B0B0838582C232 + 3F4A7E4E5CFCCE28CC35F56375E557E78B3B7EF0F2249EE516AFB5CDDD33F8DC + 2CA8BD3FDCD7303CAF63D92E863BF643B68CB1740CD143560C223D442AA7CD64 + 783312A7C5187BC4666DB0F7F7A530CA46D1487AEEFF3B8A2A9E4A2532A10D3C + 3FB1F334B402E524C0F9A34D4DAC5A6C4CA96116E7D1329E478AF42182817243 + 7FC05BDA8D6DA678DFFF60D60236A28F73FAE9FC43E0EFF071B3B1218C045D58 + 95C4E9ECB114FAB861E8D1CBD0ADC40A087BF51F6A21770B1F4D4D05E17A6913 + 17FF5292F404D742FD862A454DBB312C8A1BEA54CCAC0A8E766D4B41071EEF5E + 6A1F174B8154BADF3131DDB7AF48EDA733DC6E876F2F9235D8051B0CA0487D71 + 6F4CB0E632DE097CB155DA7545E344E025408570AC2E2882F93270BDF6940B2D + 7B5EAE0CAD84531C89B2DA6229B7ECABD58DAC204F80A8976FD754740495A9EE + 6DE3B63C307C52C12A38AD532818F588D1B6208658EF821BD28C7AA2B585D8E9 + 1864C796EC37CD1A229BF9AEE748033A1F8E0CF9B835BCF1C0BF56B4148EDCD3 + 9D46424A7AA5DE89BAA1B264DFE405AC584F22588BF3908B182181A7048B6F5E + 43A50D838834E29F76CCD01782E724F4A994C92F5D2E7F4E50C524F0DA6E0643 + E12D3F6654BD7C5A5ABA03DF7AF85F2D92E0F96B91F83E0778799974389D9028 + BF45CA3C2AFD14151BC1435B3FBD687CB1E3D743D5572AB6F2CCFC50E074239A + 1ECB4845438BA768FA9611EF44F66CA272BDEA1FB2B1E99D28ED350FFD6655BD + 1B462D1B9B20119BA5EE55510506E41002ABE340572CB9B0B71B0D711DF915B8 + E90E432B0051C2D60FAA4BCE6F2890E026AE990F7EC2083C547EB97B8607087A + CD6480308FF70FDA73D3F57376BA671CF6937AD2EFF0FFDA7EF07E4D8E659E76 + DD3FF4B9BD00038EDCC9FD78EA5050ECC23FC2EA2A16BE1A95033B3E8FF454B8 + C2961509E98D9D282294F570BEFFCFD3DC49A7C70C0ED8255D4B427FB0B19E7E + C85FF722DEE40D2C2F1081BD42E1B8BC22EBA355E83536343980D5164E44FDA7 + 13C72CB396EA0D55B7CF34BCF36AC84467F4966A74E05E610D14E6A9A4B7C0C7 + B0866D5240375E6121BDEFBEE38CF520E384010B08E5FB2B5BA7275D332C5B66 + 663AE2D0987A5207276C0C4D9CF8F4DCE38F3E4933099028CA1D5219D9D68CD3 + B5968148668428BB521680F976CD6A6E8E85B168E349DFABBA7FBEF678AAC9E1 + 353DFD961C8503E5C42651A4012A5F544A30BE9DAF930CBBB6CE5D167AB4E31D + C83AEF616B75F15BD04D1F2E20E4BA4AA62D6A98132C31E27B341FF08D41045B + D630197C04A7C0D34029FDF038FF0E7CBF36726121FCB20F3C39581C397ADF21 + AFC37BE81FB59697189EC4A28F2CE0BDDCBF88F421B6C1E80DB881C54134CB64 + C4EF9510EE7A1D9BEF442F08C87C620E8E8949DD5A7E917A6D56D891A8212743 + 261F4A486D61D10D29F8518A8100234C9316CAE60FF6281AD6B0B75539E8F99F + 3790FFF23C0CCE3857299CDC3354C76C3C8CF478B73E22AC27486939CFD3DF51 + AADF301ADE783EC3EC63172ECDF2CB17ABC8CB700E1A593AF701E612832A267F + 39707EC631176B5D99A5AFE6F095224BBF6FC9A22C482B7F002D881EC0A81ABF + 569CE4CCBC05E591F315751882C10B5A00B91393D4AC5AFD73637FCD1D1012C3 + 798456CDCF6DE6A4E079BA9ECC4AABC024E021C3C8403E6783811B40C6A7FCD7 + F640EB3D8DA3DDCE3CEBCB2F64D42ACE2258CC40693F90AA4C821C3BE5F2FC5D + 2894B5E82B6713F66AD24FF05D5A4CB9BC32A9A307C15007CF43511A67192F2E + FD4A84B70D5526D1A891898BF716448A0E478BAD82F7A8B983C6691D5E2393C6 + 7FC11A8D80129216762900F8A58258413DE7EA585F2D5E5C5807D257BFAA4FAD + D2D5B42F175C530349D91FF1CEB72098DE710829C30FDFD59446D10D91E898D0 + 56A8FADBAF4092BA50B67FC690B83BAA1146EFD43FA794784B5C0F07BE247248 + 6AE4CA0977D7A0F3E738F6C0DDCC7123B955333F17D98251638CB2FB683033F0 + 21DDC98A6B78C4A2A0837A0DA422DCBCE343E9E44FF2456CBAFC4D781BF91770 + DACE89070FDC030483ED92F6843B10486EF3F605340A5568D25DFE5BFA9C504D + B23B52B2FB6EDAFE967DA33A7C75D5E767F70A92C55480B3434E03C491B29CAD + A5093927F0DEAEAE0BA8EEAEB620EF6082D7787D93092A90492EC5AF5BC72688 + 59E6DAD7EE49B4A20CA455D9C7C3D90E98FBE123EB210FAA07807C75DBAAE527 + 2ACCC4C6455D606B6AF1D35A0354BBDB56C7FFC4481B971430374874F4271CC4 + FCD6B3EFC66262FFAD50C410516342484C52DAFAC32BF568B1782C66D494F043 + E0C11AD55110056F1AEE0EAD6B9A4E7616D49065DF7EB3109DB6BF2A2F79F63F + A61F1F7A962A4C11BA4978263FD8F990C5D67176C1431166A493625C5520805A + 39184BF8E6D183F5EBD0A0D61A154DA0466D1B6BAF10289685587385ED2377CF + 5AB7D4ED9745CA0528574ECA332411EE55848478A91F40ACC98EC4A5D12F8022 + 8373D005F0E5CE0AA8B76DFDEDC298E5EAA911A0A5929689F7BF4DC1CF50D2B4 + 2B74DEA0851C97D88A4265FB85E221C584160FE05EB30D4234E46186DFE48C47 + BCC620AF2CB18BAC3C4ECF22D92C0D57646027DA78A5652D463245332745E1F1 + 062F920240AD3E621B770D5DB03A77D631C2F61C95EDDF21C7A5A8374C64D14D + 22B583B8704CABA22602B02318A08F805D10C88A8C3A3927DB03AF35F0D1325C + 1BA4A2B4F8FCAC8EDA18DCC223DF2115C82BA438E03753A5D8C7F1F222708801 + C22F4AE6863272B9CFE76559F55A095A941E1ED4B2840E7A8B945654CB9B8CD5 + 70D49818ACF42AEED34599478D01117D37112D982138DBD6DAA82D0F30F216C3 + F9985DA4FE530363173FC6EEA6C20DA70A8C96A8FB8199DFBBA3A159515EF7C1 + ECB2C3F393D8C2E421C6266B2D6294E1BB173C9D2B9341C3704F16DDB7EF9D0D + 9306842B83EA532485CF472997E35EA67A05F98B6161890C345D87B107B599A2 + 23B1E97D78FB774E9941A6E90535530E167E68B71E42175E851A3D5D27178E97 + 3896033C5EC5B813E0F6D2B3E9EC7C9B66E59754C52E035A0A26FB26F64CE14E + 5601397837B4B22452F1F80D6A09B7750B358AC522B27BEE8A942C6AC7DA934B + 2D4B32584276217C2D465DE38D8E068CA63CE969DEBD09D15B6DF26E99A8C34C + 39126C95E9CCFFBD49D3EBE148A26B6FC134238DA7C5137F182213977C64C551 + 3D8560778BBB9C4BDE75BD147B1BC251F46FA9B43C95E7B683DA3FF980168310 + 42B4EB3F85E14D385DAA133419CE93A4E8E3EC52AC2B34C7CD3925E3366871ED + 1FD186EE486EAFF17C998539472C94377E2C3F2E58CD3CFAEFD09837276162D2 + 526B1602B8118442D38C6E0E85BCCC3E95D989B9DC9B81AB84E82353F4D1D9CD + 9165C2413E89ECD0EAE163D5C390E02EBCEA24D632EA242C801328A1F6F83F59 + 0AA01CE607E74D92B8CB13D20981D4556CF327F8B9C4E11F44B3B1940F9BDA44 + 0D84AC0B2E8D722E14A1FFCA570545A2D1 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMBX12 + %!PS-AdobeFont-1.1: CMBX12 1.0 + %%CreationDate: 1991 Aug 20 16:34:54 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMBX12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Bold) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMBX12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 46 /period put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 70 /F put + dup 71 /G put + dup 73 /I put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 80 /P put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 86 /V put + dup 87 /W put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 121 /y put + readonly def + /FontBBox{-53 -251 1139 750}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712 + B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99 + AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26 + 7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF + 20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390 + B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D + 68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809 + D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E + 26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D + F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26 + 77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299 + BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E + C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8 + 30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5 + 148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C + E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D + E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23 + 337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598 + 0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6 + 472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E + A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26 + 3266FEEFE1F2ED62F1442F13D5FAEAC4AEA2B95999F34125FBAED210923F255A + 571F8CEA1839FB26754DFAD6CB948BE9C2442424B97D25B9050F9026F3516307 + 0A6117C7D37009920D23A5C8EB97DFE358C500556481975D7F266D95C8269AE9 + 4F8E294B2D697BEDB878D23F7E9A1D1A9463B5AA629573028F3CBCE3B14BF273 + 7F0DD6DD888230765F196377FF434D9F0FC6EC6B949F24FA011D7059C27435FA + C744DB25CE85527BB176D01BDF99BB6E150187E6580B61EC042A9197EE8742BB + 87F744AB7FD2E3D5A3D7242E8D0CD986CFEB188D318527EFF6AC0CFC6F13F064 + BE06374B4A3E05C7370A01D256855A4499AD00E56153E8067CF513DE26DE95F8 + 24B706D34A8BAB2AF41044C38C077C74AF089024BC6AD530CC01C6E25DE88481 + 5173B063D38ED3A5B6E97B5064DC6100C540F37998F14D560AF20F29FB5A767D + 874CD4BA6623FE04F0E49EFE6E1B5BC951F4D65AF90B53052D1809FCD6CAAB51 + 4DD6B904F2450FB711A04C42F24622B8682FD49606D7ACC7DF86C7318082E73F + 1895E7B567B45DDAB1F6C139A0A1C97A07BF7388C6A7FC9D5520D755EC135511 + 2390C25E6EFC10812D2D7EDD8335A1AE9F72054C8CCB704E81B205CE4E1BDAF9 + AE30BE659C7F56D9FBCAE216D40F9CE1346B1A35EEA223C566DF4B04FA7EBA58 + 3B0D0C5C904CED2370E1B619D9B1AF954767A78796E6F10765E00293F57D9506 + AE72BCE6F9EB27CF7574EDC1752B8DEFC3AFDCE81A9BDFD109F28864E208BEA9 + 19089FB1D72D7D777E8A7E025407FC2A98B25E0C0B0B2FC212A15EB62970A792 + 58D38F76A557FAB25BBB650339DDFE1DBCA2F3D59B2B2986C04703F0DE451BA8 + BFD77B197C40FC2BE9605BF42EE290F93B240A12E3A7484F8609934994249A1D + 4837942D1278070BD7881EE89512250E4B3400041DADD8E3AE6521EC7050B00D + 7E482208A5578C51098C4CA9D261CD2892D7728A67FF329A6C76F2273D8C0EC2 + 77E2FC789465931DCF146F2568F485E58AB6C6338B80F980C1A8D69D74F7D1DC + 0A7BAC7CDFF7353F3C53109A7AC049DF8ECEBBB07A12D3B8FC7FBD03BCBB133C + DC56B59BAB8ACD895D68B6387C57BD3926360B0F866BEBC4AAE955CC42564626 + 40668C488CB20BAE29C9EC17AA163F2CA628D7363A31B49EC19C4B55DB406EEA + CE726171FAD1B589D7456AFAFE04345AA3F1F82A42C9887B727495E3F1AFCC13 + 0918EBB762928245CFE3266DD36AC92BEF15D586CC203DAE2E17F589415D57DD + F12C2C2E343082E0D6F69DBC03056A338BA96C8B3849DB2B985AE410A385F8F2 + 026A06392B1255A5F79C9F25DB006919CA1BB62183ECAEB2ABB3AC36C2B0B8DF + 005113D4153F33E5C95B09081D5D6FFDDA7C0D73474D0D96B82A88742E46E409 + 57468D46CE70F416A7E93381D9CFE8DF0F96EF7B7D761DE2DAE757952D54B106 + 7EEFC96FC2DFD35C470F7511F21CBC5F329D1D8093F892943293D9954892F190 + 7304032D8F8ADF49EFFFB1B50147E012803E7B520CBEC669E53F311C2A7B720F + 89856C1E88EDD82DEF34C19CD4B2F08505C6A944197F7F4F6D6051EC14E7A8F7 + 5C65340C5C98A4F9DA54F3BA669973833FF1CF1718C2AE57A881E111267606E7 + 8952E6BB0712938318D829B8A1E808DE15EEF3C429496E7DD0637FF338DFFC26 + 8FCCD5BF720928A048B9AE83C71B916AB6B6CCE6CA197D0D0BB24BCD7A5D1319 + B34E8502176657B2BA376CDDD8951673E89C7260B341D54DBE90CD1DE8F24FE4 + 43F96BD5A5B6B6C1B0F522B020E61EFD11E0B301F188888FEF8DC13A242DFEFC + 2B49CFB04D0AA049DC195DD62C024971AFE3233F07CF403BCCE4D87A86D59A00 + DBC04335D93D15958CDD5713A8392DA8BE3D918872C75A30EC7873CBA9443C3D + 5E79C9FD02C4B98A41F8B7F1D09B71327706AFF32F737902D9E426937D1A3484 + 75A643B2DD780B34C45578550E12ED15120BB1F461C637F55A7C07B0F9972EEB + 2FEC68ACE9B2F480321C4066CC4CA7CD43E5EFD3D357F692CF90F55481849D32 + 6971EECD5F9387567AA0037580A12A9FEA24F48098FF3A322DAF34D997096044 + CEB88D2E969625AEAD58CBE4EC1044BC1760AFEC1E7E3DE89CE5F0C9C3918B3E + 64976FE64555356407F4606FDB40C2F59D282F265EB13FAD7345F3E82DB4136C + 70AFD60AE365766319EA97B701A153F3303F66911A1B72A6E86CF3E686A58494 + A4C904B6D9CA9C3590B61415DFAA1A5BCB0278970440D664A29A4D54DCC68552 + A44A07C925B343EB69E1F88555779CDE32E5D2AE61006D8F250810C932D8F3AA + DF66B529DBD316206806B36EB7E47B379AB809266CCD80A776FB5495BEF6E5FD + DFE93F9C4B38FFD64171F51E11916B358988A31AE1F8E53CF04F93A18FA32555 + 23218A110AD685B7B09A15E2FA350DC6A013314EEB2D0020B2AE24CB6C981850 + 4F670E6BA34278E0A6E6E78E85592096CBD783F112FAD0502924D15B4817BF71 + 56ACC52A93A8782606DDD46BFF18318CB9B6C91F489891C572703EF6C275B822 + 9F96D7409687A229091A8ED3F7C386F0C0CC310F2BD54FFA26701F4186757FE5 + DA83DC33CA4E910906CB09CA417134EDC9AD17C3BFA297033AA5EBEF68511237 + 5F2D6755861E563217501E9BEC404BB7106D7049ED53BC001C118D1F882FBF1B + ECD28472BFD18B8F3F764C832BF4383D67F176C49EDC92EC39E2BB1FF108CC03 + C4CD7CDAEE7A2EFD383FE14F782C7925CC9B9DF9C36C788F68E7AC19D8D17E49 + E8AFAC4B38B4A688E528F0B88F8B8EEA032F94CB235E14753F20B84BBF4177FE + 37361844B75AFF49975C1A3305AEBD252011B9A15B94256774DDD60247B57240 + 814B8BF73396CC11BA5A3882F6DBCD1E0C05BA587C91C6B349E5F6EBAB713B8D + CEC39FF93A8C24A7D2CE1606D2327736F289BD57C61C68F3B0EA7BD6144FC909 + 97DB4946FFF83AB58ABE6C65102E73F5F438FF552838EDA7F4D8EF55544B3B86 + B937E1E20EE0046C7B14DAC299CC7901988CEEF6F5EE551CBD927B33759631B3 + CA5F5BC7F74602D210A3945B98FF24DE80C4DB6A0131162EF887E82064326566 + 53C3E08AFD0A4329389E4D8E61F9941BF08096369ACD47AF8BAE45FD314EB0B4 + 59406924D3536F298BBC88F58A5BCAC8F0C2EE7A8C6285E975A599DA5CE0B4DB + F0BC75FD16D4573C4B49C9B4719B94A53FF2D6625EFCE9DB421FAE3C35CA037E + EA095F5424E72C33747B30A01DD3C88C9BB1214E73D24889555E02574F099B27 + 6C7B813E0FCCF2DB2EE1AA9B1D65B60DA241C75D9202DB82E54A9A885D2EAFDF + 91C4D72FCA99CE2FC07996AFE5CFA5109FB12FBCBE33FE4BB36EA2575F9059B2 + 18A8FB1C8E0641F465BBD813C8F199C578BB85832BF0E83C2DD1FBE0DD3598F6 + EB39B5908C65F5987BC091CD8B2578D4D727B2E7CD96202B159C1D79E6CF509F + 6AAA594E246C36453179A3116E168B37B3F59D7D45DF2634C3177A1CF7303785 + 54EA13481B1C36CC4FB27F9DA91107E4AB011371C554A89D8A455A704555FF70 + EAFC0B701756E9FC5BE78E067A7AD19B2F541BEA7D711C6649CABAC08F25ADB2 + 801AF43CCB1CC01058354BE2AAF84BCC247890D62C1581B91AA9FC02463BE0D0 + 66804D873505DE89017F60FD6F21CBAE762062CEB3D9AD08C37E7ECC2FB2B03C + F78E792908504C4CB32E5F962909BF783481D86C73AEBCA75E4BCD171B40E669 + 1CD2C640585BC411B45D4EC80F6E4A3508E5E0CA2E3FF817F2044AB74BC7CF92 + 1CB79998CE7B605E1F6F181F7480390A1CB7B32298DFBEA807D289ADA26A7CA2 + E62AE9DF2FF5B0197452D2461CCC172278F9AD6D457B317FE83692060D422FD8 + 96DE2FC0CE0A1139F2C854405E6FFEF2EF18EED1C3C58EFC8A0CC964E830056A + 1E77BCCF1A157882996BBB2658BEE155FC820E97FC2E253EBCD61A786A3F1C93 + 1750A48790254126CBB82CC7090E53BB121574FBFD59B14158A065D8BDDFDAAE + BD0B4CE951BD57F8F4E643519A28152F9443011C0BF0F12E6A7569C419B6D485 + 8AEF78D0DDC347418659AF8181E252CA8122B523648D1137C38999A14FBD216F + 3D2BB3434E46748968BD9FDC50BFF23D8BA8A4D0F784955605139F3EC4A98B4D + C633786D1B7D4791CF2FB923D8C37415DCBB1A3A1311D7B657A3DAA8E4349CD9 + CEA2B9004E9B4336FDD62FE856816996FA5A01E53A68A03E4E652AD7BBA6DF65 + 8B5F5CCC0237BF585269A65D519429A72C421FF4B1DF6C73D69275FDA202A81B + 780CC82CDE55858974C95DEDEBE6B5C906B878AC205806A5CFE7DB9592A091B2 + E54A642817585EB40468CEE04E2E5F2393FBCBBA07002BE5236C26BEED5A0770 + 7651103AAB9397D0E2745019506590D483199BAF6E988FF383C2534219B67C44 + E48B84DDDE789D0037EC8DFCA470FAF5C61AC2390F292F32E6D3DA4BE54F244D + 015024A2E4C243B7116AE3867FBA2D8C08AAEA7A0489AC0C029BE32A376026C0 + 2352780F7D54D31B94B816511C125DF666F4C81762041E2FADF3EAC8A9DDE4CF + BF39E35FB61FAF41A9FC0AF47FCC864CEC7A1419BF2A15309A30903BB2B1D5C9 + 5C404D28F1B481A9010B50792618C394331851A3357EAEA717F5BE145845EA08 + 85F24DFE683634E11A4AC97A2AB11C65E042793CC960BF6E7D65B9C8CD8C13D5 + 65A38A34B803DEF21B42BCD32450DD49B2BDBD5E2C5963A6ADAAFE988D748A9C + 84B3DF094AA4791E144EC4C0BEAD0ABA9FC96C75327CBF30BADB7643148AAA9F + C8A7D5B575D8CBFB53239F9A07E84EBE172BDE92C59A93AE6A9450167CAB22CA + C55BA87553655362D4C168E7E1ED382685554EFA9027BF550E02BC1C4AE9702D + 35B7DB7BB20CDCFA1722B5A33DA69F94923CE7FDFEAE6641DBFFA87684BEE307 + D78A4673072BB316CBED9C56CB83904DD091F39B6B0BD191917B2CB49197A236 + 0C6D7B297EC39D56BF02EF7221673B1FD9EA88EC8B7568628F18AA30D28585B6 + B218A93605EEBE2C6FD5F0BF5C57D33D75D6BA86E600BBD8340924043DE9E5BB + 07EEB08B4E39601EB4BAFAAFBBA106BA038EC4C784F0132DE39D2416626AB8FE + E307BA09C7F1A67BCECB38BDEDF90ADC25CD574399C340128B079B3FE183710E + 4249E228A5831EB3671E87B0B86C1B8438849B892B1EE8B4CA21B1E73D9A9D5E + 9FD57656923D30370E1969EC5C305F1A5554B9F3D07880CC858E37808E856348 + FD0C7D8B1FD9662AEE12EC44E7D256ED603F2D397AC6D7D856A19D09E5CC1AA0 + 3EDD3197AD482ABA6A65BA20BBE5E1914C3EBE33C6DD870724666857FFF0BC4B + D11F44A4C6C9C2D78D21F5031C234485A3D3D6A167496607DE49A37DFB5A2806 + 310F0B1A2B5533B0E13AC57F477300612D97A1AAA652AA16B693693F511554B2 + B509A50BABF95EECC857419C24E03BF95B491A47D51A085DD5096CC4F57527B6 + C05D0EC35477A8F9ED4816958BBE4B10FACA7E0DE5E5D6543856AAD28013368F + C8BFA2B9C2B8BD1E2A2E0699CDE04B60163AA46BCA08FA2E44DFF9C1F752E165 + 255E12473E3CBC8B8532EF83BE3DE2C4192A3950471F6B78D997FDA5D66C0732 + 2648329DB9EFD54EB2A9143EB3B3DBBA8873B89CF7274E67336EB10F611547E2 + 1BC6464DDDD278D7FB18AD9E6C8A159C0B9BEC458CDA2E523DC327BF764CC14F + 9DB84AF730742B9760669848C67C9634A1B5EED8E3A3E9F69C7765D0F3A4D1EA + 5E2A7D8584DA87635B2485BE7361FDDA67EE9ED3A1432D398A2FC9785107E14C + 16DC9371EEE5225D6A410CD5707999E3F2F9B7B1E22C53674C9F5FD2C2792DFC + 064F119E1EA4383EC4742CDF49A970F12E147002B1DAFB04BE6FB923F8287032 + 3B111431D5D29A9DF9A1F021FC6FE892C453477723012394B648461D4216EDEC + 38086A038F951B54FCA8FA4ABB1068A5FB0F8B94367F5EB71A2F76B0B6066C3D + E582A8A29B429BBDD9DEFA2536BBF8305B97508D8297380D077B31CCCF18727E + 1AB38C6C29C249293BA8651D6DE15E0794A23204CC576C5DC363A6184B131E9B + 025D9580CA9117D6E22E6D3EE95E9740F96E78207A2C4C244A17ACC510267B54 + CCDFAFD46FD3EF9665BC56A1E5DD7F1CB19554117C180EEAD7AC7A24B8652B7F + C50229157243D50F9A10820F87CF04F38E659DC4E73921867E624B4D6FAAF41C + E6518FC3E5E25AAC530273762B7A220A5CF18CCF34DA0CC5236009F38B7A5707 + C7EE9046ABDD6CB5F8CFC710F805DEA8EAB0816909EA39F6F85762F8F33EFC14 + A104D4451195269271503E9F4CFD31F1331CCA6FD72D20A835ABF553361BB75E + 50C550917A046E0C53BC2F68CE639FAD7F1B84E469CBAA0FDED113C76AFB7838 + 74171F9ECB310D029D8C2BBF9DEF06A353E9982B41991AA7091436625C063556 + 1DF45E9B80305ABD7E6332F2565B7E08D08EA136B36B9A487959E56D326FEAA0 + 74303298D8F316C7A0E8C91CE4C27E60098D700D3D92EB44F6881743F392FD4C + 848E2EE6AEED5358CA69138A5005C48DAC58B81D621AA8441E8411A4766DEA0C + 15784091BE987D5A390648361420AB140531CC494BAE6EAC8554B2DD7767608D + EFD8429AE9578AF3BA94325EA0AAFE657E5432A077C702C311C42526F6852E22 + D267EAE3091C2C00F45C4F72A57DBFD013E66E12B56C2B4ED84E42A4F18935C3 + 7F0C5023B10002FBB3A255D91B686355D25F1E3D9CBA98665CD2DA403E5A24A1 + 8042BB412544D04B0A0AEE7FB491D07B70A72971EB46082DA4A5BC320057723E + 105EDFED06DB5A9B830179083AB2167FE69B52FDF6CF84FB18D285A48537BCA2 + F4B65B34ADEACB0094B36B5148B9E85F106C8599F743B00F45218F92352C1B9A + F46A711B4E09AAFE948B40DA1F3AFDD85D0675A37052659C337DB794F2F85EB2 + 67977C0F85BA11EE160ADFF9E9A41B4ED74E0CA08BBA3D172DB4A21B17897BD7 + 4B2DE5C280EAEEAF4DA19DBA38DFF4C4A500F445881FB4203CD7033BD092BC95 + 381103BC285F0D0DB11EB54C980C1722107F973A5F56232CC81AC6F87FBB6D34 + 9F4426F55A7F161EC93278693B8172AD05BBEFF3F70DC6FB3FBCA9DB4991196F + D40BF6180A02CEA089A25770074C10ED3003733136ECF2E2DDD39122B425BDD4 + C60AEEA6920225598DA7A55FED67A00967EC9139C9876B42DB6505449B303F60 + EF9F415A59247063B1A681DDFBA48E8C15EF3931B9E37A2A395F676D02B7CA92 + 1B4401D59FD58A54376A9E7FC2B075EEED03038B5AC7D886B98072302E041728 + 1A684659B8927A7FDAC0CC4801F5BF17052E7BFF36A84B69CA3E37D6650B7ADC + 64AE6F2AB661AE2BB94C25789EC0B9CFF6785C6ACD2BCCC794951AE72AB4162A + C9ED285A0090EC3ABAB1D9C37AE8031BBF4CAF259B2FBC365833F318EBDFF052 + D908189D8F85AF4F44F19A6A8E4D676190E8634CE5C974575CE7AE12F5220FAF + 0EA1587B9CFF9CFD5D888A6C383B74B85C93CE6DC9E4F32EE02CFF1DC775BC0D + 44B584691580BF0392757C6F8E4ABB96A3E6BECB83E114A23ADEC6D7B577D929 + 455E3A542EAF607E99CF4E731C20C9AB11D2D9F5354281CD4A1B46ADD4276207 + 465B6A0C86C08A65A4EC9459D739F6CC17C05CED381AA877B9D8B8F0EC14FBEE + 01FC4EDDAD6467E5FFE4977BE7928E36F5CCC0B0B0735912E0CF28F7DFAAD374 + AC88729F414B98A5EEC78764792506029139A23332777255A8871601688C3985 + 9C72C2CCF7917BC80E417BF2BDC9378F527E9252A04CDA8215C1771F8BE11045 + 88864914D7BE3D8659D30F115EB4B0B1EFF33BA172ECB7C42DA6AFFF2C3219A9 + 04BC2F733910D42EE64A627395D23FF35AA0B50E1D50116CC65E27529446AD5F + E2DB57E93252F0CB8399E41188F97A7C0A45F3AB5C2122292A968487ECCD93D6 + 353ED05012FD72A77DA20F7C26480ECFBC909391DC6547D152B2B724B65A5697 + D80096CAA254CF347363110350AB8EC55BB2838B8D9C22A51F5FAEED065BD7A9 + 5E746C72E60AE86083273370F43662DF1E84680FFE0A8271B040A2E9DA40253B + FC0272EA8E1AC7EB0E1D5461E233B0237D01A488B277A4158F169D4D2A476A94 + B40033C2F92C7086C03209BC7855C0039C276414022C283A5D1D7E94C08A679B + 6F7A2D56E9627B7399EDB99A85F31F1D99C30EE3E11A6161DC2E507B44083B7B + F3544BCA72D3931095F9E1D9805AACC4EFCF01B71F213FD52110CBB9BC5C9642 + 9FCDCB6A8A15E2D23B6B8DFC29A98A21304B37D12177830C55CE8916B1A3F79D + BAA8822F754A096F324C7EBD37A2DB0A6B7F0246F4C71F573822E668D8F159AE + 9DC78DCA9E267BF6BF6144B56ECFBCBF76B3019D968D39D326712CC30F40A7EE + 071102338C6F13EA782AC6C2232BDB3FBDD568F7E5AC09724CDF1C6C1542399C + 53CA1523234195DAC3CAF86FA7808EC32A33B45FF5970295AE62498A625801A0 + B388C6A369B1C63ED1BB9C8C42EEC128F7E7B90EA992E98C00227C51921142A0 + 7DC7778F66C6F9902FC4796B822C8608ED0F2C3804FF1383615A720A64F4D675 + 4F66E70B1A1D03D807DF2DCDDD82EB79F866CA9D8DBEB150AC4B00287AEADF91 + 9CD91007F5EF236C864999DFF5C590A52EF3E6A731D5F91EE65EBE0C175A8B3A + 81435815CB2104885EDF5D61615CD7F7988409ABC4EAEBC3D3BA6DF4988F4D4B + 60612E29560DB4CDF5386FF79045445DA7B048ADC9056C8F9F85FC78006C8CDF + B62ABC9FA839F3819FE4671FD6E7C983988F69432C3AA663CCB4A3099BAC64D8 + AC46799EBAEA90D005D2453E484888B3CB356C3873AE4C6AFE73D3E620503742 + 3044116E4D38951DB45927B572ADB6311E5DBA3282BDC156436E890F7AEB0A91 + 6A1D3519DF7DB8A6464A4613C9D5B2EE23B425A835F99D4A1C6FFCDA596354CA + 717A02FDB8E54A6B92AB1604AD137292BA6F04F363BA8557800A1A7D535A4C84 + 934FF4A6A323409693ED362E3A3615A5CEE80AE04E135AA7ADF66A8715C7BA5D + C6538E5FDE966EAFA9E1CE6157F302C577E14419DCA92DB02C2976D469EA15E0 + AED1E4528404D76E3A5544F9AA04656A89E71343CE8F2D39B90C7AC61E3E9512 + 5F2721C3DDE262678A322B9581C15CB1251681039EE182349A293BFEF841DE35 + BC11AD46696F3C3FA0938C29DEEE5773BCCF947451A48FE6340447A63621161D + 19C15363809A20F7CBAEE0BF0690F3F41358A59DCF8E3C858184F73C03638C4A + E564749D4B1DE5369388D35DA8F0C03FC7CD7D2BBF5E682BB351DF0F261825F4 + 9CC6AFF4A58F9CD894E2C740657F7C1703237EDAD4654B7B210656A2F82AD030 + 25006DAEE28FD2840285716D1756AA5472EF1A37A94366C137DF621A0338EC1A + 5E3A5ADD5698C6FD5256693092C6BC3555DB5B77FB1809ED485C3BA3A48E818D + 6914DBECA9015326710814C1337F91FAE28817D582CFA8F8B780048BD564987C + 325EDB7E78FDF393C15C2DC3D7D6D0E89B707BAC927BFD9F5460879E1281C00E + 9D34914E9F37FCE3467D254670943B81C2F17AB9229223237F01BA1813C4478B + 544C07045E3CDEF63CC7F801A5D66C3E3F06F33F20EE403E8922ECAE1C017F79 + 6F3B2EC0804BBF4666186C1700488986CD517D78545683FD12D7F29635AE4B5C + 9A2F7B6FF3DD44720483DB73115C0D16B9D3457AB36D5A918165FCB6F60BDBCB + 4DCDFEDD1D12EC01057D28D1280D57CE53FE9B0CFA511D43EBADEACA6B77483F + 7A4F113B4B063CD964AB10822B4B4D9CA9E93E6B30B07A4E875E47526C7145D4 + BBA663B4B4322218714CAE1524B31E6FF6B46749B979C7E2449BE7A13C3EEDC8 + 89F1B8D7342040BE9CB20776D22FE2E2FA87F9C6F2D71584FF9933C4348E1B71 + DA9918C14CC1D32FF88A35800981F83AB522919C130D20F13314C7C739AEA9A8 + B4357C1D93AD3831F9C59679FDB704BF0206807D6E0C1B108B8A3DBA57E32215 + 19F65F574E732BF346E910199918446E88BB77DDE720C300F68AC39352235A9D + 937C638A40E014108DBE8652F25ED6D02BF45BBC8D087AE82B688B47174DD099 + 1722607B10311EBB4524D2FE142BE180356D007D282FC31EA61A07691C73220C + AC1D6C260A554BC1A1AFB22583F1BC572C769E6F55528AD1F78AAC29F1BEB78B + 2691DC306C60ECBE440900D709EC33CF4FDD2D80F572EFA7C4FD3BBF3022BAC0 + 5B4B8F29D84E6E0089D0E5690245B99C88C0B7F62944354AEC19994BD44DAFC4 + CC977CAF5B314E5798AF6449B49DC26617D5B7CB0DCB35272A6C1345763B329E + F558CC021CAB2572E01CDB57D472D2606E3357F6AE + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR12 + %!PS-AdobeFont-1.1: CMR12 1.0 + %%CreationDate: 1991 Aug 20 16:38:05 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR12) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR12 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 11 /ff put + dup 12 /fi put + dup 13 /fl put + dup 14 /ffi put + dup 19 /acute put + dup 20 /caron put + dup 33 /exclam put + dup 34 /quotedblright put + dup 35 /numbersign put + dup 37 /percent put + dup 38 /ampersand put + dup 39 /quoteright put + dup 40 /parenleft put + dup 41 /parenright put + dup 43 /plus put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 47 /slash put + dup 48 /zero put + dup 49 /one put + dup 50 /two put + dup 51 /three put + dup 52 /four put + dup 53 /five put + dup 54 /six put + dup 55 /seven put + dup 56 /eight put + dup 57 /nine put + dup 58 /colon put + dup 59 /semicolon put + dup 63 /question put + dup 65 /A put + dup 66 /B put + dup 67 /C put + dup 68 /D put + dup 69 /E put + dup 70 /F put + dup 71 /G put + dup 72 /H put + dup 73 /I put + dup 74 /J put + dup 75 /K put + dup 76 /L put + dup 77 /M put + dup 78 /N put + dup 79 /O put + dup 80 /P put + dup 81 /Q put + dup 82 /R put + dup 83 /S put + dup 84 /T put + dup 85 /U put + dup 86 /V put + dup 87 /W put + dup 91 /bracketleft put + dup 92 /quotedblleft put + dup 93 /bracketright put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 106 /j put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 113 /q put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 120 /x put + dup 121 /y put + dup 122 /z put + dup 123 /endash put + dup 124 /emdash put + readonly def + /FontBBox{-34 -251 988 750}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C + 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361 + 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA04C77322EB2E6A79D73DC194E + 59C120A2DABB9BF72E2CF256DD6EB54EECBA588101ABD933B57CE8A3A0D16B28 + 51D7494F73096DF53BDC66BBF896B587DF9643317D5F610CD9088F9849126F23 + DDE030F7B277DD99055C8B119CAE9C99158AC4E150CDFC2C66ED92EBB4CC092A + AA078CE16247A1335AD332DAA950D20395A7384C33FF72EAA31A5B89766E635F + 45C4C068AD7EE867398F0381B07CB94D29FF097D59FF9961D195A948E3D87C31 + 821E9295A56D21875B41988F7A16A1587050C3C71B4E4355BB37F255D6B237CE + 96F25467F70FA19E0F85785FF49068949CCC79F2F8AE57D5F79BB9C5CF5EED5D + 9857B9967D9B96CDCF73D5D65FF75AFABB66734018BAE264597220C89FD17379 + 26764A9302D078B4EB0E29178C878FD61007EEA2DDB119AE88C57ECFEF4B71E4 + 140A34951DDC3568A84CC92371A789021A103A1A347050FDA6ECF7903F67D213 + 1D0C7C474A9053866E9C88E65E6932BA87A73686EAB0019389F84D159809C498 + 1E7A30ED942EB211B00DBFF5BCC720F4E276C3339B31B6EABBB078430E6A09BB + 377D3061A20B1EB98796B8607EECBC699445EAA866C38E03ED7D4F3EDBCA1926 + 2AF6A41F67AFCFBF3630C943FA111E4CCD988A7363F7C2B75EAF5830B049460E + 0D2B337988F150B9182E989E7750C51BA83DF37685483F86D1F47478883F3F6A + 4B7F768DA5AA89E8F163029ADD4A9209DE8A4F285766C06EA859639B92CCCDCA + F59B1C2BB8D588CA754D1257BFF76B53984DF4937093AAEF79009D32A29A4C16 + FB610C7D6713482C48D7F9E8410C0F00AD6E67021056B6035534E79F05D14EF2 + 4E8D84D2752D8F045357E228D6C524C1BA8A9275928F05E0266E33244B83F87F + 439373EE3592D1F67CFB92F600E4EF17479E8BE2789AE58847313D47C043CD4D + CA208AE5F065FD65B0F98089371BA69CF9E71E11B4978EAAC3E76B662C07C499 + 1A3612FEF1F3EF655753301B26EC3C9EAC80E059AACD02BB342298919CA1811F + 5936EB5DD49E3C13FEF7643CB20284C4427E9DB26142DA769FD783D749F897BF + 89CB39A297CC4FF9030FD615C632548C9DA775D662AB07CBB7DE18D1BDD79520 + 4F6351444D32BA3864E67BBBA2C9B272E4609C5B5E9CA20A27006DF7A3C2A568 + D34DD46A982A7FA68B008E1302005C4CF5E4586A414EC416FC0B3571AACA2190 + B5E34ACD63A3D14E3956A65F17DD2A2CC864BE4C151A462A150C70C32F259458 + B695C0D93E2EAEB224974D830A3CDD32D7807C49B59F6DCB22F7E4E7589CDFA1 + 685029E400D89821C50950D7DDEB973E9B00CCB038378C190EEBB2A3D723BACE + C763CD9AC935848A2DC88AD210365DFD0CF7447D84B2304B60C34473A04BE623 + BD46729012874FA15AAF93CE093144E1AD8170BF5A34721B37001E42224CCD28 + 2F6C55FF98CD66D67F98A0B338A4D4E43D7739D2E00D767969498C436F8FC1DA + E5CE9607D8B9CA4C38890606BE1519587541CB68AD45D85AC943E10A1D039153 + 798C7A4180276FC18D32EBEEFBB4E9BFA70FDF48C4B31D5139C4628FA8B53FC4 + C54A6008DE70A21759926FABD0DB0878065F87BE287D716DD9B6E6AA7FA298C4 + 876643033458EF57ABEB17F2F98D59DBC43DC5EEF80E335EFF44EA3900618C9E + 9D7D5FB573F01D36831FBC6B8240A3C1BAAB434D586C9D59A497F38AA7F8B892 + 84E42754484BBB332FF00EE683F2C4E6F866F8E128739E44B82C1E765CB54495 + C5F03B51A386FDDFDE72D98613DF4062F3E8F77FE610F4DA4BEE0AE3DACF2A85 + 32F48EEFD5222D39208850F85FAD9AC27E3E924A817522665DEBCA359458BF10 + 30356122D5F85179180E810336DEDFD8EF2C10A9D3D44030E5811814121F01A2 + 5FE474EB6DEB645F499A77430B4B3EE2DB0CC8D0E0DECD34E1E678BDEFB596CF + 51E055D7417E556254093F795556A9C38A7D4628B8CA9C30CA0B197A744D3BDC + 58880A525B9920C7CBF88B350ED515CDD61593444AAE929C7CB12D3B101779BF + 563434B7E98ADB7F51C1EEEA902A4097C1ED31958B3B671BC19D2CC34AF9C461 + 1E31A282F1D38A0B4B36307527BE00B014A59E4CC693C828948D0557BEBA3804 + B2384CECA42F3270C969124DF3F1EF2D2A4CBCE4198D08BE0118EA41AA285BCD + ACE6D324E4049C2F0DF101270F0CD2BD90B94C150BC48FE227A5EBC5A1D58440 + 12DCA12FCD3DD9E624BAD8623A6611899FE57277BE78792840B45ABC4F83A6FD + 98FEA04A5F366DADD81C7C40243B35FF4E737561BA98CD4D401AD431A7ADFE47 + 943E7D21B45603B02D08EF75165CD98694A8AC8695AE9D748DEB13BC59A2B90E + 51957FFF19363D66BD5B32F22CAB720C2E2AA456745D8E72C2E93CE30AF4309A + 49CC99DEE59AC15C512271F552768CDCAE82AB40BC13985BB65623769268B890 + 42414FC30B2DC0578CC4F7DA38CCF5329828FFA6BE1B8372F734FCB199C1D7F1 + 55E5DD86EFA72C77DDB878F06D76D56D075541A7EE3BA82E080797997941B9BF + 598228A0CD7566E80F35F30E87197A40863BAE4F6FA882DFF6F37C19A6DCCEE4 + 56D6D715E7730901234985838BABA097500450940976B7B997FF26440A7F1147 + 769C0FAC7D15EED3FD6DAE978E9B35462E843EBB9A93C30DF1BE8CA49197DA73 + FE5F8E2843894142AD5192336CFB56013B43749B029CC8B36D81E22559AF60C9 + B98053918B97149B9D1DB4B602830A4601794E7D47B40219399D55AAC92BABFE + 46974FA831AEFE0B959CEE5C923438E183DF0C53D5FF1AFAE229F971D44EB4D1 + 7CE42E76D68A08B4E23D06291D9BB022AA825D57EFBE0A210C3377BEA3924FC9 + 304AF9EB8BF56F0997C06FBBF78654FABD021E7415C41D36FB50A9EBD7B0D9D0 + 5177AFD06A3BEE00071F267E91386A3124FDC05450EB038DAF6CF569B86F99C8 + FDC06A0054DA09CA4C7D5C028CC8D6B3A4FFC8898DF555367C1ECD3DED6559D6 + 929C059285D44AF96E1DCFF651534099894662082B418B3EA72F1BB619C0E85F + 8D8995764BAAD8AECF4153A0AC5C0A47FA92A7AAECA7EB9DEC1BC57599E48B1C + 8CBE4F756D8D52115D7F95EE9260030935222F7CAB801855293DCB2567A6DD24 + 680BA9055740FA323AC8A5B6C2A981C940366E072CB1A83D0BB93BE7BF99A277 + FDAC3C652E4830F9EB19F6DE5620DFDD8B2D4A0C7D45B13E55945B230EA19C75 + 3A058D520459913D1BEFD3F48E4EF2AED14D5532A9295A075C174B2B6E599C4F + 1749B4B5F9448A26A39A36A1F6E4AAE2B431D88386CF5FD5620627813287ADD0 + 713B48B0B30A03B021BEF91C1D853DB2FC7C9D1F66481260B198308C06E7308D + D1D850BE8EE80E2B7BEE0A95AE7C331BA622AF14340EB58E9040F85DD7994555 + D082A7A7F2733301D961B41404B89CA836407E60D95B061E5B59B215FE9FCAA9 + 81C060ABC4E555A08D3BDFBD872D682741B933DD506149CB72C344BAB39D4834 + 315AA929E173FF7CB1E3B491366FCBC15BBAC8F42E1631F04B7C8FC6CE2EDE71 + D835B94433F390FCB674195F36B3AC6E12058421E838322EFA98D3BBD133F387 + EF902F40E0FCDAF2F0AA4CF8543D7380FC50E29A8C89DD0EE2593AC8609CF48C + 5C8B6289AD4BA437C8FFCC17879B8EEC98410D984D3F934960E31F8E893BD8BC + 9003F929C4D075671B54C0A8F1640E94ADCB40783B0B1DC00CAC66B219E75339 + ED8C34BD2E22EC392CFF0E1066248AFA19E9078BA327D9F704D70FA81D745A32 + 9D2357C5C21B9DDB3BF4ABD38FB53C6C329B806FB05112A2299516A6EFA1BF00 + BF0A6EC64A84F1A5D988AA1C53EC250321AAF3CCF1C1DE8129CD81CE83EE8DCA + 53E51ECA95D780A7FFA2DEFC47194C452417ADE1FA0643AAE631677730E29576 + 0ABB66E50DC3AD1B26CE77CAE9B6175EB4399CB7E1B1D55711E8FB42AE546F0C + DAF5FF169828E5536AC2053BD297DD354789D7BEC4E8133687697BBB4A45E8F2 + 163CF79FE41AC2B2608A6EA327F0556787D1AFACB5189EF2BF7C904E5B8B2BE5 + 898EB8A0049CF13235C4CB28425D77CEB56FC52F396994A5F45AF5B0515AC3E6 + 0ED2A6901AF81765C965B0D5550E8BE0DD2B7A0A343E26EEEECC9941CA489A95 + 3DD318205C16FE432CCD5611E48F9EE6FD1353B7F32B5200A2224F1074073D8C + 09726729AFCAA15BA5C5640DDEE152AAB8790C80150DE4E3F37F144690AC1DD4 + EB0D0AC1097D340D5A03C526F3E7984286DB69A7A547787CA919FC8AA60EB055 + 0E08B9C800173BBAF3D6B0D3597BD1BCB69F71A5BE2F44EA379D77304AAE1098 + 7B3EF6AD98DB13B361621F6F10D061BFC906E291506BB1F709D9A01CE2E76A85 + F10700C50615065FBF09DA78D20F1871A61E2E7EA8895CE72634BAD190EE0A01 + D5BA80218ADD5AB286AEF7E8109F187AF5E279DAEFA90FAE56BD2022E2FBAAF5 + 0A8883CE25E4F7913849CBE6627194B57A75AA4C5B6F3F90B009550E9F1A4A5B + C6B4664D90AD12BDF4D8DBB1F42FDE9E30DA278FE6A5B34189E5E526EF6D2FF3 + EFF5C8C5578856EA8F626964841CFFF32B5340CB8ADF298A887D7438BB1A5F79 + 7AE8CD847442D3E5E18D1E51A001C9641828757493737D74803CC81F3E11AB1F + 99FA9358E70A29FD0BAA350923E67053F975685CE01228153F2F031106F6CEDB + F64C08EC35C683D276EBBDA86E25E57BF0F714D298B2C357E75841CC6C1A8778 + 54BECC8C4E30D7F378B8895D73799F2C4ADF46F2324B6CD1E9DC57986C8FBEC6 + F016AFA5AC4A4C6D98A163F273DB0DEF48741524BE2ED22EDB5D26EA138CB53D + 4ECE466B30385E95FC597BF5CBEE538548A1D6D3DC32A31317AEBBB843D9040B + D6102FD87A4FF902E3BD306177EB0EAA885BA39031A623143622551284C979F3 + 6C81021F167FE80A05A266E189D76E00F4665B076768A77904E3CEAA3112EC10 + 4D6AD3148D2CA70083B61410A75C88043CE4B399D3C1697C8A8C66BA9537F6E1 + 29446269B3E81EA2D5D8FCA4687678D1B30B561482E24870865001E96CD2F8BD + 3716D706B19EA64F8D5069F51D59E7E1551FC3EBAF4D77FE94E1FD50369CC01F + 58B5293ABBA9337D7A49159168AA08F4D85A207475B9522DB58612E7C5883348 + 151F0768FC015A54AEBE8D52B5DAC79285B40AC6CD222CA845E4AF76B11A4B9D + FEE732C3E48F190F5C85E0C05DA0E4E760D39AA904662A4C01BDD098A98381D3 + 5A0E5B5F63ADA34BF9AD9D54F2F1959F41185C4819AD605C87F8C39D8D434B53 + 63FF5F0F3AF08FFBFBF25B814D180DB9750729F7C4962472299AD4FF6A6F3491 + 2820571058B7D453BBDC057566A9BA1A03F078F969578AAC9709D3CAF61FD5EB + 5AC81EE6D84DD677A25880F13F51A4EDDE56E06CB515C90D0E5E580C20B4C81E + 254E408CE8CB6FDFF95F09D7494D823B81420FDA7CA7CAD1784543AD07766BF9 + AB6DDA41C05E46D3DDD5C7F319C96DE7D5A88FC4A12AA88525C287749B0974E0 + 22D179EE6CCBBF57BD468297269F3122AA825D57F5D630ED4E114319E224E9A1 + DAF93BA2C44C02B46556369A5A1D8FEF84193969DEE0C1F4EC85849ADD6B9FE1 + 8C0AE258EB7670AE5593DC1079D5901ADA97B36F014371B6F9C7CE05C4208360 + 0F3D9C4D090FC044F4E9CC65D13D851486CBCCD31D96523B570FDA0651978294 + 25C56D50B49AB0B6913F0FFCCFAC9DDDE1FC1423BDD4AE13FF0DD3FE319F0D23 + B26C6B685B4A575E57C5C479FC6B97FABF12D8B10F4F3CBDDEF0D20A1520919C + 0B69F5BF6D14579C856C72F4FB38CF95755219926F4507878E0DD4AB31D8662F + 7B0FD33F7373D5AF08A58669F754991EFAFC59D9E47DD68FFB93330FB23B159B + 924A250A3C3C1EB54DCABB2F044C8E8142AA18ADBC078C2FD893310CA88D1263 + 1E926A29861FC950CF4FEA5007C23BA57754440CC75C5F4B58CDB35A51B81A7D + 3B005945ED20019AF96618BF35A10A86EFB038100728E38271FB9370DA27B1E7 + 7EF3285816C5CBA3D432960EFD3DBDF5FAB9218042728AC42021C2CA0694658B + 93B661E6173EDC7DF376D121CFDAD8BFD09A8FB0F7D942111BF1330C4CBFDE42 + 455F1133ED4DBF4EC1E8632585ED7A9A99C25095212E88DFC15271CE6E5CAFD4 + C2D095AA1B0CB6EB9E2BEBA687F2F5BE59E849687932ECBF6F38196E90538FD7 + 56F32F7D97A96C06D967177913AA3792365BD539ED2DBFAB31008FB9E7E32647 + 97C1E6A2D84EBDEF5BE0C8B70B39EF05F5600BCA3A037791C2414DDDE4EDB32E + 30C710A9C86065DEBDC463E7BEAF5988619B88994EDE3495E750CF60182D618A + 410B4A5869E48E62FD84759EB89E1EDCEA49C3D0FEB504DEE0AF8E3B0BA466EC + 67F3EB38F433EE0D0FB84D28470E9DC540AA88E5D6144188988AEE3247D729EE + 0BF4543E3CA51D2142A92C09D04EE9A5279DF351D1D83CF0D48690332A173986 + 4A44302F4E7F220A153F1DC73A1AADACB821655335515270C2655F47053A4B88 + ED5FA5BDDDC3592AD4FA7A7F6478BBD8678E3302E9BF0DD2183D2518D2075CC3 + EA4FB302005CE23EAE2B4E6899A96CABECB40CC97AEA90AB90E3FC7A82C913E7 + 2EE33E3356CFC785F3854E7EEB3A10592F70DBA44887F07524E3F5FCA239F776 + 081ECA64DFBC72A83F47970FD39577D864A925A7688EE517460008E264AE7FDC + BDC111596FB19EABFC79282C3A23B9609CB0F7C27920C8F63260DAE8A18AE4A6 + CC228428A295B4022EEF7D4AB711E19A8A43ABD4A4EC9955C174BEC4C02419A8 + C734DD06BE6795D6BD45A62D64115FCC4DC46EE5A6311BCAABCFC5BA43BD81EC + EE6784C1501AA97C51957E5D50AE4AAB7A37FDF7C041115C75B219CB6D96D7F6 + CBBCC8E9931357F0EC3CC9847C4DDDF96E86EF38E81CFD80C28D78FCAE155717 + DB398B9372C13EA41CA47E1CD57361F0A3BCFFE8B252059EEB98D42FFA7A7F64 + 78AD0EAC41C4F493595747F1FC0AE72F6D0E335F08895FFED8BC078B005AF518 + CC723762CEAABC199E214951073CA82922C68B7BB9DCC67467BFF7E5027E21BF + D8BCECC2FF0FDE00B69F10AA6F0AC9047F02772084DDEF276A4899423DC732BA + 3DE24D1DC6BA7E6E45DE8FE29DEA13C9D98106A56530EFFA3A5175F90F45FEDD + 1F88FAFB3F0C516A378C0EAC4D434D3489F74C00AEC5CCDCF46590AA9786AC54 + D87524BDEE0D9E2010567FAB985C477B46E3530D0B199C9B15DE505D66B1D3D7 + A32996982F85DA7E9F93DBFBDA5063A2E59AACAA1261DA956F7B6F04C16B84A9 + C5B88D30203B99657C38888BAE2CA2DA7BDF41C85E493E75042031F8E29650D3 + 861B55053E17193DD0F5DEF7711BC178978D75D326CDB77BA09115AB5E9467BC + 3AA8C8B23F76625755E1E6F7D522C5667EA01BDABB605351E9998258DDA142FA + DE3974FC26C4E2845C4CB99B0248F1D010C686D978CD17947AC7C721653855DE + D2A56DE260458B76063BDDB321D2DACAC86774BF00B4405743D34CFDD1E82559 + 5C6F318A7670CE18AB6BA1CBF9FED85E64BED526BFEDE8194762E6E6025FDE1A + 44A12DB62FED7BCF27FE423F5DEC4F4B403F6FA55C90607C1BD5A21841F50BFC + B1BC3494C1309A97E78BC9BF84EC68138905B9842E01DE9472FDAD464EBB87C5 + B2EC16ABDF0197EDA37514104B6BDCE20DBFAF34B9E2F39A3FF2C604D803A029 + E35451C8188D99F7F0E9D79509B7355A05023685198520ED49624274B0C47A04 + 5C7AA946CBCD3A7DFA085A1E430BA17480FC55AEEAD59C8CA67961C0E64E5F88 + C9486212A5BF933E0254AF6E72406FC07C56F5A95A95DE4F86320FA9415DC20C + 5DAA59B8108FFFD759B2DB5760B442C522D3CBB03D9EB5B2BF96F09B18725B3D + 7D955F74CAFF79B484D0AF024A41B37882526B8FAB8AE3017E5E213956D41B6F + EA9D33653E899E39B91116B2D8B5C720CAE04E714EE25313CC7FD28E063D9658 + D1F16E4743F494E01229826CDE518E563C5FD566A76E829E3765A83E761972BF + F49D5F27DA63C64E8969B1603D53D6ECF22021C842665A44543CC5D10BCAB416 + C499AFAA97063749365E0AD5E5325778427067CA0B3693891CA36913FB78997A + 89C7E30EEC37187E2042CC97EEF2163667F2DF7148BBE4B20C0E128E06B68917 + CCF8B7367C91237C7E1598C9B40F02E709A117DEDC8891415071DB11E8D2B223 + 649C65F33D947DB0DD9FAACE546C749F332FFF8D62AEF2E95FE9FE16876DBD3B + 0F369792C733AE136D1D0D6D6B0FBE8CCA3E9A63B07655D7887455A067B79BAE + 42DBE07297B1FF3E9972A7C107AADA393BA7D8FE546A207AAD8AFD08D2F78166 + 845A4852F14100CCA9D693E2D338797A8CFD71C427AFA6CB56E808A2CBFF82D1 + 1C96E0CD59E730DBDA85DB7B89BED023698AB4FF3B3A8487089BC86C890F23D4 + 0FBDDD5869EB17923CBD5134ABB78E3BC4B5228BB1378342EF548171A05249CC + 0E65DCE19F5AA16C8406F4833316A899A767E81288C98841A3C1839ADC40C53B + DC6A376EB45954B08BB76BEBF832957E8001F0B17440AF40A09E159D20F10230 + 21EB217DC565042350D5251A224C4B633ED31653FA5ED9C10612D884C770CACA + 29ED75B82119C579DF99F8CFD117BF8F5FE39E9D4E592C63663C9A854F729FDE + A48094CDD9E0FE65E0528D97E691E585BD01B3145CDF71AD1F342ADC9C2F49C8 + C8A3C50084840847C2362D97270D618368B4134DD46CE818F85FF92EC2108F3B + 783E9B854931E91D9EC92999D081F7749652C7939F9D7E0CE8616F120D70AF04 + E4C8FA47A18DF3EE82E665E0CEFE51CA9AC2A37BDDF89F8A910442DA4F19654C + AE1A774695A4827F491ADBB47925438C7660438A41AACC39044E6BB565B6D793 + BEC2B5B08781CE6F29164C7A4638EDF9700D345C5A02B626643CA18FA508F315 + 79D3F35EFF8CD6805395B40FDD2D4A851E78A3407B560716B54380612CA3052B + FAF3F736992DBE4EC84FD8D15D6FC96884E9473EEF7ED232DAD6593B6AE819C8 + B65E46FDB8EF933F05331D7EEC5CA1311CB61FAC5C88D4061F89D5DF129D8A29 + 29BCC5489D70BDF5FE8ED17990AD517D01662D8BFA24D405DAB40C25FD93563A + 15436F51940368CC39A262A326DFD644FE4FBE2F708C43AF314647E680B0CC65 + 41CE075DB74AF81948EDDDC62FEF7FA9A5E3567B8DD80EFFD58ED1ED84B2DB0A + 5B211389560620714F291A39B33DF22930FBD696BE31B74C0FF90725266BE805 + E157EDCFFF61622835B789D8DB0D5E2084913E4CD37B126E61374649B011DE49 + 9FD1B970D5D127429335141915770A0EF9662885145E22031E924D2F3B6AD56E + 098C9322DE903C03FA41F77FE32715C2FB22FDE50A726F543A85D27CB87B8436 + 3C42C82D7D033B000981C13B34F79FCCB82D4786FC6D006787351F54BC3519C4 + 59BC8CDAC7F3B6E737A555B56F823A8FE6EE8281F73808B6A0C0927753760557 + 434101E9213CFF406847ABF5193396CE49AD779AA2AF1CEF4CA60B41975211BF + 33DCFCECB592F48C662A3824DF2AAC05BB3A8A6B4B12E8D836F83B32E098C122 + 80D02F84F31359C77FCB851CA68400437E3D7847031CC02CA4510E58CAC275DF + 9B6E49B3763627BD9D84B8DA1E58ACD45E278F3F01B29B8C978EA8E8E8C568D8 + E1508B53093C57A58AA9622E93519F79DE7DB3262C145AB79BE5823B7A0D05A5 + A3A24EEBF7EF2734D119AD8E78717E05EECFF3E4293BC98D00B664D5EBB6404A + 2F25D37C2C8F81A72BAE406D7A982C8B57D66A9093BA90760A228E6D0C633B8A + 1403EF494A6B3ED5457D657FE5EED6966E5D82381E03AACCE67E3AE741AFD81B + CFA69D6E9F7A8A9394BAB598833BF436158F6EBD74CD52D03F1C5EC043DAA3C0 + 92750E6AD8331F2E0B91E447990D39BCFEAE8B10F02560DD7F117C8BC15D1ACB + 1EB791690C0F9A46F0F6984ABD85DCCC04540236E1E22195961EF1263DA8C995 + 54A7B8598B5106956A195622202AF0739B62E46D7B26480C6822B93280C05F54 + DE812A94727507BDE42F0A10B7BB1182012441BB2A5F03C00820B4FC229C9EC5 + FEE09AF26B4B470C5E86360372F7CA6A3D84689E30E77EE25CA43DA900A87398 + FD6D7AA4CE77CF2C0A6554CBFF6749B10B17D5F72EA70F4F3DD5517C2C599698 + 09D2715E346C35EBC0A206AFE419FEC1575AB38DEC892DCB0F07110C03A551C1 + D67599D58142AE7B3D7CFD7BC1BB764D33BC547CFABC288A0480AF003C95DD30 + 9B80D65FFE945845AAC546D7048316484BA0F1654F32C8CCD32D39DB6C8FE440 + DE4E761CFCC7CE9981548B5245653116FA730A2491EDA1A73E26C6BB2096ECF5 + EFCA66838BB21ECE5383EDC1DB65F73E7B6F96F335E3BC481E4F3DC215FD7DAC + DE913B06AC06977D612E89FA620DDD7FE5B43304AE242041E41105BF821DE026 + 9AB475839019BDB330CC66BB745014DF2861322529FBF5429FCAE36F98BC5E34 + FEDD95371FC74DDDA1DAD47D5AF5BE042D46A3E303E3FD20A21E9CB54D5005D8 + 6460F07C6E0B8DA33A52960A15E8D06AE1098AFF4A818890215E043F1AB2F663 + 1B4739F858DB267934E883A70D8CDB6940F97DAE92D4FA05666F3BCD8A474707 + 6A0D2356E151D84CC2868A9710AF061CF452D4B85F8110D76172510E3156B7F8 + 9AFCE6B304C7B3FF042068ECD442CA3C29EE13B1A5F25AA46F8FE777E910CA9D + 6A559467E9B92C824AFE83690B5334EA8805C8BB28654019AAC0133A92A87018 + 1B7F13C7EF20DBBAB426498D4A1ECDF9F222C2DC3F204B27BCCAED3A64634B83 + B1FFA639460D86F1932624A45050E5940029ED3C6D436B6659360421742E325B + 8687F15C5488DF19C52BF38BD5850B4D08EAD81EB6F7B44D7316CB2986E2B86A + 1EEA81C848088CC76AD8891D31CC20D93DE8BD3840F209EF4811A203875992DA + E72437CC14579369DCD471D0A1959D2E23607E1F4F8A91F4EDFE09111B777BAA + F5E1EA0B58FDB041199226CF6A18C2C71230C06B0418FE1C8AE044F5592988B0 + 3B3A366751F326DC103755AFED9B2434E5DD0F5F6E92C758F0325BC3B06EF602 + 3D837CB592553F1F3CA12720093FE3F0AB964016458760A5D35AD01E33957C1E + 01FD2E0FFC0AE147C30B9D5EF09A04984BB9380B44C518F10EEA97A4AEAD0367 + 380BE0AEE062F46C4BA1500F7081526003195F261E6505397512041A58CC2A46 + 4DFAB3745987176ED243988D40683BF9ED820DB4A7E5BF8EC766B815AB25CF63 + F4ABA1A08A21AFDD9764276032BB97CF1B4677D54A42231DCE4BAA7EA6AF8AFB + 13C3640F756BB81F8C02E48BA086DD0E6E466F15C026F46B896C4C3EEE7A00A7 + FE7EAEA5269A0E19016036CAC31DAC13A48CD7F96BB74F784DD94827C55874F6 + 8BF87B647C7724C00B89149450ED0FB652C410C2039E78FD43B7ACD3B7C37DBA + 9F40468DE520F45973084D9DC7014F0445749E4ACF8C40300D5DC1733ED713CB + 78DB24D82E3DCAA46611330847219C2ADD285D3A67EF99CD1BD0A293BC0D75C7 + E66093528B068E97E7783A69F5BCA8121D37C11F9B72B4C2F6C4FF0F08481F25 + 9D50A1120F8F3ACF2B0FF72758E308CE2DA8FF47EB2C4127712AB7C8908B41B7 + F929D05375AB990C2CD5395764E7D4A5548BBAEB811F4F824D7764623C2F29B7 + F80A05802CB90F4FFCD094F121813A489236B17A48001E9EA9C14EC005A7C85C + BDABD10A543ECBBBEC1294F6B8E5075261E48EA14E5868825D34CC256AD864B6 + C80FA54A7BC3BC3ABF1F8600599AC9A35B1C598754EA5E42CAA034B2E58FCCF9 + 266A54BC856687FECE4E0AAC4A3C6B6778BD04987A0D9F507C2562BCCF110AB5 + 72BB9A4BF0000D00F4700EAE3BEF8BE33DC1B5848A44D3A791F42B218F2A6710 + 1A885F07691245FDA8475DC7EEFD323796BBD4A349C29B318E9BDEA5D8E04B40 + DE1605C6441D46E4720909E0F5EB6401025417C7400E9DB8E9969FE235EC0395 + 98390B2EBB72CFDC021C34467FA8CDACE644F0A8A796B9F12357494890171578 + 8968E951D39DFA9541C22A6FA86F2B77AFF2FAAB15ACE791770E9966CA7F5AAC + B9E6EC7584987A077D5F78A6767EF98FC5EFD584C5938CA5FE2E267A82B2D964 + 07E946783736747296D24D95B2415BBF6C22D0099B6F3AB0A87AD78857A65CA9 + 17475BD6E0A9DA63777CFBBAC384E16A1B8B7935C25C0555656D508C629E0347 + 0143CECBD1FF8D8CC35308CB363C46A76FAA0CF08668543482DFC3A4BC1939BA + 6E9C94ED55BBBBDFDDB55CA3A7E8B4582B1F34017F5A7F13A48803852D1CDCF1 + BFDCB3DD604E2468D57C0E44BFF7F62995277EA49ABAADBF6C28C571AFE33402 + 8BE87361C5EE40C871B4FBD811ECBD46D63275C8608A3CE46A84FC9B2B2B5851 + 04E7E98C37DD88EA93CA4C092FEEA716FE97E147F86F0C30640968B5CC915AFF + 155FACA6437A5A35BB8963F15DDC6323E009236ACFC6A5D4DCE87380EBA3E766 + 343936B4E8FECC60EF6461AFAD189EB418AA6129429D9F6BFB87487110374C66 + 1883F136F5216CEE6C61ED9865AB29BF510E1E498F9ECB96A42E2F6C3C92348F + E76AC1FD082ADCE93FF4438973E570E76E93007677654514EFB4231173002805 + E6421B56BA1C558116F6743FFCE591BC29E10FD449D15F7BD80F1E893A7C4187 + 8BC1FE630B80D213B5E543E3DB537423FB5D00DDE3D56752D648735B2008F77A + A18F0055A9693FF1C26F9246AD3E32BB86BBF87D6F0FA5C19A06551358B62764 + B8F9824934159D0FE95258FE68808AFAC1E1C78127ABA43E33C23FEADDE2161F + A263800648F4C2C962F58C033E42F941B7EAB4E6C14A03FD396C350BFF868403 + A59CD705B4765D19C68454C3D643D98A5762407378438DC9DACE675D9B30516F + 1D9F9053D07371A3A7EDD0334B9C350941BF5CC6EC08C376551FDBAE63DA1CAE + 07933BFC7AB683529BA922F285B7D18B660E49DF07B644B94BEA635328AAB044 + A71376FB681F108A441B906A023D7327A80BEB18F92495C9C1ECC1483F7D84AA + C296A5B3A0A28432CD530545FA36B9DA45CDD95DFAB0D819B9B7039C3B281BDB + BAC92D56A3589A390A9A6752D9912F163219FB4251F51ED37F0600F4F1785C99 + 0F02360A38E96C1A9D4DE38B48E356FB52A9C14538259B0A4913ACA0326110D7 + C9FD212F1C1B9C2F0E45A7679CB250682473D61FA86598DB7B972B6614E4C199 + D11D5F10D7761D5B53EC577318C2DCB15060D51DA20232108FB2DD0DB10B404A + 43300EDDB3BAFBD9D2EBA28FAC872B97B10234EA2EB97CD74FA77586B721CB02 + E9D104C08867B2FE0B9607E4BA38564463C19807C8DD6AAC8B4AD7C47FE68966 + 2C85F77AA2F27D27814D7401D71899DABCA4A343EDB8307841D46C9A1054BF6C + 8503EBC00848C856907CC506FE889A978340744A5004BF0045917F2AAB092945 + DB3B2FFA71BA250C2C40E0C84FDEC83FDEC833732C91CA1E6482E955A4EADD62 + 9E6E2FE03F9FDFCE0D012983DD52F2CF59D04766421FA71C1CF7EFB6C9CDD354 + 2D622B239C48CEE16C8AD3BFE2F8CF92F1449F321B150F4A0CFF712303A9CBE1 + BC27519CDB84A8C58CB5FF2C4AB020C03B19033933F9B901769F977E5B8E6566 + A68308A5FB0EC1D31ABD80846A8D10D80D2E32F682AD109EF0B9950EA889F421 + 9A93231EA0825D78A51F80DF957C8308E6CCD24DF4F1E29B8D3CB61AF8359C26 + 95EACE6493C1FE525B22D9479366EF3E9A8733D5B0E6D9B6C9E84DA684972988 + DDFE8EF0B41825FF165A993ACB02276A921B0AB92772C38BE99429B3B55DEAA4 + 7C77FA482EC1BBC02AC2FE595C6D79CDDC24394D137D61159AA02A044551B069 + B01AE2BA0661E8697BB337801D7D898ABC41925E55187DB8A3B6137BBA1250AF + 68889E739B1424EEFD68F93E6D3D78C72CF987161B21E6E2C9013D56B30FC9B6 + 1B64AA5B28DAB85D339399F9AEEBFDB315C94E8F53CB41ED5805705C2B1F4B49 + 402BCCB0FC158038CD5AAFAA2132F74D48E98DA2CD91ED5DC1B21442DC24F823 + C37DF2C02135C01117D2DA7B802ACB949A26659764D7E12371DF8309A7100EF4 + FA22E607EDA69C5DE2EC15771EC4359EF5193532064D20311DDCD72493958001 + AD6F3AC5983E7DCB56432F46EDDED81306D357E87A801F80062B13A2436D70AE + 190C1F0E9A91AD5380946F5C630FBD438B1B5812F126BEA3D27FEBAF0666E97C + CA3E6CE7955FF46A9E1B775B47692E375F99C121845704EB0374B6844A094890 + 62E55B4345DF3ED13F00C9FFA9B723AFDDC729560EEFF1CA8D17273CD3FB7992 + 9B67312D3AC12BD79ADD4E06C18F8A4008C81683248D7221FA94F0F1C57FB6F0 + 5E91EA3120D0EBEE097C41C493042C380097EBF751725D27CE9E78D05BB72D52 + 3938A3F84801B4DA455AE219EE99E007E8636E2619CDD1F3F5AE58CB0BC9E3D8 + C07691E72739550F42DFAF826D1E6B956F02B5B7F178637CD80F8AE714AE04F4 + 9561E92A9E4B385A7237BCB804EC0C4535F2A407D8E071C2BEEB1D5CD414423D + 7001EB575147374F577E37230A74F1D5532D52D8567B1B707785D59DEB104289 + A1E2AF4244CF3F1AFC0078F60BC6F9585C05092AC64BB557664CBE8A9BA34D45 + FDBEC9D250E1F3BECE691A4785B9FB0B8F231494709752A466433D671A529DB5 + A444C4A4ECCC5753537B77803FBF49FAE61B667C85B2FD69ABEB9CD8FB517FAE + A82A2BE837016BA50C575887EC68AA2603D0B482E3413878AF2300CA393CA635 + 9B38A0115416400BE0D74276B8F37587B6AD88355180A891A1B5BEC45908B7CE + 80046C96A0322396DFAC559021C6135C4B5F19F8D0FFF0A0A05BF5A31810370A + 7A27502BABB381B39775D44010AA4BAC610EDB7F6EF37F2A6EE206A04F4B58CD + 14133217B5FC72E1A51CC76EDDB1E53AA11BE2BFDCB43F5B9F0B846B9C20B006 + 9A5FABAEB15E2A455D6678D0EF527609C9FDEDCEE943DCAB1D8CACDF998A5F04 + 7C195116A6AF06A594F5EA2C0D344D55397ED52CA594184A047CF35BADCF2041 + 676E70012AD1F142BD9A514403EC554645B7DCE79DA164A484BFBAA04DE6E0D9 + C68E495F9B4E5800BC441A82535A35259D083DFBFAC285BA487783664112BC10 + 973B6B4D37554DB788141DB2D3AA325CE6FB667A4872A5948F971834C0C61AF1 + B8BBDEC9971C0EECB5733261AF2DE070CD20F9DCDB4D851232AC7EA60996BCF1 + 7972CA67B4577E815E1E97C586B019D29D3E4BB48ED7B7E6AC9827CA0CDBA01C + 55AC6CAD01431B606F53CC7AE7979ECD20C1074BDE91F473AB5EDDA6F0D64557 + 87CDBB73F869BB0E544318FFAC9C4D0F1E6A83048625FA8B02A486AB42A9B83D + F23544F75DA3681F4EC77C57618B557BCD991EE79ADD557A837F05BA8435C1DA + 6F31B253FA80BFA2135C64630AABB0384F2D684774EFE1EF31473367AC6602C4 + F597FD0059814378EE5D118E1332B496773D2EF16781D921FBBE597D7C507075 + 6B61B142D5C7FD6E101CA062EE63C61554862233952709D0889B8EF23EBE89FD + ED5A8752E86804674BE5957F905AB913EFA354060EE949ECE9F3365DDBB65EEB + EAB70E97A9AE28CC4F19AB9C76DD0A8EE44912D49CD543C868544AAD5F8D121F + BE7EB0D54B8DD130D94A14F24DAD841B6075F8A87DABDF8AD334B10586AB83F0 + 5822B862E7714DAC1A6D939A456DFFC2BB5FCB54EC37E542DB5A6850E9BE89D2 + 152162EE773411C21CF2B496B426CB5AEE76ABB12C2966A5C30629D5DEEDA6DC + 586378481551ABF497669B061AD1519C4416F61D9DD985FF50ADB8C9C0DF8221 + 47A24380D8B48CBCE377AF3C188A3F99123CD019B8B4FF3C6BC7368CD16E6E14 + 3F15CEC50F7A56F49F7BF46E8988926736AA4C0E53B7B1495DBAA493C7AAB729 + 03EC033C9FFDF8CACB4B7338312B67546F2AE8F79A6C80BD728ADAF2D1297C32 + 77C44CFF158E22B1163D44601B50E7D644926C3C34E91FCBD2457033AAA23817 + D61394D397FE7663054727483DF12A34092CB606BF0AA77399F10FF5DD317BB3 + 471B09A8F2AEBDC803F169F5C9F154BD7F464129F0B5FB00F2E33318E769EC58 + A9CC02CC57BC43C2D33A7B92A38F27AC16CFAED5A288F769B5D2B6E8A611F1D7 + 0079A1058423973B2F787BEB55F044F494AB16342DB0AE76C68B5151360D6177 + 038EC62E11E28CB2CAF776A0217F1DAAED2AD630E38E6F8CD04E5DD421FF55C8 + 58000457AAD6D576DD977D334BB82A41AD1BB01122C8ED167913AE56D59E641B + 30A04B6558BBEE054450D569CFA392BE137A652AA4E1EA586A9CBF7BE6509A8F + 6BE29C7EC604D2218AF03D376823192322E8926B672DFEE893307E5786D0B060 + 216078ABA55D8A88E0959C843508731ECA219C4FE6CB9B39E5B07DA08F4BDCF0 + 1A4BD0174AA06F1838803F63041C8EA9C452D4E401A93F66AE706067DB9DC2ED + 82E9890721C1502A44CB77AA16B5ED702F7CEB116949BA14839CDFCD67615281 + DAA1B9BB259A3F454D7BB7BA6561A19DF0EE462C0815122B3CEB6B06FEE421CF + F9F843A72A0D9F053EC4B4F6BBEC61B627649D2BE4FD83218D686B3F234348B4 + 8D4C6739728698C676F0109E0C043AED95429B980859E5783E012B46711820EA + 6303555A73C0DE45C1F0B435CB12E69360274C1A8EEB3193BE46D5F17FCD785A + 9A2AF6121ED80DDEBFCF006E0DC3CA578886766DBF1AC22B8FC02ADD76172DCB + 2E2B4D3DA6F5CD3C2C012E276D2DEC311996479CA1A0F29A39111CF7B0E40A58 + F7F276C23FC59CC61599C85CE932429ED99DF5C01D4A79CC05D6247FF93A316C + 9086B58AC6B1420EC7A10C059077D2B30CA63129B0DE762A85EBDDCB3226018F + 678F58188332542ADE690905D49170FAA6F3F6EC9B170103BC3E9679D5909289 + 1F528C8BE533C6C1F7618F640FB5F036FA111E40ED2893AA4CFB22DA15E8681A + AD914F354A7908D8C5CD9D11BB8C2396CCDE11E5D415505CD80DCE13976A6C5F + A5192C259D87087FE076136E7FD8185D6D77265961303E5F3B3E324ED9F8DFF2 + 39BA31EFB5995A506B04EE545A88CD1E2DE9D1B65F64AE22F8C5C0B68A08E277 + EEE0F16F6875B276D80D27A4A877A1316C6E07926276D9750C482F9AB4E41226 + 7631802D402C367879CCF7290D3C0CE02A074C1E2074FC1DF130FC2BCB4BA3D9 + C6FF084396E4293A6A455F0EE919DD74C14271FE4B5D8CE6CBF83CC6F0872C46 + F5288387D11E76B3CADBB21D9BA8046FA46328741879182142B992CCBFC7D715 + 432E88BD2935EEAAB134A75D771CA0F8988EDC0F821549F753529E0FD6FC84E1 + 95C51A4EE57FD2F33F2649247F6FFEE62EEE8611C5FFF8DBA2F19F44B5675B55 + CDF1EB710E5960134932124EC9A74C17B9F78006F34EEDDF4B2CAA56C59C9706 + 13324F55578E791870D777B62B6BCB203D415CE679FDFF81047159CC09E29B61 + 71F4792E986D97542E35BCBE1A4E8AF04286BB685DFCB4302B75213F8C945149 + C386AED7E150A62CB97B5B5E2B234793CA68C8796C4E83F55FA300FF11427942 + E8C7A5DB5D1BE44F58E746E38F95CC783EBAF9E06C638C619E16551D33E77F51 + 1E582CBA4F34DEE196EC8ACB3249B4525CC0C94A840AB339925EAFD705ECDC03 + E2F11D8309527BB8CF44E40521EE0E80079ABFDA124C988445095EF9A479DAAB + BDC3DB3DF506DF12355B47A644B5EA21CBD0F66AB79AB6CDB87F1F7D142B8CE6 + 8FCBA9D56E933651A21F464A10AAA3D33040E14BA44E35902451543A2DE0E4CF + 2F94E14B66C29FF395003A800208975C8B12D9CD408B6BE39F94A1B6FD739A51 + BAAB5F01A001FB24B09E21CAE1CD342AF32C15AC474E84DAF571B8C5B3BA277A + 7A59AE7E798B36C42CDE0435F57FC6BF9FE327D7AEDE3C8F78F5DB14EE20D8A8 + 1425FA9F1D417D88E915B326704C6F2640E9538D4645746D386E702AB479503B + C26615110F4851FCF0C56314A82D97DBB1ECF8F6DAF4FAB693449B0649819FD7 + 2749DE0D08CBB3B75BCFD258064CBAB5F48B2F6404C36EBF8F6BD90CAE8D75C1 + FEB3F259B50F3D52DCF33867155668872DE3E09FA4D2559C85474CAA8A4AB5CF + BB3DFD0DFE36677E0C7A496CEE2440DD3346C480C3818D0FFDA6B8A227A2CD30 + 48B82C2D2BABCCBF115A229812074F1811CDEC7D68FDA32C454AC2800F38F861 + 5A76E3B1DD4D05AA8DE64C7F276FCF0D990DE2AF4D66A40AD6BD0BE8B69891B7 + 7B8497438389D3CEAC1EF4476778CB9D18087538AA03D59DE78BE7E7D7FCA204 + DEDCF75FAB49ECEDF2B7F8F67B18F73D7E219AF9DF3B4DEF0BD3D455369E2BAA + 02F262671BBE5BC9B6A193AB26EE51043F61D73FE0C972DE9112F009820BE067 + ECF446E96A229FF474D73AE198F3E53C015EF361697500F3480C56E8C371CA36 + 00CE20B15FA4E540ECDA47018B817628E5586CD8A25FC74AE80498B5A4D20EDA + C38C78B2C62BB872C0C0A04FCDDD493F3CC5C4D6769544ACBA0CCE16E78B8E0A + 2C2024EED4A98148BDEE797A5120E7BEEFB5CF2C36F92CB124B3D164DD0C0603 + E0FE7260B46F8706AD23786FF3D52B02071C93B484C0BAD42F9CCD70AF92A36A + CF589F82303C1AAD6D45E08C2EF9117537BE3CCAC6EEEF623352D931B833337E + 8E66F9239B24B51625E89C5BF0266B8C56C22A9452751EF3817C989557D21B1D + 35FC34E208EED1113165DED480A3149C7E905EF56B6861EF1864779818BCCB64 + E1376758C15F202B67EC2CFA0410136711C9D7B0DBEB352A2BE5F7EFECBC25C5 + D2089DDB215B49DD73CEBD616959EFBA201F0FFE319CA8EA4631DEF2C774F133 + E8EA2D8C5A92145D382AE633F3BC4DC480141D273F2992172EE3787C625791CA + DAC6380266589A79CBC1663220DAC3D3C2B2F7F56CDF5894DE243832D7DAF228 + 0AB6F1A11A867DCEB98AA191A07B18331374DAD9CFC44A8C257BD61ADDCCCAFE + 75AB380D00793F2F45476762A3000F7E7E2C4F2590E23CC791178A9C1DB0B1DD + DD9E60B7A1E5C7D4FD68707E8F508A69D3DB19BFCE1C05CA88C601EDC62AACD7 + FD32E75669F6A83338F852E85F2CD6C7E8D42D3F1BD4CE1E706599E0035C7A65 + 61A5D2E3248A4670099A9FB399D3F595F96F1AEC78D2EAD95502F920C74B5DD4 + 64EB4645B4D269EFE40201064F461BF018C3A322E26172B66D8D4670C77BA741 + 56F5C6EF7A28DE74F7F1C3A9F4EAA43A105CD9395A33110C1142CB6ACF5DE8D9 + DD8203D0ADEA0F839CE51261AC326E3404149D4B5AB9DAB81B186A866F40E19B + 61B2B8C8EF88557638F09653A91854152E5D79D3BF42CF421A4950674D60DFDF + 073042D4D7B5B8A334659FFFC107199415C4A967B51145F8AA8A75DD003FFF01 + 17E175C69D6E15DBD1A91291134DADC1E359C4783DB70C510E223993C5128B5D + AF5EB90D01D383ECEC8ECC58B36BC770054FFC6227C1205B8749121E6D523524 + 7E599D4BC77B64064F8CDDDFAF7A4E7FD542AFBDE2476B758D465DC0E33071D9 + 879CF8E886A4A7C7F5155DCBD4094A2A3C77072CEE2F9AAD3C134B16C08AFFDF + E3BDC6423956ACDD00BB9A5E2A368F1D38515462DBFC6E1AFB66E8B14701738D + BE402B53EE158082940951A430B5C2B66CA56B59793F28BBB778E1F8125E7ECC + CB22A580E2D4CABF884388DDBF136901272952AFF3822CA43312F097922E1DE3 + B678789F880E3B72ADAB92C724EC3E3C35E893B8DB006D53CBB0FFC0D6DE1A9E + 8E88BA93B087CF382CE52BDF0BC80EBA704481E5C00E38007689D658210674B6 + F8B3937958C9C0F2309095F7C618D532C5E4A6CEAE3F12C9308C63516F15C656 + 6413EA12ADEDBBF9632F5517C58628DBCF2A07D600CCEC42A194B276866C8A62 + 84284829D5F9E8B3FBC3CC2034D21F7DA3E989F366717BB1306B288F0D1A2B55 + 29F915976E635433F8FA8A6FFED3A155AD592DA9B0E3169992D6A8D2227A4713 + EAB2A34366ABA2381EB8EB55A0EE52D17AE9C15612ECA3F522CD2DA66D970DC6 + 9ECCB4507395306894F6388BBE4B435A2969D4DB3EE56E38C0A820CDCA9C7258 + 1F692709C2BE0CAE40B9D647B7BBA8D76BA3AFF94870798BBA7F47CB4993CEC2 + 6D89A55A1084DC14CBD7CABE9B562B31050857FA1D1FDDD5E97BA8ED51A883BF + 2B50F5456DDA8C6C6A3343C87F2FB09127220AF5F2DF635BEA0EAE94203B97D3 + 6A7A846795785C61A76927EB055110105616991AF777B421C7A6105522326134 + 64C7671E8959A741E0F9821A4C99BB3EB3DE4A981A4F8237AF699CE353A03063 + 20D37A7B23E8B21759AB8C32F09C1AFCF3C339EAA3D1899CB667CA91883F2AFC + 60E7BDEF542B7211EE9041F99B7628E87D8980 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR10 + %!PS-AdobeFont-1.1: CMR10 1.00B + %%CreationDate: 1992 Feb 19 19:54:52 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.00B) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 12 /fi put + dup 44 /comma put + dup 45 /hyphen put + dup 46 /period put + dup 65 /A put + dup 67 /C put + dup 76 /L put + dup 84 /T put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 100 /d put + dup 101 /e put + dup 102 /f put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 107 /k put + dup 108 /l put + dup 109 /m put + dup 110 /n put + dup 111 /o put + dup 112 /p put + dup 114 /r put + dup 115 /s put + dup 116 /t put + dup 117 /u put + dup 118 /v put + dup 119 /w put + dup 121 /y put + readonly def + /FontBBox{-251 -250 1009 969}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4 + 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F + D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0 + 92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C + 295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75 + 409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C + 4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF + 2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E + 0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E + B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008 + 24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B + 43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF + D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575 + 5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC + 96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3 + 7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65 + 0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830 + B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D + AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007 + 97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8 + FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5 + 20759B6A4C4466E2D80EF7C7866BAD06E2A1040FAF2DE1FD6AFD5FD97EAAB614 + 956897A7BC784E9865B00EE8B49B918E886049F1F4939403EADAB83A4D8C332E + 2221AF8F6F4A4954501CB6A6268AC96F7091245F034BD65542DF47BC7BBAD667 + 1EE6AF9187E298CB7AABA58E3FB5B4C7E86616C1A830A4A937C265CC28A83EED + 8F3C971D6DF5A50A615B713F5332E0CF05C754FD76916FECE4DB2807334C34E1 + E2418FFF1B4429A564AB857F1E23337C75E729645AED52B51C319F277F0FD789 + C8D5F56EE75D274F2162F53AA09B150479161D8B2F5FDCEA0020FDC7A51E4AB0 + 041A3247EB7E667B2842D65A5E184D7383D4B7034808F6E4E32CEF72DFAD9C60 + 730CDB6C87A6D571108A5969895654C00A5F30A5F801DB459733371B4B292AD4 + 367DDC8671EC48E447C84A11C0CD332175E5278EA0678603F85C0F3013AEB1B2 + AADDB2337DB914580A9547B6CDB7F4CCD34EAF4555F34F8023B15D44707987E8 + E672F486552480FFE3D56EF1EC01FC6D89CDDD2FD96D9E404038CB57A8018789 + 80B52AFEE8453D49DBB6803FD753A9E426992ED6BC8BEFEEAD4C4AF3438178B0 + 28CA1BC3EEFB3E577C48B5548AF39280B578C57F15D490AD2A1F44086CC607A3 + C6D949B40B3A0B8C69D1FE3312433EB870B0224ADEB890A1F91618595AB6D1F8 + 3CE05BFCE07CD6D6217E179578AAA193C571717B4FA7C39135FA6AF8A37E66A2 + 23AD7465B8FE68AC6A224CD1B57589498FDC2377DF9A80563021AC68FA849DB2 + C5CB25D2651BC6E69F910C1D7EEC7D07BA988D1F42E5DB285D218CE09359E378 + 1298FB5E27FFB9A1BEE3797F9864877AEE1DFE25B380D2DFC3330A4ABBB38166 + 5AB77EA188861BE3D5CF2E122D404E43E4E25E8938E4BAF2BF8E26A9102AD330 + 1E68CCFADBC48C07DF7899C4AFC426774F1A0BAD6AFDF2E9F54D2F40874801B4 + 4BB8811A921F540589EA7ABF3A210C4F42D3F97C6EE56522D30CF69D79DA9E03 + B02F842F1C33C5AD9CD2FEC1D39CBB99D46FC06CCBF858A7F49F5081F1FE0DC6 + 176584227E9165DA6B799DD6A3FC970C6FF1A28D3EA96ACC8994A395EA7F1A0F + BA8E217CDBFAD61CC2A8C80A9ED14A027B59CB9A0F4115D7DABAD25BA46B4A78 + 6F7366B3F761DE28689BD1B5D3C5F6E15F37C80E22544DB907BB47E6B700F7BA + B45AAB772AD411097FAFBA60B4D58E706E4FF1BF4950ACC82C9F823E55277F27 + 9CC71C8C4BF533A0890789109D42C5F7386DC72DF4A4C75B722142050FBD77FC + 29CC7333B96B5F4727160E8EC16CD5F3329678A6FBB32F32A5F475F9A9FE2CF9 + E66734A16FDB148BC3CAF746006CD8754EA7DE2800ECCDED9D7AB50E603A6D34 + 8312CF2381A83701459703EDC1997945B71BAAF6F7CB7B9F375FC6986592922D + 95E19ACD91A868E588503E8F2E1089A52FCFE2D6B31C71D543AFAA541A98E666 + 2E477B00A4A14AC54F71EA2AC32310E0C262BAD2ADAD0679BC48AB1E20C16AFC + BD7DD5A0A0F4D5B3A0FC5D725990B7A81B9401066D1153018A625409760F278B + B4577C5930CB6AF43923F6BB7883EED264DD5DD39165BA81DD7DC2956E31E39A + FE0645143A805C6E8CB768D28E20A31D10280289CF1DCE711E4E3F3D9B386D20 + C12145D42C7CD0E993DE8C2160DACCBAFBE5BF2EE5D9D9502BE60F9B1F51530C + 1A82FF429FB58DB740F2216747664D5FEC2EBE7225B9B07E5208D2A4E79E68CD + B8DAB60CD03C9C15A6C4C0BE4FAA01BDC06AC69C82503B14C2D5A0F4E04D9F28 + 75ACDE0302C25159847CB9F8ADFC0BDB56A06AC6943F8AFEB07673BA05689F45 + 968F8C1554BFCD88AA852522BE6A2A171CD69CC15E89304A97B6E2875890DAF0 + F2178F0F8C7CE776C59FE5B9E8A8E2E64089F346B2BEDE69F0C0A7E15FC4F4CB + 17B4FA9947BF627EDE250A4F6B9D8EC7818092708FA80555A88EB0FD1AFD89BD + A675F08BDD3F8F006D490C3F5CABB1442F7B527DEBC199E52C94E501021A9563 + 8CD1113DC1465ED58ED3C66A78D419E1772C5AED50498429A57094A74492D089 + D897F03C64BFA269642A348FDB3C0160F065CE9493FE979C1B27AB5014B96234 + 822C84B723561F243537BA4CF06420053F7C855B61BEA0F6F6230991BEF54D78 + A7DF8363A3F62E9D49C209A43AAA2AFF2E73F2C32E0A097B335DCDA71D2F9F85 + 29203FA8B81AB927A9349F63A6C45E0B73D743CA86DF515962F21EC208F954AE + CAC23982C247C10314D07C7D7235DA5F9570BF640233E9B2BCB534EC6CEDAA6A + 5E0B636194F6C7733CC72CDEBA558476410AA6BCC4015F6F76A6D9D012432ABD + B922EA46170A17A575ED9EDD178B9B3A6D5C95B415DCFB27965E7941C2A34FD8 + CB181D426B4268D715706861879A3B09111AC8A6193A1BF305FFC1901D36D001 + 7020942DE8162AF81EAF5CC16EF86B9EBCD9CDEF39A8A802A93E22170B8D9E01 + ADBB97A6F0F0D9043E6577424FCB4F36DD0D6F1371C2D8D902ABF52BDBA0F800 + 058B077351402B2C80FCD1D997F21A3BB6F90CA1B0F658EC34165D628FA5A2A5 + 38E590DF8AAB1860B46831377501A06AE1F2AD48F09A5303918F05A9FB387153 + 7FB55D56AE4B14D930675741B072679D6E4DEF8193C75111312F602E3C8687E4 + F639D8076F6D22B23D97A7E6E231B9B6921BDA3FAE4C4A510C1F95C9C303307E + 6DD5D2485BE8E85D23B6AF0C0E948A9A3803A7D2F385F5C6E9D73F6DFA46F21F + 5E1A9357F46C39F17CBA6325D9B4E614693A2D6AEE3B21AC6FFD85FE51124FB8 + B0A13A95B18DD49497D899F46CD0CB4AE8094E78EEB3C932B3B81488F5BC2983 + 8DC1A4E6B4D1FDB26018AA4682EA4A6F330DF7720C9C81EB96EE7FFA4BA5B990 + BFE8DB107BDA2D2614405AC6B86E801176FECAF2F10E56119A4FAF11AF7BC210 + 4EED3E898B6B272005772590090CC129385C59B2C43F12BD09C47C4F0FFFF7C0 + 53F64F131E8009BBEE67BE3DC2A6161D255A80F0A4FF8E00A43E6FD654F1FCBA + 3059932243BE4EE0199B397569EC419C127B16BE6A48FF5037FE83F5934AD0C6 + 5E3CCE6C5AAE64DC3889929573C2EF99E08C04011E95E3D6CF214335D8A4E70B + B1E63C4B2B928597675F41419CE2C94BD8D7BA3A7E3FAE3710308F6583A1AD32 + 49FA3269D105421D3AA7C55AC5B2F85A218F620C537EFE334CBE0BF7C6C73A19 + 9E6C2EBD77303FD504BDBCC48E9D781C04CB602A0E8ADD0510C9B86856E55FF4 + BAF5355EFF583168A24BCAB83E5A0D64D5A190BCB15D41C3BE17B699E044E834 + 99D3759ABCC7A892E168BCBA4B3FAB3C9A5FD73BC232D856390E32B9F1752575 + C74DCA2C2897F12F0F4656A84F0432C804FA67A432FD928D8A58376B3811E194 + 4121561D82AB8D8E972A4FFC864B5D1F8B898B1DBDA081E98056F19CA3D6E2D8 + 225C975887D736D7FFBCD65CDA789AC1FBFD8B22B2E6950DAF8BE38C8E55DBD5 + EE9A67B3464AB53F305ADDE4AB8F6704659AA70CEC6B3B88DAC393C4D978232F + 9E013CFCE1ADF4A1330256B6EA6EAA01DD23318F706323DB25F426B95D77216D + 74CF17E039F2A692EFAB8A0917D4B13F9F668FA7C4BD6149A5163FB4296994F8 + D491122436D5D57F067DD6EEA6B5535EDCBC4273CB0AFB0DA38C9D9F2AF1CEF3 + CBCB2DCE6A12E646F76FDE18F6387CA59422DF7DEFE0F9280562AF06989BCBF4 + 10B69988DB4F5DB5BE9B971952FA42B3078CA48AF2D5AFE9CAB55A97911FFFA8 + 9A4FD1919A6CE6FF1141D86DAAF4DFBBC627B33FE2DFCC8541E31A38C4609CFA + EACF1272B625DD08D7599FADC7083307C56C407E85EF843F9EDBD62323919464 + F648F96D855834984BAF25326D59BEED50C27BB6D04FD9E6ACE107EDF3F09152 + 6947E15CF71789EDCF7B03AA905B84BCD5892E18AFDEBBCE3E75699B138D7847 + 1E95BA6130960B10A4B5CBCCDFAB71843D12D5B909254959A23A42789F27FCE0 + 1894D6D44D16631A0F317C146D1C4D337B7735408DB42A6E35E65FB035E2971B + 3ED4804BA7CCFEB4167BB468F16EB3772295CA8EF9D1681D7950CE55FFE8E1F2 + 0C6EF4838D119497D25D3A54640C99D5451F2DB31ACF34FE5A5E2AFF75199671 + 8BC45D932D8A747B50425706FC6C76D00FAA1149607343157B511E2F463B83B3 + 25638C26C169A991F31462A274C263D7E608F21308737759F2271DD1BFCCCA9A + 34FA4E40A75B08D239E5AA13E3C67F57DC22351300AB1E6F5BA15D3C89752AFA + AB4A89E335D39752122477C4FB56988E8F792F2D8A3622DDCC01F592D1142CE8 + 2021CCA09465F0F41299CF3B8D258A0E1488953B18B3DF731A2D06B0165B6843 + 71C6C8B65908CE53B4106298652EE0D378B620FCABE70BC5E048C6118656EDB3 + 260C6455850FC332DD1301E8455B42828FFEB9F1FECAADAEB0E1020338A8DA30 + 8604FE055AF8EB6F923BFFDDEF5A2ADFDC26FC3876F6A96AA623B54EF7CA74A2 + EBE338D0157242A02DE8C4F853969F824EDEE32D7A7FFAB23CD89567CDE1E484 + B6F93AFDD1D46E44DD09851E6E7737F2B4AEBC000D7B33510FED6EDE1D324DBC + EE614150B77BE0956D6F3999946F7CE64505E4462146B85BB530E7BBAD82F1E2 + C8B0427C2BDB62640E2FA47B26E880390EDDE834B614F92C0153CFAE2EC1D21F + 5CFAFA0F4F725F2DFCAAD5BD2A73727E977E54E3690C654BDABCBCC8DE116429 + 4B4B477AAA08E4D5845101B0F7D0BEA7B465B6062EE8A8ADDB93B62480887431 + B546BF3AB12389E543CAFF47695FF1BE241F832E45FFD2349E8D39B75F7EF95E + AFF7F3694325EA57F8938241856002704ED09DC3B0E983E72F514BD96DE5A09E + 1316ACE95A495AC3C893128B8D01707940C1560C23F7C3599AD859C6058D59DB + D17CAB26D9EEE8824CB90DA6456382CF48CEB3C7939E69BA1F121F76E8E47522 + 391F936D1A9569D1F4097B1546BC1CAD7CB1D6E60F7D78662CBBFAEAAEFC285A + 4CD9262E659DA0AF53D476B80F802EB99CE982C85A0FBC5CF4B216D9BC542D0F + 25C25841CA586989B3016CD088677F115C6029247D95EC74ECA05F2E27F321EB + D65756A381DC8B0442F957EC4C801F3455B63E819D337538D1E51EBD9F2EBEBE + A3796729B6595F8F29EE446D054A6220805E2DA79C45C2956E5E873309D6A77C + 355152731F5BD4F433DF82F932B4EA30C6FC0BBCE7DF13688A52C766F6C6470E + E97350C11419F16EEA07EBBAB6F310B5B420C48E9DA728341C8BD22282B4FA79 + 85565EEFF206CB5241CD079E14AA4DE1F34ABB8119BAD0D243CE40199917CCB2 + 3F7B724D63D049CBD37FD584A51EF7E53A3297E5F9A8DBA58CFB6746E258BCDE + 736FC713DCCD72DA48C10C8AD3AE303A4E6E9A29015859716797D91966EFB182 + 956646EF105813B5C2D4EB2B043487C74FD81A959F64044D600F9B3D929E6CB4 + 88D253E29BC3F5C36479BD7BD13902FA803471C7FFADF55DF0553C8805B0096B + D35AA468585EE5D21988145E0BA84882C0A84E3DB3AECB7EFF802842B63DD28F + 783B7197C2D70C037482B93BB4177696CAD35EAC803FF86C752D773655CB83FA + 99549EAFDC36827AD73A1031C46A8046BAB228D0F867BC33ADA72A3B76CD0B72 + D94C5E0C16A84E503823920009C055C3D2889C2145300587C51277D55F545D76 + 5DA03A17AC572E0954914B483350FF531BD77502787E1FE3473D6222C37E1446 + 941C3181C6DE6E7CA2892E977098760A0C3CCCB70C6E7D6C99231778CFCEC8B6 + 8FDB6D70786209C78BF9B44FA7E3E297A797515D8B7EF5A15DE317C98D652836 + 3CF417CCE42F6F7F6C50C352FAA2838246B8DDCB296722EE047A1687B9287ECB + 1F1639C79243476DEF2CF2D3316EAE043DC458FA958C4036F5B8C6D155135DBE + 35EB8F3AAB63F6A045305B79451E0640610A274B4732CA5CD77F64F8D9378445 + 5D4E0B4B7129D05D6D84027DFCB5E173BEEC3AFFF7557A743E2B1D53CDA9B830 + F67022AEAEB60BAD78DB4393BE5436BBEC0214E19E38935EE95E17D25950B80D + AFFEEE14FFDA2377802B0ADAB8680190E91C48BFC367CC8B7C279B1579E58978 + BEA7B519637C5E1538AA41327EF6B16E2D788A6E3763D21EE46CAE455E2AACC1 + CA6459610AEA736646CAFF7C9DF484ACAD28D0C07BF74725261E7DF7A43AB4E5 + BEAE90BB3393DBE5A0F66D0D72A1EF4189B280157AD6BD25163E40C65B4D9DE0 + C69480842AD55F6E4C81713DFEF7BD54A8824680B549AE971F5849A62CF496F4 + 27AD0003427BA68FBD3B1249ACC47EDCE42941ED2F7284F0CA723F079F055FF0 + 5496474F09BF91A50D606691A155D122EDD41A612386D09171B36092EAA5AA98 + 994C826BF335F59C6186DB7EED2DC45070B1686EAE2236C7CB62F533C8948CE7 + 296043810FED86D93462FBDEBDB7C94AEA44DBA52225BBD1B7CBDC1B377C2424 + 8754F837D9A1861C0981A27A7D1BB664DC495AD95C3FE9384715C65A49358A8B + 6963D8A6D148B3C9DB61C2D00535E2DD735A698CC269AACEE5C0CDA8D5705401 + 782279FB88673726599C3ABEE28B947F1CF558B99AE80BB580F330C7203C4EC5 + 6DF3E7630C012B8565E5A56E038261C8BA7BE5109EF6EB7351F14139E97344C2 + B1D256F51DBBD6F104D404175A372B055250D6B16F8B1E33B8ACEC05F55E9540 + 24FF7A890F05EB86D38B144DB86C27B56B46172EFE0A0DAB6BA64CFA90D46EC2 + A403A2BB455ECD1AE6BE832C88CDA1CC51A1F38FB0366F0B843F4F67D7758F3F + 1D020BB9FB3AB71A5AF4DA742B94BE57B6BCA1406EEFA087C872470B249E9E7D + 517CDC51A82ECB9A3748B661931B3D65E2BC8A378B3B74C9E80FF70CE0ADDB42 + 3B17AA1F1890763C3DEAEEE9C83B2DBA545E01968BA00B8B388C435796A37132 + C484CC148D216800F67C1970D6C14F12EBFE842D32B148D39E06FC176C4FD21A + E44F2AEEA1F6E06C0A9D8C06C1DFA627A24BD35BA7B68BBEDDB25B0014EEA33B + 045A0B85BEF4325432DBF0AB714834A8EB1B4F94C33B7C9DA73F7ED9605B6164 + 77762DDE94338BA9F5CFE99168CD0EA2D836522E6769F73A104D9622CB3F18AB + 545BC876653811F4613B6B528B7BAD7F232A5320FEB2D9185D4DBBA47DE847FD + 3A0F19BAF289104348F90F6A82794737C45E9438E21D1CC620324A21C400C42B + 677404BE528F68846E4C89675CBB76F6FD20FF0A593931473FD021BA78089F3B + CEB657595322E89E066242458E9C3CE6E6DC54F632FB4B8719C429AB6B76409B + 93EDF64B58BA7D83BE1D21367D861DDC41DBCA7E5E7A8AFCCE26C1659FD58C96 + C493C613440492426A3AF5597CFDD817541D03D4A6D88BACB632D39AC3AA19EF + AECE2D29D81A0393F2A97A6992797805DE65A19E2B65AD7F72E7A9A5F88F117F + 437D1B9BDF95625E1E76C8B7EC7B94DD53DFB66FA51549EB6685477E5BD081B5 + 49AB3BECAD5CB3D4DD4B56340E23735067DE383289C1720290680D1F77598B6B + 378FFA5ABBB5A87A4D22085564F8616913BB7E07521B67C9FC268FE3228CA49C + F26B92C4F433B78DD44C8CB4F0423EF5BC481C44AA8FA15280875E3B2B7A0052 + 1E36E5C84BD6B09752FE7FB8F94D66FF16A76B04FC65754B3C9710CA5FF23F7B + CCF33A76DF9690E8C90417E8FD99C39D773F4EC5B5442D8D43D97373E6982672 + FAA56E997D74F328EEBBA0A29BC7DC28FEE02C48A180D60716F979F354B42928 + AB03E1AD54A63461EA2200685F6AFA28A005530A4C1FFFA94DCDE5C3C83FFFAA + 3EEAB024CD5F14BF27C61AD944B5947C22A3CD862D6C1FCA4C98E37BE07B1E3A + E47113020469B2B481F063099D74403CE20423739D8586D619696023F507F607 + E6B3667A9796831D20B2F18ACABD25E724B8CC440673F79A457837B1EA4484DF + 092BEBCD74E473D955394F3FCD0C8D18E12863D1555B4D84596AB9C5ADDDF927 + 65FB3500FA7D375DA07F4333ABE05B69CB603C4CA84B81102ABA52D45D1BDB04 + A638BCE4E0D6BD2FA2E857742BE0F412595B3DC66CFD14E49481666A3286688F + 1ADD11AEA63DFD245BB52003B978C29518895804ADBF546E8AC43957EA50838A + EFF79ADF78EA9199A8DEE8713DE4B28AF51842FBF6C2048D1239D68FAE3351ED + E3BDA8E9FF4AA952F7A9820BE3ABC3300D7037 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMBX10 + %!PS-AdobeFont-1.1: CMBX10 1.00B + %%CreationDate: 1992 Feb 19 19:54:06 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.00B) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMBX10) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Bold) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMBX10 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 65 /A put + dup 97 /a put + dup 98 /b put + dup 99 /c put + dup 114 /r put + dup 115 /s put + dup 116 /t put + readonly def + /FontBBox{-301 -250 1164 946}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82 + 7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378 + 77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18 + 2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91 + FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F + DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68 + 7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4 + 9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176 + CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D + 6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6 + E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E + 8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E + 3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99 + EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4 + 0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9 + 4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209608D3976637A + DB9C73EB3A28623DF758C25574D740385B2C3D10086AEB904A33DD76DA2CC4BF + 7E37F9117E9D81D3EFDA12D5BDF0067450C5A8A53959C055C5D6087F1FE6FB5D + 8306F16FAD71AB986320F1229440C63ACB5FA24E41CFEB12C2BEA2C25E59A3F9 + 6CA5B7A04B57F2471D36F5B41E6363DCEFF2DFFE9131F044125884739392333E + 15418156EEE8DE92EF4C176742032FE8889839755D8D821CD7F8FAAF8A22C283 + 19F79216C6D454A864898EE9F830DB5F3372B8F47C464DF19C69ACB3BC0566E2 + F25E7FF148B2CDA2B90CB5884440F464CD57295728A4415963CC1BC0635BBEF4 + E812CA5E0E788035873D05616F7B0F6A30D36BB285E7955CFD860345F16D952A + BF2F7D2702DB352D0874442B2074859EB49313BC27E1067D627362649D82A5C3 + A57DC5041B1A13FD2FA89D875019E23C31650A25CBEEC6B93C575C363FAE2164 + 76ACBDCDFEFC8B7BD24AF41D55196DF6FB2F28DF88349947B448513C7E832EB9 + F35B28EF86C231336351C1F89AA9AB1F8C02D0DC35746E97C2B29B7A44CF7418 + 89DAE02563F58C453F45C231219FC9727D5D477B256530D4492AE7E4E3CBA90F + 50E8BAF9435EBFDF819DA9EE1F6F67A0D65D35E3D0EF63274B611B25756461D2 + BFEEF8BFD513B0380993B8D52A6546D69773D67A15C059E6A89CAA2772162509 + 3B054860006DEA20685F5E2937C95B50D07C6316ABC08495EF319B36F8E48FD0 + DA482F82D2D981C70ADA2E467608364EC664D151BCE2FDF571BA63FC926CCD72 + 052D4F83933A9585C0E033CE579227FB5BE2D58E048044B5BB6869ADFC2E03C7 + AC062D709CC07D8E4377D75506A96CEC17A90E1FBEF6E3778DE10A910F346C4E + D33D753F6EC32D638BBDACC51CF22379D24C2A0780333AB3CB5A612C14381B3F + B7E42E841B123CBBBA6C33C080F9C6D370A91F29A4CA724B9809042BE9B2EDEA + 366C4D17F80C7923C9DFEB1C184DA0C0396BB3AE8446D1FDD7C76397076DDEAF + 4FB188394902EAC1B9126016723FBAAD27AD91C44C28F1D579989D8C3B5D6AD1 + 1647504F2F6C38F1786DB3C9DE2BD6CA02D74451FDF6161DCD51706D62B383E1 + A1E9F0D97F9579FFDC844710C4D9EEBC5F048B0811B8F3BF2BBA45C9A57E7B27 + 48BD0F25113B884DA2D1596E14FCC7FE2B528806F4D61BB6A6D34E85AFF5193F + 7B396AE95ECAD67587C51633CB0F12327BB56E36C5E7EFF9437D80C2B337A480 + 3EAD6F51E3475A8638B233545B633EABEA2EA89D7CD3A073FD32A1C5DFEE4ED7 + 402DCC2E2CC4AC399619B272A5456E735F1044685EF0EC8BA6C242D5A029204C + 6E32D78226FC39E9222F7AD77F162827808F98CEB740B798BAAA7BB865A33D74 + 7F9BA33CFF09800B9AA6510B69D56879E622C0DA900ACDC80ABF49DA8FF037C1 + 10E4895F9E7F4B8246CBD2FD28AC913D3B0147C581341EA56830AF49D0B7687E + 80D121A40423228D29D5F22A9F22913FBA87B15F41432F959BEED884DB1C93B6 + 7DE4552BBFFE84C9E2360683DCB43C0E681F0945108743BB6575CB7309C24A67 + 2425339DD052C60EC1078B0A616A27ABEE7E2497AF4828C7BDB575A58B6030FC + 0E85DE84DC7582B90A52A3B92603D9E4B7783927AA86E4852AD73A6778EEDCC3 + 247CBB6E1BBB86C623C32AE9423CFE9CF0B18120586C175EBC48D9316EA60EB1 + A5E3FEC32F161EDCF932F4AF7AA246C3BFE8FF0D713C6DEB68D4C6E4CC875527 + 05C9DD26AA09E678D71CAE88708E18524FE4BBFF93985D4914C4130240161786 + 3EA170867A7B84C2AF727C6395F693149205B4B08CF2FFECAF913AADF8E8FEEE + 009D99E3CDD6E87EDD3650E37BED4BAB4FC0E7D6492BCBCC5B7BE50E721FCAE9 + AD4184AC780A88FDE9227023DBC0D60D47A1307331CDE967B5384758D67D68AC + DFE77637CED76810EEBDBFF5BE7B3E72DDDE5EDAFC0C112D9DC105949B9AF343 + F60AC374F17A4C35B1BAC99AF1E897F4E0931B574B69348D42329BA8486541D9 + 8977C18C5919612C1194CC0DBAD03A2514456D0A9B60E0850B082B1E3EAD85F5 + F7F7A0E88EE7C3A54718759E4791CD9E8E0F659CF2223314F0D423151ADA8AB0 + A37AC3679F0B449A6B891111F80B5F656F1B639BA1733E612F2BC61EB2FC561D + 7F570755DA4BC31BDB57069853A329F96DB79B0BC62EC34CDDDE440F89F72B5A + 01084E5E358380A85E0DD49CE5EB0D2D854B7A5808CDFD7D0D6EE65BFAA92397 + 537A2A18D8D9062206FA378BACF63A2AB05E06803F242F7F0D44B7D9ED0E8B7D + 0E38326A92527306BFE035911B407F4E52A3C036BB4BE3F3ADB9381AA6A9148B + BE42436D9C6BB6367C54B5B8723F6D6A313FB1C020C34A3DA5200227E2EEDEDF + 50E0EA92CD11E476448AEAFAE287D1AB2FCB2288515A49A7AA6C177E404E094F + 4FBADD50A28D9EC02BA53198A90DFA1B0A32540587368812EE69E5CE2A3DE4DA + 7EE49D0124C490096FFECBE1C84E657C31CAF3F935AA5568833661EDCF12D007 + 8EA634F61DF6FCDD443EA994B595F6D273BEEE694BAF1B63BE00D2815DF3B09A + 51650B9103C36B83967C7D53A1B272CD0221BC568868B41827EC6104520C4EAC + 5C52FA8D40709369FB0B16C6671F636F0B7F0136E077665F380A81FB02EFAED1 + 69BCDCA9B8B18883475AC4CE73455A5892E90D0FA359B778A55BD835DCEE1082 + 880E07028E61A7217C1CF8349AAD2B2BCF68C59E74DFA32AAA40824BC9478FB6 + B30E20BEE58CA400C9E8F89E875D6B2B358A6C916BE058F33D363537E1243FF3 + 11F1BDB339D9413911FABEFDDA7CA25C7B769360B335953B1186EE2430243F1B + 511B6B1F4016A98F4E56E58F7F0F6B945C59AE0FFA3706A4BC08B9905BB78E70 + 0DDA17F6BC111D17A1883E5F47846B37075745C761F5CB638C7871B2ACD35FDB + 004738456B5FEF221F047117E1102EDA7714040C1A1C489F09D31F312438414A + 87BB04D6149166DA0C8718D00C3D7C9B8BBF0CB99DDB32C4B1F7F62F2D9D97EA + A248CF577B9A47EE40028B51D637AD + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + %%BeginFont: CMR17 + %!PS-AdobeFont-1.1: CMR17 1.0 + %%CreationDate: 1991 Aug 20 16:38:24 + % Copyright (C) 1997 American Mathematical Society. All Rights Reserved. + 11 dict begin + /FontInfo 7 dict dup begin + /version (1.0) readonly def + /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def + /FullName (CMR17) readonly def + /FamilyName (Computer Modern) readonly def + /Weight (Medium) readonly def + /ItalicAngle 0 def + /isFixedPitch false def + end readonly def + /FontName /CMR17 def + /PaintType 0 def + /FontType 1 def + /FontMatrix [0.001 0 0 0.001 0 0] readonly def + /Encoding 256 array + 0 1 255 {1 index exch /.notdef put} for + dup 58 /colon put + dup 67 /C put + dup 80 /P put + dup 83 /S put + dup 97 /a put + dup 99 /c put + dup 101 /e put + dup 103 /g put + dup 104 /h put + dup 105 /i put + dup 107 /k put + dup 109 /m put + dup 111 /o put + dup 114 /r put + dup 116 /t put + readonly def + /FontBBox{-33 -250 945 749}readonly def + currentdict end + currentfile eexec + D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891 + 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171 + 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F + D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758 + 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8 + 2BDBF16FBC7512FAA308A093FE5F075EA0A10A15B0ED05D5039DA41B32B16E95 + A3CE9725A429B35BAD796912FC328E3A28F96FCADA20A598E247755E7E7FF801 + BDB00E9B9B086BDBE6EDCF841A3EAFC6F5284FED3C634085BA4EE0FC6A026E96 + 96D55575481B007BF93CA452EE3F71D83FAAB3D9DEDD2A8F96C5840EAE5BE5DC + 9322E81DFF5E250DEB386E12A49FC9FBF9B4C25C3283F3CEA74B8278A1B09DA7 + E9AE4FBAAF23EDF5A3E07D39385D521547C3AAAB8EB70549756EBA8EF445AF4A + 497CA924ACCC3DD5456F8E2C7E36946A5BF14E2E959895F7C94F49137256BE46 + 4A238684D52792234869EAE1A6D8ADF4E138B79472D2A90A6CA99E2394CC20CD + 3841733046175B20CEBE372327BF13428EED6A3E2FDF84C2DBA4B0AD584EE9DF + B51828D3B8F385846158C29C9AC3496CB9692DD10219697B2ED4D425C3957FD8 + C4600D76E045C561216EF05D38177243C314877A69A1C22E3BEC611A2EE5A216 + 9B7C264CF6D1839DBBD78A40610F2C0D7C2FE09FFA9822FF55035AD52546970F + 83EED2D30EABB1F303091EBC11A5379B12BB3F405E371519A53EA9D66174ED25 + A2E55463EC71A97BE4C04B39E68112956117C8252DB6FB14AB64534B4BCD568B + 246DB833982B38CDE7268BBF74B6B0C18091E1B1F87D32D66F4DD023D1F10D2A + 7736A960F72AC01F733A11023832CD68FB6288A5977743F781214D8FA9C0C3F7 + 80001321D4397771F728FD9EE57CFE7D9192B887EC883EB1505068261DC40089 + 7B7D2820F06515CD74513521F6397FEAB3AD3572D9A8269430E407E357422461 + 1785FC2782047F4C0339D79B16862D939F3A37F78E4E2174E4FBF132539CB760 + 207999FF86F6A3EBE48EB0A1CA635450FDEEF79EB16D853F3BF4B41B05588453 + D4417AEA07EB3348CA1A966A79C33123B0F93E7D01E200BFCED9C60B86F7D131 + D6350A63AF4505C4A60F0FA4F4B8BD56047A3269F1E8A3CF1F675BE52929E17C + E33E66DE59E5ABAA4B85D3B2F1040F95CE7C290EDE34C96130ED331FE9C276A5 + 30342712664E23C2957E172EA090368B31C782760015B314AADAEEC9DFB8A1C1 + 38BF7F6D44AEA35D9CD1FF642C01F7E36A8E85E119D3B44D7078AF65FB1C9417 + 97FA59214C1B346493EC85AC39A8ABDA36D48EBF0E920C283D261DFE5E1BBFFB + B2A7B1A8D2C722BAAF41F9B03F0A69F157E261DE67BA6F1C4A8DB980E43E2CBE + 598BA5DEFCBEBF5836D823FC66BC83BDCED6D1F69615F55CD3930E2E2BD49BCA + 63E4F83F4F448C13AAF18B01AB6F0817A56307AB1D4912AE9B327457A0EBADDA + CA9B2AFC8917FBD7B1FCB1BA4572BC44FDB52819F721DFC90835801DB7442B60 + DB89245CD0859D798980CE37724FCE60F4696001405CF63963B4E76E65F3D1BD + 00D175E7C8669864185E8906B76E9A3EFE5CF097325CF5D264F4381172964F14 + 558DD5053FA13183276D51D9D01BDDF0880B6CD696486972984FE13693A3EE12 + 562B523713E95C5A9D9B4716825F3D5C8A61297E96D11BAC1FB1D1BAACA485CF + 3ECA8BA2D261A7D156D262349F2AB39554C19BA60A118F5E5D98EBB58F4E76C1 + 3ABA32A58C25CE3DFD46990C8E1CC36D4B0FD11D9E9E927DE9A02986C1BA0020 + F5215A5C7A7308085DC9735F76E4F09CC8DD0AA0552A76C575E4A145F672F564 + F8C05D189FC03B4509532FB68CACF0ABB6AC6CEFA910C4E10B77806F14A7A417 + 49960F50544CA0886F2E56EE9A04D3C9C2C1A6C945E6319E51C9C7C664B901DA + 273BF9E9A1951B966F46B9B4577673786FF3D3D283F49698FDBB84A88BB68A71 + 13E9B78BFF2729F7588F7F0DB608B76F0295EC3FF8D2EF5CCFF0C07B01DEB053 + D414A9B8C735FA860C13547A7B349106145EBA5FC0BDFABFA0E0466CA475A3B7 + 0BAACD44D7C33EE374905D9CABD070410A01EF50203243ABA5789AA7FD3F05D4 + C2015F7C19EAED2B392D7280BF66F8628BE5342914B2C1C189120218207F495E + 53AD7386900F68065741BD18577B82F392E3C83D53F946A984CD17A183332C97 + 37686DF148050857B775B2F0C8F3D0D3A95895E3AF422C918C5A3FB203AC2DF5 + CEC07644C0A70F877D132E274E4D8B964D3FAAAA653CEFCECA95D92F2A811227 + 8C8CC38E09A54B064946CABB2E97D30D8CDE91570DBA6FAC49D4B4623A27F170 + 987A29FE287B805589183279D3768860054C7E4B1AC9AE2E0C3F211275B57922 + D954F391CF4BDCA91A8021AD21D1D2FB341C5EC6405B4B098F3CE57A506DE9AD + AA925745A318DDCD5EA6966E355C34434F9E8D9F6D0DFC1640294E13BE8AC5D5 + 7FDA13EDA62AD70E898328D80EB3CEF977B9D71B43B68B07C62DF965E90E81D7 + DF74D7D652609C08070DC555681BC1E581F18E4FC9C23A5737BA2F0D8E18DE56 + 1870B21F67B6F07DD0525AD2A82FDAE846462C97727D135DB7FEBCBABBA3806E + 9DCE6320867C270D69686C5B99DFE40B99FC4E34B6D4DEAC3B85A9A58779AF60 + F576C92CABC9CD4C9B9CDAB45D6EC847DB77B7EB705E2CB76F294972E83ED24F + E6B20A35BC70BC363737992C6691F82A226620D10AA6955E80D9E08E41BB7488 + 4836A16BBEC99CC830491D9CD15B32F64E9C8D96D06A5BC40CE943EE6AE92898 + 7139014BA31765686BE9B71117667F89F2ECEF228FED45F7BEB7C086EA1906E7 + AEBA8D8B04677043F4FCE166118A0FB000340051EE91AF3D11D62E26EEC35333 + CDD62C6694160F316D58DC89697B6705157F1E88828BDEF29DF25E555AB0D906 + C941D1473D1EA64C95EF1CAEEAD494398329763F75A67B89A0C9304AFA25F070 + FBD52F1B2FF2BA76CF33F8214955FAC03204DE75C7FACAE42A6C2EDD9FF270B5 + 254629A1FE3773C82A01F4ED59C2E98367480E3F576D50EFFD540513DC9AB623 + 7F8B7CA6F0B37FF6E8DC04CCED2E9D791D6BE10920A82198877D3D8570A6FAE1 + 577A7079160EB9982A4FD308766DF5E54BBA5E8C2CBFE0C7450D8374B7051B88 + 3B3D6A7E09FFD920EAABE8A7DDBCEA288055057464CFEB57BCCD6E32B2C7E10B + 43105364B25E74637BE25173B674BBC0A5B667D153898833A97A92FD602A0FC6 + D213A995B7EDE1DB439C1193E185A7EFCF3D9736A8A5EA859DC5C2B61804EE22 + 54F097B73E8655633CAEDF547A618F8A79224A8615FD2DDD4EBE0F56C838944C + DB1E8D6055B826069B10152AB6F1C347EF475A5A7F619810B8D05E8ED1F1CFDD + B1B9C2ABE6321D9A85354B6E8AAF553830CFC835B5E590C6EBB42DA6F80F4269 + 79D66614517B99AB55B8B6BED7FFEE4BE00EFC71BFB545745A929A70739E0E82 + 78C5E15DF6DD79457E13202E2A911FC533C90C9E5B6C413CC60B9FEFC77BF45D + 6C531E2549CBA84D62F804B9789AC8D58F8CDFD1DDB6189749BA98DF2BF98E5B + 15AFD57A790227757B40038112117734A9EAF8E53C578ECBD549A4C0E1B879DD + CAE241CCFA974590A226407AE7D8E454B82B471D9AA643351B304BDCB6A0CF44 + 8EBC7FF337DA8BFF54AC346633A13F8D5033CF35C38973BF3858E120BE515190 + C12844834D4CE13515DE76888E4C50236FD1CB3DC96576714FFA8CB8277E77EB + E1A4BA397B7505D4804BBA88446CC32714B1DB113E4A4076DBFDA6D3098F425F + 5FC438C47ABA521FF14749220CC7B711DD0CE8B0A10CAEBD4BBD3306B396F645 + A6BDE21E35D8A7CE0011B8E6F652461F7AC3BE2C51BC453FCFE400550D5EC206 + 64E0426B15DB76D98E5F8F5D0BB1CE3BDAC5706D6347056145ED995997D5A6F3 + 8AAD096B65097C4A7F747A6E7A9F63AC53BB0A46A730E539026270C7F4763720 + 94D3C7D451CEE38F9D85CD36A9E0C89AB31464106235663E1A642BC4DDA68712 + 5F65115B60E6F37FF437CF5F096D85EEFC31C7EEB5A452D4CBF46CE4F0E07E3E + EC63508DF76C165A2736B51C7AE2C4D38872F767E1F06D089053817B06867F1E + C827929D37B8BBD517F0F3831224184D25AF5C841E56D2B8B20CF1C603BA14A4 + BAD17C093217AD77C893AEC5F6FB51568BD640A0C8375AB042EA638F3AD94BB5 + B9FEB2BCEBEFBDFF51B21C6903951BD9E9A1E540F6B3D626FC9D2A4EF8E96236 + A5A190D5277335DABB393F11211C01750390F7103E80F5F0A317A5507AEEE20E + A57A42CA387919A77EB72552E8FFBC161128940D979FD30EA2E7DC46F42C55DF + A710F768DD87055A399AF3832725552E25327BBDE54A63026F571CEF9CD856C2 + 6F06AA22C3B53A7CBFEC9656F0301729E45582C9BC3AB37D8F173E1F4842BAEB + 7343A6EAA5597773209E3549991EA22CE2029890E0DE2F5127A01F183483652E + B65D9643309093E9AB75B25466148F5CCB5B94B9CCDAB0AAE89D36FEF845B6BE + 31666C1392E9F68AB8FD255EEA40892EB61F06A14E48455C3B940DB951B19411 + 62C4B3CD33B7776891DB1E05B532070F8C80DF057AD9C42308E188A1D2F0F9D8 + F5EA5A0625337DAF66F7CBCE69CBE5DA51A0F2E323D54FEEFB1A1AFAEC84CCB8 + 12634EE12962E0C47D2BCEE0787773D2145A6FDC10 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark + %%EndFont + TeXDict begin 40258431 52099146 1000 600 600 (thesis.dvi) + @start /Fa 133[40 47 3[52 32 40 41 1[50 50 55 80 25 45 + 1[30 50 45 30 45 50 45 45 50 9[97 2[70 55 71 1[66 75 + 72 87 61 2[38 1[75 1[66 74 70 1[72 10[50 1[50 50 50 1[50 + 50 30 35 3[40 40 30 75 38[{}48 99.6264 /CMTI12 rf /Fb + 134[52 4[52 3[52 10[52 101[{}4 99.6264 /CMITT10 rf /Fc + 145[43 110[{}1 66.4176 /CMMI8 rf /Fd 152[50 50 69[100 + 16[50 15[{}4 99.6264 /CMSY10 rf /Fe 205[35 35 5[55 43[{}3 + 66.4176 /CMR8 rf /Ff 134[48 55 9[58 4[33 6[41 51 36[76 + 27 27 27[58 30[{}10 99.6264 /CMMI12 rf /Fg 130[51 51 + 51 1[51 51 51 51 51 51 51 51 51 51 51 51 51 51 51 1[51 + 51 51 51 51 51 51 51 51 1[51 1[51 51 51 2[51 4[51 12[51 + 7[51 51 51 51 51 1[51 1[51 51 51 51 51 51 51 51 51 51 + 51 51 51 51 51 51 51 51 1[51 51 51 33[{}61 99.6264 /CMTT12 + rf /Fh 134[71 1[97 2[52 53 55 1[75 67 75 112 37 71 1[37 + 75 67 1[61 75 60 75 65 10[102 2[75 100 1[92 2[128 81 + 2[50 1[106 85 2[97 96 102 12[67 67 67 67 2[37 46[{}36 + 119.552 /CMBX12 rf /Fi 131[98 49 43 51 51 70 51 54 38 + 38 38 51 54 49 54 81 27 51 30 27 54 49 30 43 54 43 54 + 49 3[27 49 27 3[100 73 73 70 54 72 76 66 76 73 89 61 + 76 50 35 73 77 64 66 75 70 69 73 1[46 3[27 27 49 49 49 + 49 49 49 49 49 49 49 49 27 33 27 76 1[38 38 27 76 81 + 1[81 49 27 12[49 49 4[81 54 54 57 11[{}86 99.6264 /CMR12 + rf /Fj 134[59 2[59 62 44 44 46 1[62 56 62 1[31 59 1[31 + 62 2[51 62 50 1[54 9[116 2[78 1[84 3[88 4[42 2[70 1[86 + 81 10[56 56 56 56 56 56 56 56 49[{}33 99.6264 /CMBX12 + rf /Fk 134[85 2[85 90 63 64 66 2[81 90 1[45 85 1[45 90 + 1[49 74 90 72 1[78 9[167 2[112 1[120 3[126 4[60 2[101 + 2[117 12[81 81 81 81 81 81 49[{}30 143.462 /CMBX12 rf + /Fl 134[48 1[66 48 51 35 36 36 1[51 45 51 76 25 48 1[25 + 51 45 28 40 51 40 51 45 12[66 7[57 8[66 1[68 18[25 30 + 25 31[51 12[{}30 90.9091 /CMR10 rf /Fm 139[41 41 43 14[46 + 58 51 31[79 65[{}7 90.9091 /CMBX10 rf /Fn 134[62 1[85 + 1[65 1[46 3[59 65 1[33 62 1[33 65 2[52 1[52 1[59 18[88 + 1[73 1[60 18[59 59 3[59 1[59 3[33 44[{}21 119.552 /CMR12 + rf /Fo 139[61 1[61 2[79 1[133 1[83 1[43 88 79 1[70 1[70 + 1[79 13[88 2[108 12[115 8[43 58[{}15 172.188 /CMR17 rf + end + %%EndProlog + %%BeginSetup + %%Feature: *Resolution 600dpi + TeXDict begin + %%BeginPaperSize: Letter + letter + %%EndPaperSize + end + %%EndSetup + %%Page: 1 1 + TeXDict begin 1 0 bop 720 951 a Fo(Chec)l(k)l(er:)69 + b(a)52 b(Static)g(Program)g(Chec)l(k)l(er)1486 1246 y + Fn(Nic)m(holas)37 b(Lewyc)m(ky)1620 1479 y(June)i(7,)f(2006)1743 + 1846 y Fm(Abstract)704 2014 y Fl(Automated)48 b(soft)m(w)m(are)h + (analysis)f(is)g(the)g(pro)s(cess)f(of)g(testing)i(program)568 + 2127 y(source)37 b(co)s(de)h(against)g(a)g(set)g(of)f(conditions.)62 + b(These)37 b(ma)m(y)h(b)s(e)f(as)g(simple)g(as)568 2240 + y(v)m(erifying)i(the)g(co)s(ding)g(standards,)h(or)f(as)g(complicated)h + (as)f(new)f(languages)568 2353 y(whic)m(h)30 b(are)h(formally)f(v)m + (eri\014able)i(b)m(y)e(a)h(theorem)f(solv)m(er.)704 2466 + y(Chec)m(k)m(er)j(is)g(able)g(to)g(\014nd)e(t)m(w)m(o)j(small)f + (classes)g(of)g(errors,)g(one)f(is)h(memory)568 2579 + y(faults,)e(the)g(other,)h(non-deterministic)f(b)s(eha)m(viour.)42 + b(Lac)m(king)32 b(in)m(terpro)s(cedu-)568 2692 y(ral)e(analysis,)h(c)m + (hec)m(k)m(er)i(can)e(not)f(b)s(e)g(applied)g(to)h(real-w)m(orld)g + (soft)m(w)m(are.)324 3025 y Fk(Con)l(ten)l(ts)324 3244 + y Fj(1)90 b(In)m(tro)s(duction)2419 b(2)470 3364 y Fi(1.1)99 + b(Static)33 b(Single)h(Assignmen)m(t)54 b(.)c(.)g(.)g(.)g(.)g(.)f(.)h + (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138 + b(2)470 3485 y(1.2)99 b(Basic)34 b(Blo)s(c)m(ks)41 b(.)50 + b(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g + (.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138 b(3)470 3605 + y(1.3)99 b(Con)m(trol)33 b(Flo)m(w)g(Graph)95 b(.)50 + b(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g + (.)f(.)h(.)g(.)g(.)138 b(3)470 3725 y(1.4)99 b(LL)-11 + b(VM)34 b(In)m(termediate)g(Represen)m(tation)59 b(.)50 + b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138 + b(4)324 3943 y Fj(2)90 b(Related)38 b(W)-9 b(ork)2353 + b(7)324 4161 y(3)90 b(The)38 b(Chec)m(k)m(er)2413 b(8)470 + 4282 y Fi(3.1)99 b(V)-8 b(alidit)m(y)89 b(.)50 b(.)g(.)g(.)f(.)h(.)g(.) + g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g + (.)g(.)f(.)h(.)g(.)g(.)138 b(8)470 4402 y(3.2)99 b(Addressabilit)m(y)47 + b(.)i(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g + (.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)138 b(9)324 4620 + y Fj(4)90 b(T)-9 b(ec)m(hnical)38 b(No)m(v)m(elt)m(y)2106 + b(11)470 4740 y Fi(4.1)99 b(P)m(oin)m(ter)34 b(Analysis)d(.)50 + b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g + (.)g(.)g(.)g(.)f(.)h(.)g(.)g(.)89 b(12)324 4958 y Fj(5)h(F)-9 + b(uture)38 b(W)-9 b(ork)2348 b(15)1918 5251 y Fi(1)p + eop end + %%Page: 2 2 + TeXDict begin 2 1 bop 324 548 a Fj(6)90 b(Conclusion)2445 + b(16)324 881 y Fk(1)161 b(In)l(tro)t(duction)324 1100 + y Fi(The)44 b(\014rst)g(stop)g(for)g(c)m(hec)m(king)h(a)f(program)f + (for)g(errors)h(is)g(the)g(compiler.)78 b(Mo)s(dern)324 + 1220 y(compiler)45 b(design)h(fo)s(cusses)g(on)e(e\016cien)m(t)j + (algorithms)d(for)g(fast)h(compilation,)j(with)324 1341 + y(compiler)33 b(w)m(arnings)h(coming)f(as)g(a)f(con)m(v)m(enience.)470 + 1461 y(I)d(examine)g(the)g(p)s(ossibilit)m(y)h(of)e(using)h(mo)s(dern)g + (compiler)g(tec)m(hniques)i(to)d(pro)s(duce)324 1581 + y(a)h(program)h(c)m(hec)m(k)m(er.)45 b(This)31 b(is)g(built)f(on)g(top) + f(of)h(Chris)h(Lattner's)f(excellen)m(t)j(compiler)324 + 1702 y(framew)m(ork,)46 b(LL)-11 b(VM)42 b(\(Lo)m(w)h(Lev)m(el)h + (Virtual)e(Mac)m(hine\))i(whic)m(h)g(pro)m(vides)g(a)e(C)h(fron)m(t)324 + 1822 y(end,)g(an)d(SSA)g(\(Static)h(Single)g(Assignmen)m(t\))h(based)f + (in)m(termediate)h(represen)m(tation)324 1942 y(and)32 + b(man)m(y)i(di\013eren)m(t)g(analysis)g(and)e(optimization)h(passes.) + 324 2231 y Fh(1.1)135 b(Static)46 b(Single)f(Assignmen)l(t)324 + 2416 y Fi(In)22 b(source)h(co)s(de)f(form,)i(a)e(program)f(declares)j + (v)-5 b(ariables)22 b(and)g(ma)m(y)h(assign)g(and)f(reassign)324 + 2536 y(v)-5 b(alues)37 b(to)e(them)i(throughout)f(the)g(execution.)55 + b(In)37 b(static)f(single)h(assignmen)m(t)h(form,)324 + 2657 y(there)h(is)g(one)g(unc)m(hanging)g(de\014nition)h(p)s(er)e(v)-5 + b(ariable.)62 b(The)39 b(con)m(v)m(ersion)i(is)e(done)g(b)m(y)324 + 2777 y(de\014ning)29 b(a)g(new)g(v)-5 b(ariable)29 b(at)g(eac)m(h)g + (assignmen)m(t.)44 b(This)30 b(transforms)f Fg(x)52 b(=)f(1;)h(y)g(=)f + (x;)324 2898 y(x)g(=)h(2;)33 b Fi(in)m(to)g Ff(x)917 + 2913 y Fe(1)984 2898 y Fd( )28 b Fi(1;)17 b Ff(y)1253 + 2913 y Fe(1)1319 2898 y Fd( )27 b Ff(x)1501 2913 y Fe(1)1541 + 2898 y Fi(;)17 b Ff(x)1640 2913 y Fe(2)1707 2898 y Fd( )27 + b Fi(2.)470 3018 y(A)h(v)-5 b(ariable)27 b(ma)m(y)i(b)s(e)e(de\014ned)i + (as)f(b)s(eing)g(equal)g(to)f(m)m(ultiple)i(v)-5 b(alues)29 + b(b)m(y)f(emplo)m(ying)324 3138 y(the)k Ff(\036)f Fi(function.)43 + b(Setting)32 b(a)f(v)-5 b(alue)32 b(to)f Ff(\036)p Fi(\()p + Ff(x)1934 3153 y Fe(1)1974 3138 y Ff(;)17 b(:::;)g(x)2198 + 3153 y Fc(n)2245 3138 y Fi(\))31 b(means)i(that)e(the)h(v)-5 + b(alue)32 b(is)g(equal)324 3259 y(to)g(one)h(of)f(the)h(v)-5 + b(alues)33 b(in)g(the)g(set.)44 b(Consider)34 b(this)g(simple)g + (example:)426 3487 y Fg(int)52 b(x,)g(y;)426 3607 y(if)g(\(condition\)) + 529 3728 y(x)f(=)h(a;)426 3848 y(else)529 3969 y(x)f(=)h(b;)426 + 4089 y(y)g(=)f(x;)470 4317 y Fi(In)44 b(eac)m(h)g(branc)m(h,)j(w)m(e)d + (ha)m(v)m(e)h(a)e(di\013eren)m(t)h(de\014nition)g(of)f(the)h(v)-5 + b(ariable,)46 b Ff(x)3279 4332 y Fe(1)3365 4317 y Fd( )f + Ff(a)324 4438 y Fi(and)37 b Ff(x)573 4453 y Fe(2)649 + 4438 y Fd( )f Ff(b)p Fi(.)58 b Ff(y)41 b Fi(is)d(de\014ned)h(with)f + (the)g Ff(\036)f Fi(function.)58 b(In)38 b(our)f(example)i(ab)s(o)m(v)m + (e,)h Ff(y)f Fd( )324 4558 y Ff(\036)p Fi(\()p Ff(x)475 + 4573 y Fe(1)514 4558 y Ff(;)17 b(x)613 4573 y Fe(2)653 + 4558 y Fi(\).)470 4678 y(Similarly)-8 b(,)30 b(lo)s(ops)f(are)f + (written)i(with)f Ff(\036)p Fi(-no)s(des)f(at)g(the)h(top.)42 + b(A)29 b(lo)s(op)f(with)h(iterator)324 4799 y Ff(i)k + Fi(from)f(0)g(is)h(written)h Ff(i)1174 4814 y Fe(1)1241 + 4799 y Fd( )27 b Ff(\036)p Fi(\(0)p Ff(;)17 b(i)1590 + 4814 y Fe(1)1651 4799 y Fi(+)22 b(1\).)44 b(An)32 b(example:)1918 + 5251 y(2)p eop end + %%Page: 3 3 + TeXDict begin 3 2 bop 426 548 a Fg(int)52 b(y)g(=)f(0;)426 + 668 y(for)h(\(int)h(i)e(=)h(0;)g(i)f(<)h(n;)f(i++\))529 + 789 y(y)g(+=)h(i;)470 1017 y Fi(b)s(ecomes:)426 1187 + y Ff(y)474 1202 y Fe(1)541 1187 y Fd( )27 b Fi(0;)426 + 1308 y Fg(for)52 b(\()p Ff(i)715 1323 y Fe(1)783 1308 + y Fd( )27 b Ff(\036)p Fi(\(0)p Ff(;)17 b(i)1132 1323 + y Fe(2)1171 1308 y Fi(\))p Fg(;)52 b Ff(i)1345 1323 y + Fe(1)1412 1308 y Ff(<)28 b(n)p Fg(;)51 b Ff(i)1709 1323 + y Fe(2)1777 1308 y Fd( )27 b Ff(i)1937 1323 y Fe(1)1999 + 1308 y Fi(+)22 b(1)p Fg(\))529 1428 y Ff(y)577 1443 y + Fe(2)644 1428 y Fd( )27 b Ff(\036)p Fi(\()p Ff(y)915 + 1443 y Fe(1)953 1428 y Ff(;)17 b(y)1045 1443 y Fe(2)1106 + 1428 y Fi(+)22 b Ff(i)1237 1443 y Fe(1)1277 1428 y Fi(\))470 + 1669 y(LL)-11 b(VM)32 b(uses)g(static)g(single)g(assignmen)m(t)h(form)e + (for)g(its)g(in)m(termediate)i(represen)m(ta-)324 1789 + y(tion.)48 b(In)35 b(LL)-11 b(VM's)35 b(implemen)m(tation)h(of)e + Ff(\036)p Fi(-no)s(des,)g(eac)m(h)h(v)-5 b(alue)35 b(in)f(the)h(set)g + (is)f(asso)s(ci-)324 1910 y(ated)f(with)g(the)g(basic)g(blo)s(c)m(k)h + (con)m(taining)f(the)g(de\014nition)g(of)f(the)h(v)-5 + b(ariable.)324 2198 y Fh(1.2)135 b(Basic)45 b(Blo)t(c)l(ks)324 + 2383 y Fi(A)24 b(basic)h(blo)s(c)m(k)f(is)h(a)f(series)h(of)f + (instructions)h(that)f(execute)i(in)e(order)g(with)h(other)f(p)s(oin)m + (ts)324 2503 y(of)30 b(en)m(try)h(or)f(exit.)43 b(In)31 + b(this)g(sense)h(it)e(is)h(atomic;)g(execution)h(will)f(alw)m(a)m(ys)h + (b)s(egin)e(at)g(the)324 2624 y(b)s(eginning)37 b(of)g(a)f(basic)i(blo) + s(c)m(k)g(and)f(con)m(tin)m(ue)i(to)d(the)i(last)f(instruction.)58 + b(Sometimes)324 2744 y(this)30 b(rule)f(is)h(w)m(eak)m(ened)i(to)d + (allo)m(w)h(for)f(error)g(handling)g(\(suc)m(h)i(as)f(division)g(b)m(y) + g(zero\))g(or)324 2865 y(exceptions.)470 2985 y(One)i(w)m(a)m(y)h(to)f + (build)g(basic)h(blo)s(c)m(ks)g(is)f(to)f(tak)m(e)i(the)f(co)s(de)g + (and)g(cut)g(it)g(wherev)m(er)i(an)324 3105 y(instruction)29 + b(jumps,)g(or)f(wherev)m(er)i(a)e(jump)g(ma)m(y)g(land.)42 + b(These)30 b(form)e(the)g(b)s(oundaries)324 3226 y(of)39 + b(y)m(our)h(basic)h(blo)s(c)m(ks.)66 b(Note)40 b(that)f(this)h(tec)m + (hnique)i(do)s(esn't)f(alw)m(a)m(ys)g(pro)s(duce)f(the)324 + 3346 y(largest)33 b(p)s(ossible)h(basic)f(blo)s(c)m(ks)h(\(and)e(th)m + (us)i(the)f(few)m(est)h(n)m(um)m(b)s(er\).)470 3467 y(In)44 + b(LL)-11 b(VM,)45 b(a)f(basic)h(blo)s(c)m(k)g(m)m(ust)g(b)s(egin)f + (with)h(the)f Ff(\036)p Fi(-no)s(des)g(and)g(end)h(with)g(a)324 + 3587 y(terminator)33 b(instruction.)45 b(These)34 b(include)h(branc)m + (h)e(instructions,)i(calls)e(of)g(functions)324 3707 + y(that)i(ma)m(y)h(thro)m(w)f(an)g(exception,)j(or)c(a)h(function)h + (return.)51 b(F)-8 b(unction)36 b(calls)f(that)g(can)324 + 3828 y(not)d(thro)m(w)h(exceptions)i(are)e(not)f(terminator)h + (instructions.)324 4117 y Fh(1.3)135 b(Con)l(trol)46 + b(Flo)l(w)g(Graph)324 4301 y Fi(Basic)27 b(blo)s(c)m(ks)h(form)e(the)h + (no)s(des)g(of)f(a)g(directed)i(graph)f(called)g(the)g(con)m(trol)g + (\015o)m(w)g(graph.)324 4422 y(The)48 b(edges)g(connect)h(one)e(basic)h + (blo)s(c)m(k)g(to)f(the)h(blo)s(c)m(ks)h(it)e(could)h(jump)f(in)m(to.) + 88 b(In)324 4542 y(this)39 b(form,)i(a)d(cycle)j(represen)m(ts)g(a)e + (lo)s(op,)h(a)f(detac)m(hed)h(subgraph)g(or)f(basic)g(blo)s(c)m(k)h(is) + 324 4662 y(unreac)m(hable)i(co)s(de,)i(and)d(a)g(cycle)i(with)e(no)g + (edges)h(leading)g(out)f(of)f(it)h(m)m(ust)h(b)s(e)g(an)324 + 4783 y(in\014nite)33 b(lo)s(op.)470 4903 y(The)h(program)1918 + 5251 y(3)p eop end + %%Page: 4 4 + TeXDict begin 4 3 bop 426 548 a Fg(if)52 b(\(t)g(\045)f(2)h(==)g(0\)) + 529 668 y(print\(t,)h(")f(is)g(even"\);)426 789 y(else)529 + 909 y(print\(t,)h(")f(is)g(odd"\);)426 1150 y(for)g(\(int)h(i)e(=)h(0;) + g(i)f(<)h(t;)f(++i\))529 1270 y(if)h(\(i)f(*)h(i)g(==)f(t\))h({)631 + 1391 y(print\(t,)i(")d(is)h(",)g(i,)g(")f(squared"\);)631 + 1511 y(break;)529 1631 y(})426 1872 y(return;)470 2064 + y Fi(could)33 b(b)s(e)g(translated)g(in)m(to:)470 4413 + y @beginspecial 36 @llx 36 @lly 409 @urx 496 @ury 2160 + @rwi @setspecial + %%BeginDocument: example2.ps + %!PS-Adobe-2.0 + %%Creator: dot version 2.8 (Sun Apr 9 22:27:31 UTC 2006) + %%For: (nicholas) Nicholas + %%Title: example2 + %%Pages: (atend) + %%BoundingBox: 36 36 409 496 + %%EndComments + save + %%BeginProlog + /DotDict 200 dict def + DotDict begin + + /setupLatin1 { + mark + /EncodingVector 256 array def + EncodingVector 0 + + ISOLatin1Encoding 0 255 getinterval putinterval + EncodingVector 45 /hyphen put + + % Set up ISO Latin 1 character encoding + /starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont + } def + /Times-Roman starnetISO def + /Times-Italic starnetISO def + /Times-Bold starnetISO def + /Times-BoldItalic starnetISO def + /Helvetica starnetISO def + /Helvetica-Oblique starnetISO def + /Helvetica-Bold starnetISO def + /Helvetica-BoldOblique starnetISO def + /Courier starnetISO def + /Courier-Oblique starnetISO def + /Courier-Bold starnetISO def + /Courier-BoldOblique starnetISO def + cleartomark + } bind def + + %%BeginResource: procset graphviz 0 0 + /coord-font-family /Times-Roman def + /default-font-family /Times-Roman def + /coordfont coord-font-family findfont 8 scalefont def + + /InvScaleFactor 1.0 def + /set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale + } bind def + + % styles + /solid { [] 0 setdash } bind def + /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def + /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def + /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def + /bold { 2 setlinewidth } bind def + /filled { } bind def + /unfilled { } bind def + /rounded { } bind def + /diagonals { } bind def + + % hooks for setting color + /nodecolor { sethsbcolor } bind def + /edgecolor { sethsbcolor } bind def + /graphcolor { sethsbcolor } bind def + /nopcolor {pop pop pop} bind def + + /beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if + } bind def + + /set_font { + findfont exch + scalefont setfont + } def + + % draw aligned label in bounding box aligned to current point + /alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore + } def + + /boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath + } bind def + + /ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix + } bind def + + /endpage { showpage } bind def + /showpage { } def + + /layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] + def + + /layerlen layercolorseq length def + + /setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def + } bind def + + /onlayer { curlayer ne {invis} if } def + + /onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if + } def + + /curlayer 0 def + + %%EndResource + %%EndProlog + %%BeginSetup + 14 default-font-family set_font + 1 setmiterlimit + % /arrowlength 10 def + % /arrowwidth 5 def + + % make sure pdfmark is harmless for PS-interpreters other than Distiller + /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse + % make '<<' and '>>' safe on PS Level 1 devices + /languagelevel where {pop languagelevel}{1} ifelse + 2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put + } if + + %%EndSetup + %%Page: 1 1 + %%PageBoundingBox: 36 36 409 496 + %%PageOrientation: Portrait + gsave + 36 36 373 460 boxprim clip newpath + 36 36 translate + 0 0 1 beginpage + 1.0000 set_scale + 4 4 translate 0 rotate + 0.000 0.000 1.000 graphcolor + 0.000 0.000 1.000 graphcolor + newpath -6 -6 moveto + -6 458 lineto + 371 458 lineto + 371 -6 lineto + closepath + fill + 0.000 0.000 1.000 graphcolor + newpath -6 -6 moveto + -6 458 lineto + 371 458 lineto + 371 -6 lineto + closepath + stroke + 0.000 0.000 0.000 graphcolor + 14.00 /Times-Roman set_font + % Node0x85fdea8 + gsave 10 dict begin + newpath 189 404 moveto + 288 404 lineto + 288 452 lineto + 189 452 lineto + closepath + stroke + gsave 10 dict begin + 197 435 moveto + (if \(t % 2 == 0\)) + [3.84 4.56 3.6 4.56 3.84 3.6 11.76 3.6 6.96 3.6 7.92 7.92 3.6 6.96 4.56] + xshow + end grestore + newpath 189 428 moveto + 288 428 lineto + stroke + gsave 10 dict begin + 214 411 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 239 404 moveto + 239 428 lineto + stroke + gsave 10 dict begin + 263 411 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85fe1a8 + gsave 10 dict begin + newpath 109 332 moveto + 231 332 lineto + 231 368 lineto + 109 368 lineto + closepath + stroke + gsave 10 dict begin + 117 345 moveto + (print\(t, " is even"\);) + [6.96 5.04 3.84 6.96 3.84 4.56 3.84 3.6 3.6 5.76 3.6 3.84 5.52 3.6 5.76 6.48 6.24 6.96 5.76 4.56 3.84] + xshow + end grestore + end grestore + % Node0x85fdea8->Node0x85fe1a8 + newpath 205 404 moveto + 200 396 193 386 187 377 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 190 375 moveto + 182 368 lineto + 184 378 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 190 375 moveto + 182 368 lineto + 184 378 lineto + closepath + stroke + end grestore + % Node0x85fe268 + gsave 10 dict begin + newpath 249 332 moveto + 366 332 lineto + 366 368 lineto + 249 368 lineto + closepath + stroke + gsave 10 dict begin + 256 345 moveto + (print\(t, " is odd"\);) + [6.96 5.04 3.84 6.96 3.84 4.56 3.84 3.6 3.6 5.76 3.6 3.84 5.52 3.6 6.96 6.96 6.96 5.76 4.56 3.84] + xshow + end grestore + end grestore + % Node0x85fdea8->Node0x85fe268 + newpath 272 404 moveto + 277 396 284 386 290 377 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 293 378 moveto + 295 368 lineto + 287 375 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 293 378 moveto + 295 368 lineto + 287 375 lineto + closepath + stroke + end grestore + % Node0x85fe710 + gsave 10 dict begin + newpath 182 232 moveto + 295 232 lineto + 295 296 lineto + 182 296 lineto + closepath + stroke + gsave 10 dict begin + 190 279 moveto + (int i = phi\(0, inc\)) + [3.84 6.96 3.84 3.6 3.84 3.6 7.92 3.6 6.96 6.96 3.84 4.56 6.96 3.6 3.6 3.84 6.96 6.24 4.56] + xshow + 190 263 moveto + (if \(i < t\)) + [3.84 4.56 3.6 4.56 3.84 3.6 7.92 3.6 3.84 4.56] + xshow + end grestore + newpath 182 256 moveto + 295 256 lineto + stroke + gsave 10 dict begin + 210 239 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 239 232 moveto + 239 256 lineto + stroke + gsave 10 dict begin + 267 239 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85fe1a8->Node0x85fe710 + newpath 184 332 moveto + 190 324 198 314 207 304 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 210 306 moveto + 213 296 lineto + 204 302 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 210 306 moveto + 213 296 lineto + 204 302 lineto + closepath + stroke + end grestore + % Node0x85fe268->Node0x85fe710 + newpath 292 332 moveto + 286 324 278 314 269 304 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 272 302 moveto + 263 296 lineto + 266 306 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 272 302 moveto + 263 296 lineto + 266 306 lineto + closepath + stroke + end grestore + % Node0x85fecd0 + gsave 10 dict begin + newpath 124 148 moveto + 211 148 lineto + 211 196 lineto + 124 196 lineto + closepath + stroke + gsave 10 dict begin + 132 179 moveto + (if \(i * i == t\)) + [3.84 4.56 3.6 4.56 3.84 3.6 6.96 3.6 3.84 3.6 7.92 7.92 3.6 3.84 4.56] + xshow + end grestore + newpath 124 172 moveto + 211 172 lineto + stroke + gsave 10 dict begin + 146 155 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 168 148 moveto + 168 172 lineto + stroke + gsave 10 dict begin + 189 155 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85fe710->Node0x85fecd0 + newpath 203 232 moveto + 198 224 192 214 186 205 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 189 203 moveto + 181 196 lineto + 183 206 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 189 203 moveto + 181 196 lineto + 183 206 lineto + closepath + stroke + end grestore + % Node0x85fe7d0 + gsave 10 dict begin + newpath 266 154 moveto + 320 154 lineto + 320 190 lineto + 266 190 lineto + closepath + stroke + gsave 10 dict begin + 274 167 moveto + (return;) + [4.8 6 3.84 6.96 5.04 6.96 3.84] + xshow + end grestore + end grestore + % Node0x85fe710->Node0x85fe7d0 + newpath 272 232 moveto + 275 223 279 211 283 200 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 287 201 moveto + 287 190 lineto + 280 198 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 287 201 moveto + 287 190 lineto + 280 198 lineto + closepath + stroke + end grestore + % Node0x85feb98 + gsave 10 dict begin + newpath 0 72 moveto + 173 72 lineto + 173 112 lineto + 0 112 lineto + closepath + stroke + gsave 10 dict begin + 8 95 moveto + (print\(t, " is ", i, " squared"\);) + [6.96 5.04 3.84 6.96 3.84 4.56 3.84 3.6 3.6 5.76 3.6 3.84 5.52 3.6 5.76 3.6 3.6 3.84 3.6 3.6 5.76 3.6 5.52 6.72 6.96 6.24 4.8 6.24 6.96 5.76 4.56 3.84] + xshow + 8 79 moveto + (break;) + [6.96 4.8 6.24 6.24 6.96 3.84] + xshow + end grestore + end grestore + % Node0x85fecd0->Node0x85feb98 + newpath 134 148 moveto + 127 140 118 130 110 120 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 112 117 moveto + 103 112 lineto + 107 122 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 112 117 moveto + 103 112 lineto + 107 122 lineto + closepath + stroke + end grestore + % NodeX + gsave 10 dict begin + newpath 151 0 moveto + 249 0 lineto + 249 36 lineto + 151 36 lineto + closepath + stroke + gsave 10 dict begin + 159 13 moveto + (int inc = i + 1;) + [3.84 6.96 3.84 3.6 3.84 6.96 6.24 3.6 7.92 3.6 3.84 3.6 7.92 3.6 6.96 3.84] + xshow + end grestore + end grestore + % Node0x85fecd0->NodeX + newpath 190 148 moveto + 192 125 195 77 198 46 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 201 46 moveto + 199 36 lineto + 195 46 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 201 46 moveto + 199 36 lineto + 195 46 lineto + closepath + stroke + end grestore + % Node0x85feb98->NodeX + newpath 117 72 moveto + 131 63 148 52 163 42 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 166 44 moveto + 172 36 lineto + 162 39 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 166 44 moveto + 172 36 lineto + 162 39 lineto + closepath + stroke + end grestore + % NodeX->Node0x85fe710 + newpath 203 36 moveto + 209 75 223 167 231 222 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 228 223 moveto + 233 232 lineto + 234 222 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 228 223 moveto + 233 232 lineto + 234 222 lineto + closepath + stroke + end grestore + endpage + showpage + grestore + %%PageTrailer + %%EndPage: 1 + %%Trailer + %%Pages: 1 + end + restore + %%EOF + + %%EndDocument + @endspecial 324 4697 a Fh(1.4)135 b(LL)-15 b(VM)44 b(In)l(termediate)j + (Represen)l(tation)324 4882 y Fi(LL)-11 b(VM)33 b(sp)s(orts)h(an)f + (instruction)h(set)g(arc)m(hitecture)g(with)g(explicit)h(basic)f(blo)s + (c)m(ks,)g(SSA)324 5002 y(form)28 b(and)h(34)f(instructions)i(in)e(six) + i(categories.)43 b(It)28 b(features)i(an)e(explicit)i(con)m(trol)f + (\015o)m(w)1918 5251 y(4)p eop end + %%Page: 5 5 + TeXDict begin 5 4 bop 671 533 a Fj(T)m(yp)s(e)p 980 569 + 4 121 v 257 w(Description)p 1936 569 V 262 w(T)m(yp)s(e)p + 2317 569 V 262 w(Description)p 611 572 2665 4 v 753 656 + a Fi(v)m(oid)p 980 692 4 121 v 100 w(No)33 b(v)-5 b(alue)p + 1936 692 V 2317 692 V 611 696 2665 4 v 748 780 a(b)s(o)s(ol)p + 980 816 4 121 v 98 w(T)d(rue)34 b(or)e(V)-8 b(alue)p + 1936 816 V 2317 816 V 611 819 2665 4 v 693 904 a(ub)m(yte)p + 980 940 4 121 v 101 w(Unsigned)34 b(b)m(yte)p 1936 940 + V 406 w(sb)m(yte)p 2317 940 V 102 w(Signed)f(b)m(yte)p + 611 943 2665 4 v 660 1027 a(ushort)p 980 1064 4 121 v + 100 w(Unsigned)h(16)e(bits)p 1936 1064 V 308 w(short)p + 2317 1064 V 100 w(Signed)h(16)f(bits)p 611 1067 2665 + 4 v 761 1151 a(uin)m(t)p 980 1187 4 121 v 100 w(Unsigned)i(32)e(bits)p + 1936 1187 V 409 w(in)m(t)p 2317 1187 V 100 w(Signed)h(32)f(bits)p + 611 1191 2665 4 v 699 1275 a(ulong)p 980 1311 4 121 v + 99 w(Unsigned)i(64)e(bits)p 1936 1311 V 346 w(long)p + 2317 1311 V 100 w(Signed)h(64)f(bits)p 611 1314 2665 + 4 v 742 1399 a(\015oat)p 980 1435 4 121 v 99 w(32-bit)g(\015oating)h(p) + s(oin)m(t)p 1936 1435 V 99 w(double)p 2317 1435 V 101 + w(64-bit)f(\015oating)g(p)s(oin)m(t)p 611 1438 2665 4 + v 729 1522 a(lab)s(el)p 980 1558 4 121 v 99 w(Branc)m(h)i(destination)p + 1936 1558 V 2317 1558 V 1142 1719 a(T)-8 b(able)33 b(1:)43 + b(Primitiv)m(e)35 b(t)m(yp)s(es)f(in)f(LL)-11 b(VM)33 + b(IR)324 1998 y(graph,)52 b(language-indep)s(enden)m(t)f(t)m(yp)s(e)e + (information)g(and)f(explicit)i(t)m(yp)s(ed)g(p)s(oin)m(ter)324 + 2119 y(arithmetic.)41 b(It)21 b(has)i(an)e(in\014nite)i(n)m(um)m(b)s + (er)g(of)e(registers)i(and)f(explicit)h(memory)g(op)s(erations.[ALB) + 3928 2082 y Fe(+)3988 2119 y Fi(03)o(,)324 2239 y(LA04b])470 + 2359 y(There)46 b(are)e(13)g(primitiv)m(e)j(t)m(yp)s(es)f(sho)m(wn)f + (in)g(T)-8 b(able)45 b(1)g(from)f(whic)m(h)i(comp)s(ound)324 + 2480 y(t)m(yp)s(es)35 b(ma)m(y)f(b)s(e)f(deriv)m(ed.)48 + b(These)35 b(deriv)m(ed)h(t)m(yp)s(es)e(ma)m(y)g(b)s(e)g(arra)m(ys,)g + (suc)m(h)h(as)f Fg([3)52 b(x)f([4)324 2600 y(x)g(int]])p + Fi(,)41 b(a)c(p)s(oin)m(ter)h(t)m(yp)s(e)g Fg(float*)p + Fi(,)j(a)c(structure)i Fd(f)p Fg(int,)52 b(float,)h([3)f(x)f(sbyte])p + Fd(g)324 2721 y Fi(or)38 b(a)g(function)h Fg(void)52 + b(\(int\)*)40 b Fi(b)s(eing)f(a)f(p)s(oin)m(ter)g(to)g(a)g(function)h + (that)f(returns)i(v)m(oid)324 2841 y(and)32 b(tak)m(es)i(a)f(signed)g + (32-bit)f(in)m(teger.[Lat06])470 2961 y(The)25 b(registers)g(in)f(LL) + -11 b(VM)24 b(are)g(SSA)h(v)-5 b(ariables,)26 b(and)e(their)g(iden)m + (ti\014ers)i(are)e(pre\014xed)324 3082 y(with)39 b(\\\045".)62 + b(V)-8 b(ariables)40 b(are)e(declared)i(b)m(y)g(the)f(statemen)m(t)h + (that)f(de\014nes)h(them.)63 b(All)324 3202 y(instructions)47 + b(in)f(LL)-11 b(VM)46 b(are)f(strongly)i(t)m(yp)s(ed,)j(with)c(the)g(t) + m(yp)s(e)g(of)f(its)h(argumen)m(ts)324 3322 y(app)s(earing)36 + b(b)s(efore)g(the)h(argumen)m(t.)55 b(In)36 b(the)h(ev)m(en)m(t)h(that) + e(the)h(t)m(w)m(o)g(argumen)m(ts)g(of)f(an)324 3443 y(binary)f(op)s + (eration)g(are)g(the)h(same,)g(the)g(t)m(yp)s(e)f(is)h(only)f(sp)s + (eci\014ed)i(once,)g(immediately)324 3563 y(after)32 + b(the)h(op)s(co)s(de.)44 b(A)32 b(sample)i(instruction)g(is)f + Fg(\045result)53 b(=)e(mul)i(uint)f(\045X,)g(8)p Fi(.)470 + 3684 y(Throughout)33 b(this)g(pap)s(er,)g(I)g(will)g(refer)g(to)f + (certain)h(instructions:)340 3879 y(load)49 b Fg(\045y)i(=)h(load)g + Fb(type)19 b Fg(*)51 b(\045x)p Fi(.)568 3999 y(Dereferences)34 + b(the)f(p)s(oin)m(ter)g Fg(x)g Fi(and)g(loads)f(the)h(v)-5 + b(alue)33 b(in)m(to)g(register)h Fg(y)p Fi(.)312 4200 + y(store)50 b Fg(store)i Fb(type)70 b Fg(\045x,)52 b Fb(type)19 + b Fg(*)51 b(\045y)p Fi(.)568 4320 y(Stores)35 b(the)g(v)-5 + b(alue)36 b(in)f(register)g Fg(x)g Fi(in)m(to)g(the)h(memory)f + (referred)h(to)e(b)m(y)k Fg(y)p Fi(.)50 b(In)35 b(C,)568 + 4440 y(this)e(w)m(ould)g(b)s(e)g Fg(*y)52 b(=)g(x;)p + Fi(.)-69 4641 y(getelemen)m(tptr)f Fg(\045y)g(=)h(getelementptr)j + Fb(type)18 b Fg(*)52 b(\045x,)g(long)g(0,)g(long)g(0)568 + 4761 y Fi(\\getelemen)m(tptr")37 b(ma)m(y)f(b)s(e)g(used)h(as)e(an)h + (instruction)g(de\014ning)h(a)e(v)-5 b(ariable,)37 b(or)568 + 4882 y(inline)e(as)f(an)g(expression)i(in)e(a)g(another)g(op)s + (eration.)48 b(In)34 b(either)h(case,)g(\\getele-)568 + 5002 y(men)m(tptr")k(is)g(v)-5 b(ariadic,)41 b(meaning)e(that)g(is)g + (ma)m(y)h(ha)m(v)m(e)g(an)m(y)f(n)m(um)m(b)s(er)h(of)e(argu-)1918 + 5251 y(5)p eop end + %%Page: 6 6 + TeXDict begin 6 5 bop 568 548 a Fi(men)m(ts.)70 b(The)42 + b(\014rst)g(argumen)m(t)g(is)g(alw)m(a)m(ys)g(a)f(base)h(p)s(oin)m + (ter,)i(follo)m(w)m(ed)e(b)m(y)g(the)568 668 y(indices)34 + b(in)f(the)g(new)g(p)s(oin)m(ter)g(b)s(eing)g(calculated.)568 + 826 y(This)f(is)g(an)f(esp)s(ecially)j(in)m(teresting)f(instruction)f + (b)s(ecause)h(it)e(allo)m(ws)h(the)g(t)m(yp)s(e-)568 + 947 y(safe)h(subset)h(of)e(p)s(oin)m(ter)h(arithmetic.)-66 + 1143 y(mallo)s(c,)f(allo)s(ca)49 b Fg(\045x)i(=)h(alloca)h + Fb(type)568 1263 y Fg(\045x)e(=)h(malloc)h Fb(type)568 + 1384 y Fi(Both)38 b(heap)h(and)f(stac)m(k)i(allo)s(cation)d(\(mallo)s + (c)i(and)f(allo)s(ca)g(resp)s(ectiv)m(ely\))j(ha)m(v)m(e)568 + 1504 y(their)31 b(o)m(wn)h(op)s(co)s(des,)f(and)g(tak)m(e)h(the)f(same) + h(argumen)m(ts:)44 b(one)31 b(t)m(yp)s(e,)h(optionally)568 + 1624 y(follo)m(w)m(ed)h(b)m(y)h(a)e(coun)m(t,)h(optionally)g(follo)m(w) + m(ed)h(b)m(y)g(an)e(alignmen)m(t.)364 1820 y(free)50 + b Fg(free)i Fb(type)70 b Fg(\045x)568 1941 y Fi(F)-8 + b(rees)33 b(memory)g(allo)s(cated)g(with)g(the)g Fg(malloc)h + Fi(instruction.)427 2137 y(br)49 b Fg(br)i(label)i(\045loopexit)568 + 2257 y(br)e(bool)i(\045condition)h(label)e(\045else)h(label)g(\045then) + 568 2377 y Fi(A)32 b(branc)m(h)i(statemen)m(t,)g(with)f(an)g(optional)f + (conditional.)470 2559 y(T)-8 b(ak)m(en)28 b(directly)g(from)f(LL)-11 + b(VM's)27 b(C)g(fron)m(t)g(end,)h(a)f(small)g(complete)h(program)e(lo)s + (oks)324 2679 y(lik)m(e:)324 2877 y Fg(\045y)52 b(=)f(global)i(sbyte*)g + (\045x)564 b(;)52 b()h([#uses=1])324 2998 y(\045x)f(=)f(weak)h + (global)h(sbyte)g(0)820 b(;)52 b()h([#uses=1])324 + 3118 y(\045.str_1)g(=)e(internal)j(constant)f([6)f(x)g(sbyte])g + (c"abcde\\00")670 b(;)51 b(<[6)h(x)g(sbyte]*>)h([#uses=0])324 + 3359 y(implementation)157 b(;)52 b(Functions:)324 3600 + y(void)g(\045f\(\))g({)324 3720 y(entry:)734 3840 y(\045tmp.0)h(=)e + (load)i(sbyte**)g(\045y)821 b(;)51 b()i([#uses=1])734 + 3961 y(store)g(sbyte)f(100,)g(sbyte*)h(\045tmp.0)734 + 4081 y(ret)f(void)324 4202 y(})470 4400 y Fi(The)36 b(global)e(v)-5 + b(ariables)36 b(b)s(egin)f(a)g(program,)g(follo)m(w)m(ed)h(b)m(y)g(the) + f(w)m(ord)g(\\implemen-)324 4521 y(tation",)c(then)g(the)h(functions.) + 44 b(Note)31 b(that)g(the)g(lab)s(el)h(\\en)m(try")f(is)h(mandatory;)g + (there)324 4641 y(is)d(a)f(lab)s(el)h(at)f(the)h(b)s(eginning)g(of)f + (ev)m(ery)i(basic)f(blo)s(c)m(k.)43 b(The)30 b Fg(;)51 + b(text)30 b Fi(indicates)g(a)e(com-)324 4761 y(men)m(t)k(running)g(to)e + (the)i(end)g(of)e(the)i(line.)43 b(F)-8 b(or)31 b(the)g(most)h(part,)f + (the)h(LL)-11 b(VM)31 b(assem)m(bly)324 4882 y(language)44 + b(is)h(self-explanatory)-8 b(,)48 b(but)d(for)e(comprehensiv)m(e)48 + b(details,)g(please)e(consult)324 5002 y(the)33 b(language)f + (reference.[Lat06)q(].)1918 5251 y(6)p eop end + %%Page: 7 7 + TeXDict begin 7 6 bop 324 548 a Fk(2)161 b(Related)53 + b(W)-13 b(ork)324 767 y Fi(The)22 b(design)h(of)e(the)i(c)m(hec)m(k)m + (er)h(w)m(as)f(hea)m(vily)g(in\015uenced)h(b)m(y)f(t)m(w)m(o)f(pro)5 + b(jects,)25 b(V)-8 b(algrind[SN)q(])324 887 y(and)32 + b(Co)m(v)m(erit)m(y)-8 b(.)470 1008 y(V)g(algrind)39 + b(is)g(a)f(dynamic)i(memory)g(error)e(detector.)62 b(It)39 + b(w)m(orks)h(b)m(y)f(in)m(terpreting)324 1128 y(compiled)33 + b(x86)g(programs)f(and)h(JIT)g(compiling)g(them)g(in)m(to)g(a)f + (reduced)i(SP)-8 b(AR)m(C-lik)m(e)324 1249 y(assem)m(bly)g(,)42 + b(where)d(it)f(instrumen)m(ts)i(the)f(co)s(de,)h(and)e(JITs)h(it)f(bac) + m(k)h(in)m(to)g(x86)f(for)f(ex-)324 1369 y(ecution.)60 + b(In)38 b(the)g(instrumen)m(tation)h(phase,)h(mo)s(di\014es)f(the)f(co) + s(de)g(to)f(store)i(an)e(extra)324 1489 y(\\v)-5 b(alidit)m(y")39 + b(b)m(yte)h(for)e(eac)m(h)h(b)m(yte)h(of)f(register)g(data)f(or)h + (memory)-8 b(,)41 b(and)e(an)f(extra)h(ad-)324 1610 y(dressabilit)m(y)e + (bit)e(for)f(eac)m(h)i(b)m(yte)g(of)e(allo)s(cated)g(memory)-8 + b(.)51 b(The)36 b(v)-5 b(alidit)m(y)36 b(bits)f(are)g(set)324 + 1730 y(when)f(they)h(are)e(assigned)i(with)f(a)f(\\v)-5 + b(alid")33 b(v)-5 b(alue)34 b(\(a)f(source)i(with)f(the)g(v)-5 + b(alidit)m(y)34 b(bits)324 1850 y(set\))28 b(and)g(cleared)h(when)g + (assigned)h(from)d(a)h(source)h(with)g(the)f(bits)h(cleared.)42 + b(The)29 b(\\ad-)324 1971 y(dressabilit)m(y")j(bit)e(stores)h(whether)h + (a)e(giv)m(en)h(address)g(can)g(b)s(e)f(dereferenced;)j(it)d(is)h(set) + 324 2091 y(on)23 b(mallo)s(c)h(and)g(cleared)g(on)g(free.)41 + b(V)-8 b(algrind)24 b(will)g(in)m(tercept)h(the)f(trap)g(to)f(Lin)m(ux) + i(k)m(ernel)324 2212 y(and)k(v)m(erify)i(that)e(the)g(argumen)m(ts)h + (are)g(all)f(v)-5 b(alid)29 b(or)g(addressable,)j(as)d(appropriate)g + (for)324 2332 y(the)37 b(giv)m(en)g(system)h(call.)55 + b(It)37 b(also)f(tests)h(the)g(v)-5 b(alidit)m(y)37 b(bits)g(on)g + (branc)m(h)g(instructions.)324 2452 y(In)29 b(V)-8 b(algrind,)31 + b(it)e(is)h(acceptable)g(to)f(cop)m(y)i(around)e(unde\014ned)i(data.)42 + b(An)30 b(error)f(is)h(only)324 2573 y(thro)m(wn)39 b(when)h(the)g(b)s + (eha)m(viour)g(of)e(the)h(program)g(is)g(determined)i(b)m(y)f(an)f + (unde\014ned)324 2693 y(v)-5 b(alue.)470 2813 y(Co)m(v)m(erit)m(y's)34 + b(c)m(hec)m(k)m(er)g(is)e(deriv)m(ed)g(and)g(rewritten)g(from)f(their)g + (earlier)h(w)m(ork,)g(Stan-)324 2934 y(ford)22 b(GCC[ECCH00)r(].)40 + b(This)24 b(is)f(a)f(static)h(c)m(hec)m(k)m(er)j(built)d(in)g(to)f(a)h + (compiler)g(framew)m(ork,)324 3054 y(using)i(a)g(language)f(called)i + (\\metal")f(to)f(describ)s(e)j(in)m(v)-5 b(alid)25 b(op)s(erations,)i + (suc)m(h)f(as)f(double)324 3175 y(calls)33 b(to)f(a)h(lo)s(c)m(king)g + (function,)g(in)g(terms)g(of)g(the)g(primitiv)m(es)h(in)f(the)g(target) + f(program.)470 3295 y(Chec)m(k)m(er)38 b(is)d(directly)i(built)e(on)g + (top)g(of)f(a)h(compiler)h(framew)m(ork,)g(the)g(Lo)m(w)f(Lev)m(el)324 + 3415 y(Virtual)23 b(Mac)m(hine[LA04a)q(].)40 b(LL)-11 + b(VM)24 b(is)f(particularly)h(w)m(ell)g(suited)g(for)e(dev)m(eloping)j + (new)324 3536 y(mid-lev)m(el)38 b(language-indep)s(enden)m(t)g(in)m + (terpro)s(cedural)g(analysis)g(and)f(optimizations.)324 + 3656 y(It)28 b(also)f(pro)m(vides)j(a)d(t)m(yp)s(e-safe)i(b)m(yteco)s + (de)g(language)e(with)i(JITter,)g(alongside)g(a)e(static)324 + 3777 y(compiler.)44 b(This)34 b(compilation)f(strategy)g(allo)m(ws)h + (for)e(link)h(time)g(optimization.)470 3897 y(The)i(applicabilit)m(y)g + (of)e(LL)-11 b(VM)35 b(to)e(co)s(de)h(c)m(hec)m(king)i(w)m(as)f(not)e + (lost)h(on)g(its)g(authors.)324 4017 y(SAFEcore[DKAL05])i(is)h(a)f(pro) + 5 b(ject)38 b(with)f(similar)g(goals,)h(but)e(a)h(more)f(formal)g(and) + 324 4138 y(rigorous)25 b(design.)42 b(Their)25 b(pro)s(cedure)h(marks)g + (all)f(p)s(oten)m(tially)h(in)m(v)-5 b(alid)25 b(b)s(eha)m(viour)h + (with)324 4258 y(run-time)40 b(c)m(hec)m(ks,)k(then)c(applies)h(static) + f(optimization)g(to)f(eliminate)i(the)f(need)g(for)324 + 4378 y(the)33 b(run-time)g(c)m(hec)m(ks.[DKA05)r(])1918 + 5251 y(7)p eop end + %%Page: 8 8 + TeXDict begin 8 7 bop 324 548 a Fk(3)161 b(The)53 b(Chec)l(k)l(er)324 + 767 y Fi(The)37 b(program)f(c)m(hec)m(k)m(er)j(do)s(esn't)e(directly)g + (v)m(erify)h(C)f(or)e(C++)i(seman)m(tics.)56 b(Instead,)324 + 887 y(w)m(e)36 b(rely)f(on)g(the)g(LL)-11 b(VM)36 b(GCC)f(fron)m(t)g + (end)g(to)g(compile)h(a)e(program)h(in)m(to)g(the)g(LL)-11 + b(VM)324 1008 y(in)m(termediate)39 b(represen)m(tation,)i(whic)m(h)e + (is)f(then)h(v)m(eri\014ed.)60 b(Similarly)-8 b(,)40 + b(not)d(all)h(prop-)324 1128 y(erties)d(of)e(a)g(program)h(are)f(v)m + (eri\014ed)j(b)m(y)f(the)f(c)m(hec)m(k)m(er;)j(LL)-11 + b(VM)34 b(includes)i(an)e(extensiv)m(e)324 1249 y(mo)s(dule)k(v)m + (eri\014er)h(whic)m(h)h(guaran)m(tees)f(that)e(all)h(of)f(the)h(LL)-11 + b(VM)38 b(language)g(assertions)324 1369 y(are)32 b(held)i(b)s(efore)e + (the)h(c)m(hec)m(k)m(er)j(op)s(erates)d(up)s(on)f(it.)470 + 1489 y(Correct)45 b(op)s(eration)e(of)h(the)g(c)m(hec)m(k)m(er)j(also)d + (relies)h(on)f(the)g(strength)h(of)f(LL)-11 b(VMs)324 + 1610 y(optimizers)37 b(ha)m(ving)g(b)s(een)g(applied)f(on)g(the)h + (input.)54 b(There)37 b(is)g(no)f(attempt)g(made)g(in)324 + 1730 y(the)h(c)m(hec)m(k)m(er)i(to)d(simplify)h(expressions)j(or)35 + b(detect)j(dead)f(co)s(de)f(paths.)55 b(The)38 b(c)m(hec)m(k)m(er)324 + 1850 y(will)33 b(generate)g(spurious)h(errors)f(if)f(the)h(optimizers)h + (ha)m(v)m(e)g(not)f(b)s(een)g(run.)470 1971 y(There)f(are)g(t)m(w)m(o)f + (ma)5 b(jor)32 b(categories)f(of)g(errors,)h(v)-5 b(alidit)m(y)32 + b(errors)g(referring)f(to)g(non-)324 2091 y(deterministic)k(b)s(eha)m + (viour,)e(and)g(addressabilit)m(y)i(errors)e(b)s(eing)g(memory)g + (faults.)324 2380 y Fh(3.1)135 b(V)-11 b(alidit)l(y)324 + 2565 y Fi(The)39 b(LL)-11 b(VM)39 b(IR)g(includes)h(an)e(in)m + (teresting)i(constan)m(t)g(v)-5 b(alue,)40 b Fg(undef)g + Fi(or)e(\\unde\014ned)324 2685 y(v)-5 b(alue")42 b(whic)m(h)i(used)f + (whenev)m(er)h(the)f(programs)f(b)s(eha)m(viour)h(is)g(v)-5 + b(alid)42 b(regardless)h(of)324 2805 y(the)38 b(v)-5 + b(alue.)60 b(In)38 b(practise,)j(it)c(is)i(found)f(whenev)m(er)i(LL)-11 + b(VM's)39 b(optimizers)h(\014nd)e(a)g(case)324 2926 y(where)c(the)f(v) + -5 b(alue)33 b(is)g(uninitialized,)h(but)f(not)f(when)i(it)f(is)g + (indeterminate.)470 3046 y(Nondeterministic)42 b(b)s(eha)m(viour)e(o)s + (ccurs)g(whenev)m(er)i(an)d(unde\014ned)i(v)-5 b(alue)40 + b(a\013ects)324 3166 y(the)e(con)m(trol)h(\015o)m(w)f(of)g(the)h + (program.)59 b(Since)40 b(all)e(instructions)h(whic)m(h)h(a\013ect)e + (con)m(trol)324 3287 y(\015o)m(w)27 b(are)f(en)m(umerated)j(as)e(branc) + m(h)g(instructions,)i(w)m(e)f(en)m(umerate)g(all)f(branc)m(h)g + (instruc-)324 3407 y(tions)33 b(and)f(detect)i(branc)m(hes)g(on)f + Fg(undef)h Fi(argumen)m(t.)469 3634 y Fd(\017)49 b Fg(branch)k(on)e + (undef)i(found.)568 3754 y Fi(An)38 b(v)-5 b(ariable)38 + b(of)f(unde\014ned)j(v)-5 b(alue)38 b(will)g(a\013ect)g(the)g(con)m + (trol)g(\015o)m(w)h(of)e(the)h(pro-)568 3875 y(gram,)28 + b(leading)g(to)g(results)h(that)e(are)h(not)f(determined)j(b)m(y)f(the) + f(program)f(input.)568 4036 y(Example:)568 4280 y Fg(extern)53 + b(void)f(print\(char*\);)568 4521 y(void)g(f\(\))568 + 4641 y({)670 4761 y(int)g(x;)670 4882 y(if)g(\(x\))773 + 5002 y(print\("foo"\);)1918 5251 y Fi(8)p eop end + %%Page: 9 9 + TeXDict begin 9 8 bop 568 548 a Fg(})469 793 y Fd(\017)49 + b Fg(switch)k(on)e(undef)i(found.)568 913 y Fi(Similarly)c(to)e(branc)m + (hes,)54 b(c)m(hec)m(k)m(er)d(also)d(\014nds)h(non-determinism)h(in)e + (switc)m(h)568 1034 y(statemen)m(ts.)568 1196 y(Example:)568 + 1440 y Fg(extern)53 b(void)f(print\(char*\);)568 1561 + y(static)h(const)f(int)g(x[2][3])h(=)f({{10,)g(11,)h(12},)f({13,)g(14,) + g(15}};)568 1802 y(void)g(f\(\))568 1922 y({)670 2042 + y(int)g(*p)g(=)g(\(int*\)x;)670 2163 y(switch)h(\(p[6]\))670 + 2283 y({)773 2403 y(case)f(0:)875 2524 y(print\("foo"\);)875 + 2644 y(break;)773 2765 y(case)g(1:)875 2885 y(print\("bar"\);)875 + 3005 y(break;)670 3126 y(})568 3246 y(})324 3535 y Fh(3.2)135 + b(Addressabilit)l(y)324 3720 y Fi(Memory)39 b(accesses)h(concern)e + (either)h(reads,)h(writes,)g(or)d(calls)h(of)f(function)i(p)s(oin)m + (ters.)324 3840 y(Besides)32 b(c)m(hec)m(king)h(for)d + Fg(undef)i Fi(p)s(oin)m(ter)f(v)-5 b(alues,)32 b(c)m(hec)m(k)m(er)i + (\014nds)d(the)g(follo)m(wing)g(errors:)469 4068 y Fd(\017)49 + b Fg(read/write/free)55 b(of)d(unallocated)i(memory.)568 + 4189 y Fi(Chec)m(k)m(er)49 b(has)e(found)g(a)f(free)h(instruction)h + (whose)g(argumen)m(t)f(can)g(not)g(b)s(e)g(a)568 4309 + y(p)s(oin)m(ter)35 b(to)g(allo)s(cated)g(memory)-8 b(.)52 + b(Suc)m(h)37 b(an)e(instruction)h(is)g(alw)m(a)m(ys)g(in)g(error)f(if) + 568 4430 y(executed.)568 4591 y(Example:)568 4836 y Fg(#include)53 + b()1918 5251 y Fi(9)p eop end + %%Page: 10 10 + TeXDict begin 10 9 bop 568 548 a Fg(void)52 b(f\(\))g({)670 + 668 y(char)h(*x)e(=)h(\(char*\))h('y';)670 789 y(free\(x\);)568 + 909 y(})469 1131 y Fd(\017)c Fg(free)j(of)g(non-heap)h(memory.)568 + 1251 y Fi(A)46 b(free)g(instruction)h(ma)m(y)g(only)g(free)f(memory)h + (allo)s(cated)f(with)h(the)g(mallo)s(c)568 1372 y(instruction,)33 + b(not)g(with)g(allo)s(ca)f(nor)h(a)f(p)s(oin)m(ter)h(to)f(a)g(v)-5 + b(ariable.)568 1530 y(Example:)568 1752 y Fg(#include)53 + b()568 1993 y(void)f(f\(\))g({)670 2113 y(char)h(x;)670 + 2233 y(char)g(*y)e(=)h(&x;)670 2354 y(free\(y\);)568 + 2474 y(})469 2696 y Fd(\017)d Fg(write)j(to)g(constant)h(memory.)568 + 2816 y Fi(In)45 b(C,)g(a)f(v)-5 b(ariable)45 b(declared)h + Fg(const)g Fi(ma)m(y)g(not)e(b)s(e)h(mo)s(di\014ed,)k(although)44 + b(the)568 2936 y(compiler)24 b(will)h(not)e(stop)h(y)m(ou)g(if)g(y)m + (ou)g(tak)m(e)g(a)g(p)s(oin)m(ter)g(and)f(cast)h(a)m(w)m(a)m(y)h + (constness.)568 3095 y(Example:)568 3317 y Fg(void)52 + b(f\(\))g({)670 3437 y(char)h(*x)e(=)h("String!";)670 + 3557 y(x[0])h(=)e('s';)568 3678 y(})469 3900 y Fd(\017)e + Fg(write)j(to)g(function)h(pointer.)568 4020 y(read)f(from)g(function)i + (pointer.)568 4140 y Fi(The)47 b(p)s(oin)m(ter)g(b)s(eing)g(read)g(or)f + (written)i(is)f(kno)m(wn)h(to)e(b)s(e)h(the)g(address)h(of)e(a)568 + 4261 y(function.)568 4419 y(Example:)568 4641 y Fg(char)52 + b(f\(\))g({)670 4761 y(char)h(*F)e(=)h(f;)670 4882 y(return)h(*F;)568 + 5002 y(})1894 5251 y Fi(10)p eop end + %%Page: 11 11 + TeXDict begin 11 10 bop 469 548 a Fd(\017)49 b Fg(call)j(via)g + (non-function)j(pointer.)568 668 y Fi(The)34 b(input)g(co)s(de)f(tak)m + (es)h(a)f(p)s(oin)m(ter)h(to)f(a)g(v)-5 b(ariable)33 + b(or)g(allo)s(cated)g(memory)h(and)568 789 y(then)j(casts)g(it)g(in)m + (to)f(a)h(function)g(p)s(oin)m(ter)g(and)f(tries)h(to)g(call)f(it.)55 + b(In)37 b(some)h(rare)568 909 y(cases)j(this)f(ma)m(y)g(b)s(e)g(in)m + (ten)m(tional;)k(a)c(JITter)g(will)h(allo)s(cate)e(memory)i(to)e(emit) + 568 1029 y(target)27 b(instructions)j(for)d(execution.)44 + b(Ho)m(w)m(ev)m(er,)31 b(it)d(is)h(unp)s(ortable)f(and)g(target-)568 + 1150 y(sp)s(eci\014c,)40 b(and)d(the)g(b)s(eha)m(viour)h(is)g(not)f + (de\014ned)i(b)m(y)f(the)f(C)h(or)e(C++)i(language)568 + 1270 y(standard.)568 1432 y(Example:)568 1677 y Fg(void)52 + b(f\(\))g({)670 1797 y(char)h(x;)670 1918 y(char)g(*y)e(=)h(&x;)670 + 2038 y(void)h(\(*F\)\(\))f(=)g(\(void\(*\)\(\)\))i(y;)670 + 2159 y(F\(\);)568 2279 y(})470 2524 y Fi(None)23 b(of)f(these)h(errors) + g(rely)g(on)f(kno)m(wledge)i(of)e(the)h(t)m(yp)s(e)g(system,)k(so)22 + b(the)h(errors)g(are)324 2644 y(found)i(at)f(the)h(p)s(oin)m(t)g(of)f + (memory)h(op)s(eration,)h(not)f(at)f(a)g(p)s(oten)m(tially)i(harmless)g + (casting)324 2765 y(instruction.)41 b(In)23 b(this)g(con)m(text,)j(the) + e(term)f(\\function")f(refers)i(to)e(the)h(functions)h(visible)324 + 2885 y(at)32 b(link)h(time.)470 3005 y(All)39 b(of)g(the)g(examples)i + (compile)f(in)f(GCC)h(3.3)e(with)i(no)f(w)m(arnings,)j(ev)m(en)e(in)f + (full)324 3126 y(w)m(arnings)30 b(mo)s(de.)43 b(GCC)30 + b(3.4)f(and)h(up)g(note)f(that)h(casting)g(b)s(et)m(w)m(een)h(function) + f(p)s(oin)m(ter)324 3246 y(t)m(yp)s(es)k(and)e(data)h(p)s(oin)m(ter)g + (t)m(yp)s(es)h(is)f(in)m(v)-5 b(alid.)324 3579 y Fk(4)161 + b(T)-13 b(ec)l(hnical)52 b(No)l(v)l(elt)l(y)324 3798 + y Fi(Chec)m(k)m(er's)26 b(most)d(in)m(teresting)h(w)m(ork)g(is)f + (handled)g(b)m(y)h(the)f(p)s(oin)m(ter)g(analysis)h(mec)m(hanism)324 + 3918 y(to)35 b(follo)m(w)g(the)h(propagation)e(of)h(p)s(oin)m(ters)h + (through)f(the)h(program)f(\015o)m(w.)52 b(The)36 b(result)324 + 4039 y(is)30 b(that)f(at)g(an)m(y)h(p)s(oin)m(t)g(in)g(the)g(program,)f + (c)m(hec)m(k)m(er)k(can)c(pro)s(duce)i(a)e(list)h(of)f(all)g(p)s + (ossible)324 4159 y(memory)44 b(regions)f(b)s(eing)g(aliased)g(\(a)f + (shorter)i(list)f(than)g(the)g(list)g(of)f(all)h(p)s(oin)m(ters\),)324 + 4280 y(ev)m(en)34 b(in)f(a)f(t)m(yp)s(e-unsafe)i(program.)470 + 4400 y(The)40 b(issue)h(at)e(hand)h(is)g(whic)m(h)h(p)s(oin)m(ters)f(a) + f(giv)m(en)i(memory)f(op)s(eration)f(ma)m(y)h(b)s(e)324 + 4520 y(op)s(erating)31 b(on.)43 b(Although)31 b(some)i(op)s(erations)e + (ma)m(y)h(reduce)h(a)e(p)s(oin)m(ter|b)m(y)i(masking)324 + 4641 y(o\013)k(all)g(of)f(the)i(top)f(bits)g(for)g(example|could)i + (that)e(p)s(oin)m(ter)g(v)-5 b(alue)38 b(ha)m(v)m(e)g(b)s(een)g(cal-) + 324 4761 y(culated)e(and)g(used)h(in)f(this)g(instruction?)53 + b(As)37 b(written,)g(the)f(algorithm)f(errs)i(on)e(the)324 + 4881 y(side)e(of)g(caution.)43 b(Con)m(tin)m(uing)34 + b(our)f(example:)1894 5251 y(11)p eop end + %%Page: 12 12 + TeXDict begin 12 11 bop 324 548 a Fg(char)52 b(x;)324 + 789 y(char)g(*f\(\))324 909 y({)426 1029 y(long)h(ptr)f(=)f + (\(long\)&x;)426 1150 y(long)i(x)e(=)h(ptr)g(&)f(0x0000ffff;)426 + 1270 y(long)i(y)e(=)h(ptr)g(&)f(0xffff0000;)426 1391 + y(char)i(*p)e(=)h(\(char*\)\(x)i(+)d(y\);)426 1511 y(return)i(p;)324 + 1631 y(})470 1839 y Fi(Chec)m(k)m(er)36 b(nev)m(er)f(actually)f(pro)m + (v)m(es)i(that)d(p)s(oin)m(ter)h Fg(p)f Fi(is)h(correctly)h(p)s(oin)m + (ting)f(to)f(our)324 1959 y(c)m(haracter)41 b Fg(x)p + Fi(.)67 b(Through)40 b(data-\015o)m(w,)j(c)m(hec)m(k)m(er)g(kno)m(ws)f + (that)e(the)g(only)h(p)s(oin)m(ter)g(con-)324 2079 y(tributing)c(to)f + Fg(p)g Fi(is)h Fg(&x)p Fi(.)56 b(W)-8 b(e)37 b(can)f(then)h(state)g(is) + g(that)f(an)m(y)i(access)g(through)e Fg(p)h Fi(either)324 + 2200 y(refers)c(to)g Fg(&x)p Fi(,)g(or)f(else)i(refers)g(to)e + (indeterminate)j(memory)f(as)e(an)h(in)m(v)-5 b(alid)34 + b(access.)45 b(A)m(t)324 2320 y(this)33 b(time,)h(c)m(hec)m(k)m(er)i + (is)d(unable)h(to)e(determine)j(whether)f(the)f(\014nal)g(p)s(oin)m + (ter)g(is)h(in)f(fact)324 2441 y(v)-5 b(alid,)33 b(and)f(so)h(mak)m(es) + h(the)f(conserv)-5 b(ativ)m(e)35 b(assumption)f(that)e(it)h(is.)324 + 2727 y Fh(4.1)135 b(P)l(oin)l(ter)46 b(Analysis)324 2911 + y Fi(Chec)m(k)m(er's)31 b(metho)s(d)d(of)g(p)s(oin)m(ter)g(analysis)h + (is)g(\015o)m(w-based,)h(t)m(yp)s(e-ignoran)m(t)e(and)g(whole-)324 + 3032 y(program)g(approac)m(h)i(starting)f(with)g(the)h(p)s(oin)m(ts)f + (of)g(creation,)h(similar)g(to)e(Andersen's)324 3152 + y(Analysis[And94)r(])21 b(or)h(P)m(oin)m(ts-T)-8 b(o)23 + b(Analysis)g(using)f(Binary)h(Decision)f(Diagrams[BLQ)3531 + 3116 y Fe(+)3590 3152 y Fi(03)o(].)324 3273 y(P)m(oin)m(ts)49 + b(of)d(creation)i(are)g(explicit)h(allo)s(cations,)i(global)c(v)-5 + b(ariables)48 b(and)g(functions,)324 3393 y(whic)m(h)40 + b(ma)m(y)g(b)s(e)f(dereferenced.)65 b(Eac)m(h)40 b(of)e(these)i(allo)s + (cations)f(is)h(a)e(region)h(from)g(the)324 3513 y(base)33 + b(p)s(oin)m(ter)g(up)g(to)f(a)h(size)g(whic)m(h)h(ma)m(y)g(not)e(b)s(e) + h(kno)m(wn)h(un)m(til)f(execution)h(time.)470 3634 y(The)29 + b(set)h(of)d(instructions)j(op)s(erating)f(on)f(these)i(p)s(oin)m(ters) + f(is)g(then)g(calculated)g(as)g(a)324 3754 y(transitiv)m(e)37 + b(closure)g(through)e(the)h(instructions.)54 b(Eac)m(h)37 + b(instruction)g(is)f(tagged)f(with)324 3874 y(the)i(exhaustiv)m(e)j + (set)e(of)e(p)s(oin)m(ters)i(that)f(its)g(result)h(ma)m(y)g(b)s(e)f(an) + g(expression)i(of.)57 b(The)324 3995 y(algorithm)32 b(to)g(ac)m(hiev)m + (e)j(this)e(is)g(describ)s(ed)i(b)m(y)e(three)h(discrete)g(passes:)443 + 4202 y(1.)49 b(Starting)31 b(at)g(eac)m(h)i(p)s(oin)m(t)e(of)g + (creation,)h(iterate)g(through)g(the)g(list)g(of)f(users)h(and)568 + 4322 y(follo)m(w)24 b(through)g(its)h(users)g(transitiv)m(ely)-8 + b(.)43 b(This)25 b(pro)s(duces)g(a)f(tree)h(where)g(the)g(leaf)568 + 4443 y(no)s(des)i(are)h(memory)g(loads,)h(or)d(instructions)j(that)e + (ha)m(v)m(e)i(no)e(useful)h(result)g(suc)m(h)568 4563 + y(as)d(branc)m(hes,)j(memory)e(stores)g(or)f(frees.)41 + b(The)26 b(result)g(of)f(an)m(y)g(other)g(instruction)568 + 4684 y(is)33 b(assumed)h(to)e(b)s(e)h(a)f(function)h(of)f(the)i(base)f + (p)s(oin)m(ter.)443 4882 y(2.)49 b(The)37 b(load-store)f(pairing)g + (pass)i(\014nds)f(matc)m(hing)g(store)g(instructions)h(for)e(eac)m(h) + 568 5002 y(load)c(instruction)h(to)f(see)i(if)e(a)g(p)s(oin)m(ter)h + (could)g(ha)m(v)m(e)h(b)s(een)f(stored)g(there.)44 b(If)32 + b(so,)1894 5251 y(12)p eop end + %%Page: 13 13 + TeXDict begin 13 12 bop 568 548 a Fi(the)33 b(result)g(of)g(this)g + (load)g(instruction)h(is)f(also)g(tagged)f(with)h(the)h(same)f(p)s(oin) + m(ter)568 668 y(and)f(w)m(e)i(m)m(ust)g(rep)s(eat)e(step)i(one.)568 + 830 y(As)26 b(w)m(ell)g(as)g(stores,)i(w)m(e)f(also)e(pair)h(loads)f + (with)h(global)g(v)-5 b(ariables)26 b(that)f(ma)m(y)h(ha)m(v)m(e)568 + 951 y(b)s(een)33 b(initialized)h(with)f(the)g(address)h(of)e(another)h + (global)f(v)-5 b(ariable.)443 1154 y(3.)49 b(Finally)-8 + b(,)42 b(a)e(p)s(oin)m(ter)g(ma)m(y)h(b)s(e)g(laundered)g(through)f + (the)h(CF)m(G.)f(The)h(example)568 1274 y(program)46 + b(on)h(the)h(follo)m(wing)f(page)g(demonstrates)i(this)f(tec)m(hnique)h + (using)f(a)568 1395 y(branc)m(h)26 b(instruction)i(to)d(c)m(ho)s(ose)i + (a)f(basic)g(blo)s(c)m(k)h(based)g(on)f(a)f(bit)i(in)f(the)g(p)s(oin)m + (ter.)568 1515 y(Eac)m(h)31 b(basic)g(blo)s(c)m(k)g(stores)g(0)f(or)g + (1)g(to)g(an)g(arra)m(y)-8 b(.)43 b(There)31 b(is)g(no)f(direct)h(data) + f(\015o)m(w)568 1636 y(from)35 b(the)g(p)s(oin)m(ter)h(in)m(to)g(the)f + (arra)m(y)-8 b(.)52 b(Rep)s(eat)35 b(this)h(32)f(times)h(to)f(leak)h(a) + f(32-bit)568 1756 y(p)s(oin)m(ter.)568 1918 y(In)23 b(order)g(to)g + (detect)h(this,)i(w)m(e)e(note)f(an)m(y)g(branc)m(h)h(statemen)m(t)h + (that)e(is)g(conditional)568 2038 y(on)36 b(a)h(p)s(oin)m(ter)g(v)-5 + b(alue.)57 b(The)37 b(p)s(oin)m(ter)h(v)-5 b(alue)37 + b(is)g(assumed)i(to)d(b)s(e)h(kno)m(wn)h(in)f(the)568 + 2159 y(basic)h(blo)s(c)m(ks)g(link)m(ed)h(to)e(from)g(the)g(branc)m(h,) + j(and)d(transitiv)m(ely)i(in)f(the)f(blo)s(c)m(ks)568 + 2279 y(that)h(it)h(leads)h(to,)g(ending)g(where)g(the)g(paths)f(of)g + (the)g(branc)m(h)h(con)m(v)m(erge.)64 b(W)-8 b(e)568 + 2399 y(calculate)28 b(this)g(b)m(y)h(taking)f(the)g(set)g(of)f(basic)h + (blo)s(c)m(ks)h(reac)m(hable)g(starting)f(at)f(the)568 + 2520 y(branc)m(h,)h(and)e(remo)m(ving)h(the)g(in)m(tersection)h(of)d + (basic)i(blo)s(c)m(ks)g(reac)m(hable)h(b)m(y)f(eac)m(h)568 + 2640 y(of)38 b(the)h(branc)m(h's)h(conditions.)63 b(The)40 + b(result)f(is)h(the)f(set)g(of)f(blo)s(c)m(ks)j(that)d(could)568 + 2760 y(exp)s(ose)c(the)f(p)s(oin)m(ter)g(v)-5 b(alue.)568 + 2922 y(Within)31 b(these)i(blo)s(c)m(ks,)f(an)m(y)g(store)f(to)g + (memory)h(could)g(p)s(oten)m(tially)g(b)s(e)f(leaking)568 + 3043 y(the)e(p)s(oin)m(ter,)i(ev)m(en)g(the)f(store)g(of)f(a)g(constan) + m(t.)43 b(As)30 b(suc)m(h)h(all)e(stores)h(are)g(tagged.)568 + 3163 y(More)42 b(improbable)g(is)g(that)g(the)g(result)g(of)f(all)h + (loads)g(m)m(ust)g(also)g(b)s(e)g(tagged.)568 3284 y(One)47 + b(example)h(w)m(ould)g(b)s(e)f(a)g(32)f(lev)m(els)j(of)e(nested)h(if)f + (statemen)m(ts)i(uniquely)568 3404 y(iden)m(tifying)39 + b(eac)m(h)g(p)s(ossible)g(v)-5 b(alue)39 b(of)e(a)h(32-bit)f(p)s(oin)m + (ter,)j(then)f(dereferencing)568 3524 y(that)32 b(constan)m(t)h(v)-5 + b(alue.)568 3686 y(After)39 b(that,)i(newly)g(de\014ned)g(SSA)f(v)-5 + b(ariables)40 b(inside)h(these)g(basic)f(blo)s(c)m(ks)h(are)568 + 3807 y(tagged.)f(The)26 b(successor)h(blo)s(c)m(ks)f(are)f(c)m(hec)m(k) + m(ed)j(to)c(see)i(if)f(there)g(are)g(an)m(y)h Ff(\036)p + Fi(-no)s(des)568 3927 y(leading)h(bac)m(k)h(in)m(to)f(the)g(set.)42 + b(If)27 b(so,)h(they)g(are)e(tagged)h(as)g(w)m(ell.)42 + b(No)m(w)28 b(that)e(these)568 4047 y(new)38 b(instructions)i(ha)m(v)m + (e)f(b)s(een)f(added)g(to)g(the)g(closure,)i(w)m(e)f(m)m(ust)f(rep)s + (eat)g(the)568 4168 y(algorithm)32 b(starting)h(at)f(step)h(one.)470 + 4396 y(Through)50 b(this)g(algorithm,)k(the)c(c)m(hec)m(k)m(er)j(solv)m + (es)e(for)e(the)h(set)h(of)e(all)g(p)s(ossible)324 4516 + y(p)s(oin)m(ter)33 b(v)-5 b(alues)33 b(in)m(v)m(olv)m(ed)i(in)e(the)g + (execution)h(of)f(an)m(y)g(giv)m(en)g(instruction.)1894 + 5251 y(13)p eop end + %%Page: 14 14 + TeXDict begin 14 13 bop 324 4767 a @beginspecial 36 @llx + 36 @lly 1012 @urx 1334 @ury 3885 @rwi @setspecial + %%BeginDocument: example1.ps + %!PS-Adobe-2.0 + %%Creator: dot version 2.8 (Sun Apr 9 22:27:31 UTC 2006) + %%For: (nicholas) Nicholas + %%Title: example1 + %%Pages: (atend) + %%BoundingBox: 36 36 1012 1334 + %%EndComments + save + %%BeginProlog + /DotDict 200 dict def + DotDict begin + + /setupLatin1 { + mark + /EncodingVector 256 array def + EncodingVector 0 + + ISOLatin1Encoding 0 255 getinterval putinterval + EncodingVector 45 /hyphen put + + % Set up ISO Latin 1 character encoding + /starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont + } def + /Times-Roman starnetISO def + /Times-Italic starnetISO def + /Times-Bold starnetISO def + /Times-BoldItalic starnetISO def + /Helvetica starnetISO def + /Helvetica-Oblique starnetISO def + /Helvetica-Bold starnetISO def + /Helvetica-BoldOblique starnetISO def + /Courier starnetISO def + /Courier-Oblique starnetISO def + /Courier-Bold starnetISO def + /Courier-BoldOblique starnetISO def + cleartomark + } bind def + + %%BeginResource: procset graphviz 0 0 + /coord-font-family /Times-Roman def + /default-font-family /Times-Roman def + /coordfont coord-font-family findfont 8 scalefont def + + /InvScaleFactor 1.0 def + /set_scale { + dup 1 exch div /InvScaleFactor exch def + dup scale + } bind def + + % styles + /solid { [] 0 setdash } bind def + /dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def + /dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def + /invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def + /bold { 2 setlinewidth } bind def + /filled { } bind def + /unfilled { } bind def + /rounded { } bind def + /diagonals { } bind def + + % hooks for setting color + /nodecolor { sethsbcolor } bind def + /edgecolor { sethsbcolor } bind def + /graphcolor { sethsbcolor } bind def + /nopcolor {pop pop pop} bind def + + /beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if + } bind def + + /set_font { + findfont exch + scalefont setfont + } def + + % draw aligned label in bounding box aligned to current point + /alignedtext { % width adj text + /text exch def + /adj exch def + /width exch def + gsave + width 0 gt { + text stringwidth pop adj mul 0 rmoveto + } if + [] 0 setdash + text show + grestore + } def + + /boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath + } bind def + + /ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix + } bind def + + /endpage { showpage } bind def + /showpage { } def + + /layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] + def + + /layerlen layercolorseq length def + + /setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def + } bind def + + /onlayer { curlayer ne {invis} if } def + + /onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if + } def + + /curlayer 0 def + + %%EndResource + %%EndProlog + %%BeginSetup + 14 default-font-family set_font + 1 setmiterlimit + % /arrowlength 10 def + % /arrowwidth 5 def + + % make sure pdfmark is harmless for PS-interpreters other than Distiller + /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse + % make '<<' and '>>' safe on PS Level 1 devices + /languagelevel where {pop languagelevel}{1} ifelse + 2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put + } if + + %%EndSetup + %%Page: 1 1 + %%PageBoundingBox: 36 36 1012 1334 + %%PageOrientation: Portrait + gsave + 36 36 976 1298 boxprim clip newpath + 36 36 translate + 0 0 1 beginpage + 1.0000 set_scale + 4 4 translate 0 rotate + 0.000 0.000 1.000 graphcolor + 0.000 0.000 1.000 graphcolor + newpath -6 -6 moveto + -6 1296 lineto + 974 1296 lineto + 974 -6 lineto + closepath + fill + 0.000 0.000 1.000 graphcolor + newpath -6 -6 moveto + -6 1296 lineto + 974 1296 lineto + 974 -6 lineto + closepath + stroke + 0.000 0.000 0.000 graphcolor + 14.00 /Times-Roman set_font + gsave 10 dict begin + 417 7 moveto + (CFG for 'main' function) + [9.36 7.68 10.08 3.6 4.08 6.96 4.8 3.6 2.64 10.8 6.24 3.84 6.96 2.64 3.6 4.56 6.96 6.96 6.24 3.84 3.84 6.96 6.96] + xshow + end grestore + % Node0x85fc3c8 + gsave 10 dict begin + newpath 450 1146 moveto + 649 1146 lineto + 649 1290 lineto + 450 1290 lineto + closepath + stroke + gsave 10 dict begin + 458 1273 moveto + (entry:) + [6.24 6.96 3.84 5.04 6.72 3.84] + xshow + 458 1257 moveto + ( %t = alloca int ) + [3.6 11.76 3.84 3.6 7.92 3.6 6.24 3.84 3.84 6.96 6.24 6.24 3.6 3.84 6.96 3.84 3.6] + xshow + 458 1241 moveto + ( %v = alloca [32 x bool] ) + [3.6 11.76 6.96 3.6 7.92 3.6 6.24 3.84 3.84 6.96 6.24 6.24 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 3.6] + xshow + 458 1225 moveto + ( call void %__main\( \)) + [3.6 6.24 6.24 3.84 3.84 3.6 6.48 6.96 3.84 6.96 3.6 11.76 6.96 6.96 10.8 6.24 3.84 6.96 4.56 3.6 4.56] + xshow + 458 1209 moveto + ( store int 42, int* %t) + [3.6 5.28 3.84 6.96 4.8 6.24 3.6 3.84 6.96 3.84 3.6 6.96 6.96 3.6 3.6 3.84 6.96 3.84 6.96 3.6 11.76 3.84] + xshow + 458 1193 moveto + ( %tmp.6 = cast int* %t to ulong ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 6.96 3.6 11.76 3.84 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6] + xshow + 458 1177 moveto + ( br label %no_exit.0) + [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96] + xshow + end grestore + newpath 450 1170 moveto + 649 1170 lineto + stroke + gsave 10 dict begin + 549 1153 moveto 5.0 -0.5 ( ) alignedtext + end grestore + end grestore + % Node0x85feac8 + gsave 10 dict begin + newpath 328 948 moveto + 771 948 lineto + 771 1108 lineto + 328 1108 lineto + closepath + stroke + gsave 10 dict begin + 336 1091 moveto + (no_exit.0: ) + [6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.84 3.6] + xshow + 336 1075 moveto + ( %i.0.0.0 = phi uint [ 0, %entry ], [ %inc.08, %then.0 ], [ %inc.0, %else.0 ] ) + [3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 4.56 3.6 6.96 3.6 3.6 11.76 6.24 6.96 3.84 5.04 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 6.96 6.24 3.6 6.96 6.96 3.6 3.6 11.76 4.08 6.96 6.24 6.96 3.6 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 6.96 6.24 3.6 6.96 3.6 3.6 11.76 6.24 3.84 5.52 6.24 3.6 6.96 3.6 4.56 3.6] + xshow + 336 1059 moveto + ( %tmp.11 = cast uint %i.0.0.0 to ubyte ) + [3.6 11.76 3.84 10.56 6.96 2.64 5.76 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 6.96 6.48 6.96 3.84 6.24 3.6] + xshow + 336 1043 moveto + ( %tmp.12 = shl int 1, ubyte %tmp.11 ) + [3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 7.92 3.6 5.52 6.96 3.84 3.6 3.84 6.96 3.84 3.6 6.24 3.6 3.6 6.96 6.48 6.96 3.84 6.24 3.6 11.76 3.84 10.56 6.96 2.64 5.76 6.96 3.6] + xshow + 336 1027 moveto + ( %tmp.13 = cast int %tmp.12 to ulong ) + [3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6] + xshow + 336 1011 moveto + ( %tmp.15 = and ulong %tmp.13, %tmp.6 ) + [3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6] + xshow + 336 995 moveto + ( %tmp.16 = seteq ulong %tmp.15, 0 ) + [3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 7.92 3.6 5.52 6 3.84 6.24 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6.48 6.96 3.6 3.6 6.96 3.6] + xshow + 336 979 moveto + ( br bool %tmp.16, label %else.0, label %then.0) + [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.24 3.84 5.52 6.24 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 4.08 6.96 6.24 6.96 3.6 6.96] + xshow + end grestore + newpath 328 972 moveto + 771 972 lineto + stroke + gsave 10 dict begin + 439 955 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 550 948 moveto + 550 972 lineto + stroke + gsave 10 dict begin + 660 955 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85fc3c8->Node0x85feac8 + newpath 549 1146 moveto + 549 1139 549 1129 549 1118 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 553 1118 moveto + 549 1108 lineto + 546 1118 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 553 1118 moveto + 549 1108 lineto + 546 1118 lineto + closepath + stroke + end grestore + % Node0x85fedb0 + gsave 10 dict begin + newpath 176 766 moveto + 565 766 lineto + 565 910 lineto + 176 910 lineto + closepath + stroke + gsave 10 dict begin + 184 893 moveto + (else.0: ) + [6.24 3.84 5.52 6.24 3.6 6.96 3.84 3.6] + xshow + 184 877 moveto + ( %tmp.21 = cast uint %i.0.0.0 to long ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.24 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 6.96 6.96 3.6] + xshow + 184 861 moveto + ( %tmp.22 = getelementptr [32 x bool]* %v, long 0, long %tmp.21 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 6.96 3.6 11.76 6 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.24 6.96 3.6] + xshow + 184 845 moveto + ( store bool false, bool* %tmp.22) + [3.6 5.28 3.84 6.96 4.8 6.24 3.6 6.96 6.96 6.96 3.84 3.6 4.32 6.24 3.84 5.52 6.24 3.6 3.6 6.96 6.96 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96] + xshow + 184 829 moveto + ( %inc.0 = add uint %i.0.0.0, 1 ) + [3.6 11.76 3.84 6.96 6.24 3.6 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.6 6.96 3.6] + xshow + 184 813 moveto + ( %tmp.8 = setgt uint %inc.0, 31 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6 7.92 3.6 5.52 6 3.84 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 6.96 6.24 3.6 6.96 3.6 3.6 6 6.96 3.6] + xshow + 184 797 moveto + ( br bool %tmp.8, label %loopexit.0, label %no_exit.0) + [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96] + xshow + end grestore + newpath 176 790 moveto + 565 790 lineto + stroke + gsave 10 dict begin + 273 773 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 371 766 moveto + 371 790 lineto + stroke + gsave 10 dict begin + 468 773 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85feac8->Node0x85fedb0 + newpath 432 948 moveto + 428 940 422 930 416 919 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 419 917 moveto + 411 910 lineto + 413 920 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 419 917 moveto + 411 910 lineto + 413 920 lineto + closepath + stroke + end grestore + % Node0x85fec60 + gsave 10 dict begin + newpath 582 766 moveto + 968 766 lineto + 968 910 lineto + 582 910 lineto + closepath + stroke + gsave 10 dict begin + 590 893 moveto + (then.0: ) + [4.08 6.96 6.24 6.96 3.6 6.96 3.84 3.6] + xshow + 590 877 moveto + ( %tmp.18 = cast uint %i.0.0.0 to long ) + [3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 6.96 6.96 3.6] + xshow + 590 861 moveto + ( %tmp.19 = getelementptr [32 x bool]* %v, long 0, long %tmp.18 ) + [3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6 7.92 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 6.96 3.6 11.76 6 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6 6.96 3.6] + xshow + 590 845 moveto + ( store bool true, bool* %tmp.19) + [3.6 5.28 3.84 6.96 4.8 6.24 3.6 6.96 6.96 6.96 3.84 3.6 3.84 5.04 6.96 6.24 3.6 3.6 6.96 6.96 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 2.64 6 6.96] + xshow + 590 829 moveto + ( %inc.08 = add uint %i.0.0.0, 1 ) + [3.6 11.76 3.84 6.96 6.24 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 3.6 6.96 3.6 6.96 3.6 6.96 3.6 3.6 6.96 3.6] + xshow + 590 813 moveto + ( %tmp.811 = setgt uint %inc.08, 31 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6 5.76 6.96 3.6 7.92 3.6 5.52 6 3.84 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 6.96 6.24 3.6 6.96 6.96 3.6 3.6 6 6.96 3.6] + xshow + 590 797 moveto + ( br bool %tmp.811, label %loopexit.0, label %no_exit.0) + [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6 5.76 6.24 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96] + xshow + end grestore + newpath 582 790 moveto + 968 790 lineto + stroke + gsave 10 dict begin + 678 773 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 775 766 moveto + 775 790 lineto + stroke + gsave 10 dict begin + 871 773 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85feac8->Node0x85fec60 + newpath 686 948 moveto + 694 943 703 937 711 930 curveto + 715 926 719 922 722 918 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 725 920 moveto + 729 910 lineto + 720 915 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 725 920 moveto + 729 910 lineto + 720 915 lineto + closepath + stroke + end grestore + % Node0x85fedb0->Node0x85feac8 + newpath 472 790 moveto + 480 817 502 883 520 938 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 517 939 moveto + 523 948 lineto + 523 937 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 517 939 moveto + 523 948 lineto + 523 937 lineto + closepath + stroke + end grestore + % Node0x85ff7f0 + gsave 10 dict begin + newpath 459 664 moveto + 589 664 lineto + 589 728 lineto + 459 728 lineto + closepath + stroke + gsave 10 dict begin + 467 711 moveto + (loopexit.0: ) + [3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.84 3.6] + xshow + 467 695 moveto + ( br label %no_exit.1) + [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96] + xshow + end grestore + newpath 459 688 moveto + 589 688 lineto + stroke + gsave 10 dict begin + 524 671 moveto 5.0 -0.5 ( ) alignedtext + end grestore + end grestore + % Node0x85fedb0->Node0x85ff7f0 + newpath 313 766 moveto + 349 754 405 736 449 721 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 450 724 moveto + 459 718 lineto + 448 718 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 450 724 moveto + 459 718 lineto + 448 718 lineto + closepath + stroke + end grestore + % Node0x85fec60->Node0x85feac8 + newpath 855 790 moveto + 820 817 732 886 659 942 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 657 939 moveto + 651 948 lineto + 661 945 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 657 939 moveto + 651 948 lineto + 661 945 lineto + closepath + stroke + end grestore + % Node0x85fec60->Node0x85ff7f0 + newpath 654 766 moveto + 637 757 615 745 593 733 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 594 730 moveto + 584 728 lineto + 591 736 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 594 730 moveto + 584 728 lineto + 591 736 lineto + closepath + stroke + end grestore + % Node0x85ffc18 + gsave 10 dict begin + newpath 320 482 moveto + 729 482 lineto + 729 626 lineto + 320 626 lineto + closepath + stroke + gsave 10 dict begin + 328 609 moveto + (no_exit.1: ) + [6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96 3.84 3.6] + xshow + 328 593 moveto + ( %i.1.0.0 = phi uint [ 0, %loopexit.0 ], [ %indvar.next, %loopentry.1 ] ) + [3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 3.84 3.6 4.56 3.6 6.96 3.6 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 6.96 6.96 6.72 6.24 4.08 3.6 6.96 5.76 6.96 3.84 3.6 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96 3.6 4.56 3.6] + xshow + 328 577 moveto + ( %ri.1.0 = phi ulong [ undef, %loopexit.0 ], [ %ri.0.0, %loopentry.1 ] ) + [3.6 11.76 5.04 3.84 2.64 6.24 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 6.96 6.96 3.6 4.56 3.6 6.96 6.96 6.96 6.24 4.56 3.6 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 3.6 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 5.04 3.84 3.6 6.96 3.6 6.96 3.6 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96 3.6 4.56 3.6] + xshow + 328 561 moveto + ( %tmp.27 = cast uint %i.1.0.0 to long ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.72 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 6.96 6.96 3.6] + xshow + 328 545 moveto + ( %tmp.28 = getelementptr [32 x bool]* %v, long 0, long %tmp.27 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 6.96 6.96 3.6 6.96 3.6 6.96 6.96 6.96 3.84 4.56 6.96 3.6 11.76 6 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.72 6.96 3.6] + xshow + 328 529 moveto + ( %tmp.29 = load bool* %tmp.28 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 3.84 6.96 6.24 6.96 3.6 6.96 6.96 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6] + xshow + 328 513 moveto + ( br bool %tmp.29, label %then.1, label %else.1) + [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 4.08 6.96 6.24 6.96 2.64 6.24 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.24 3.84 5.52 6.24 2.64 6.96] + xshow + end grestore + newpath 320 506 moveto + 729 506 lineto + stroke + gsave 10 dict begin + 422 489 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 525 482 moveto + 525 506 lineto + stroke + gsave 10 dict begin + 627 489 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85ff7f0->Node0x85ffc18 + newpath 524 664 moveto + 524 656 524 647 524 636 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 528 636 moveto + 524 626 lineto + 521 636 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 528 636 moveto + 524 626 lineto + 521 636 lineto + closepath + stroke + end grestore + % Node0x85ffe00 + gsave 10 dict begin + newpath 258 308 moveto + 497 308 lineto + 497 436 lineto + 258 436 lineto + closepath + stroke + gsave 10 dict begin + 266 419 moveto + (then.1: ) + [4.08 6.96 6.24 6.96 2.64 6.96 3.84 3.6] + xshow + 266 403 moveto + ( %tmp.32 = cast uint %i.1.0.0 to ubyte ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 6.96 6.48 6.96 3.84 6.24 3.6] + xshow + 266 387 moveto + ( %tmp.33 = shl int 1, ubyte %tmp.32 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 5.52 6.96 3.84 3.6 3.84 6.96 3.84 3.6 6.24 3.6 3.6 6.96 6.48 6.96 3.84 6.24 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6] + xshow + 266 371 moveto + ( %tmp.34 = cast int %tmp.33 to ulong ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6] + xshow + 266 355 moveto + ( %tmp.36 = or ulong %tmp.34, %ri.1.0 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.96 4.8 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 11.76 5.04 3.84 2.64 6.24 3.6 6.96 3.6] + xshow + 266 339 moveto + ( br label %loopentry.1) + [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96] + xshow + end grestore + newpath 258 332 moveto + 497 332 lineto + stroke + gsave 10 dict begin + 377 315 moveto 5.0 -0.5 ( ) alignedtext + end grestore + end grestore + % Node0x85ffc18->Node0x85ffe00 + newpath 418 482 moveto + 415 473 410 460 404 446 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 407 445 moveto + 401 436 lineto + 401 447 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 407 445 moveto + 401 436 lineto + 401 447 lineto + closepath + stroke + end grestore + % Node0x85ffee0 + gsave 10 dict begin + newpath 552 300 moveto + 800 300 lineto + 800 444 lineto + 552 444 lineto + closepath + stroke + gsave 10 dict begin + 560 427 moveto + (else.1: ) + [6.24 3.84 5.52 6.24 2.64 6.96 3.84 3.6] + xshow + 560 411 moveto + ( %tmp.39 = cast uint %i.1.0.0 to ubyte ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 6.96 6.48 6.96 3.84 6.24 3.6] + xshow + 560 395 moveto + ( %tmp.40 = shl int 1, ubyte %tmp.39 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 5.52 6.96 3.84 3.6 3.84 6.96 3.84 3.6 6.24 3.6 3.6 6.96 6.48 6.96 3.84 6.24 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6] + xshow + 560 379 moveto + ( %tmp.41 = xor int %tmp.40, -1 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 7.92 3.6 6.24 6.96 4.8 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 4.56 6.96 3.6] + xshow + 560 363 moveto + ( %tmp.42 = cast int %tmp.41 to ulong ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 3.84 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6] + xshow + 560 347 moveto + ( %tmp.44 = and ulong %tmp.42, %ri.1.0 ) + [3.6 11.76 3.84 10.56 6.96 3.6 7.2 6.96 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 11.76 5.04 3.84 2.64 6.24 3.6 6.96 3.6] + xshow + 560 331 moveto + ( br label %loopentry.1) + [3.6 6.96 4.8 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96] + xshow + end grestore + newpath 552 324 moveto + 800 324 lineto + stroke + gsave 10 dict begin + 676 307 moveto 5.0 -0.5 ( ) alignedtext + end grestore + end grestore + % Node0x85ffc18->Node0x85ffee0 + newpath 632 482 moveto + 635 474 639 465 643 454 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 647 455 moveto + 647 444 lineto + 640 452 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 647 455 moveto + 647 444 lineto + 640 452 lineto + closepath + stroke + end grestore + % Node0x85ffd60 + gsave 10 dict begin + newpath 237 150 moveto + 620 150 lineto + 620 262 lineto + 237 262 lineto + closepath + stroke + gsave 10 dict begin + 245 245 moveto + (loopentry.1: ) + [3.84 6.96 6.96 6.96 6.24 6.96 3.84 5.04 6 2.64 6.96 3.84 3.6] + xshow + 245 229 moveto + ( %ri.0.0 = phi ulong [ %tmp.36, %then.1 ], [ %tmp.44, %else.1 ] ) + [3.6 11.76 5.04 3.84 3.6 6.96 3.6 6.96 3.6 7.92 3.6 6.96 6.96 3.84 3.6 6.96 3.84 6.96 6.96 6.96 3.6 4.56 3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 3.6 11.76 4.08 6.96 6.24 6.96 2.64 6.96 3.6 4.56 3.6 3.6 4.56 3.6 11.76 3.84 10.56 6.96 3.6 7.2 6.96 3.6 3.6 11.76 6.24 3.84 5.52 6.24 2.64 6.96 3.6 4.56 3.6] + xshow + 245 213 moveto + ( %indvar.next = add uint %i.1.0.0, 1 ) + [3.6 11.76 3.84 6.96 6.96 6.72 6.24 4.08 3.6 6.96 5.76 6.96 3.84 3.6 7.92 3.6 6.24 6.96 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 2.64 6.24 3.6 6.96 3.6 6.96 3.6 3.6 6.96 3.6] + xshow + 245 197 moveto + ( %exitcond = seteq uint %indvar.next, 32 ) + [3.6 11.76 5.76 6.96 3.84 3.84 6.24 6.96 6.96 6.96 3.6 7.92 3.6 5.52 6 3.84 6.24 6.96 3.6 6.96 3.84 6.96 3.84 3.6 11.76 3.84 6.96 6.96 6.72 6.24 4.08 3.6 6.96 5.76 6.96 3.84 3.6 3.6 6.96 6.96 3.6] + xshow + 245 181 moveto + ( br bool %exitcond, label %loopexit.1, label %no_exit.1) + [3.6 6.96 4.8 3.6 6.96 6.96 6.96 3.84 3.6 11.76 5.76 6.96 3.84 3.84 6.24 6.96 6.96 6.96 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.24 3.6 3.6 3.84 6.24 6.96 6.24 3.84 3.6 11.76 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96] + xshow + end grestore + newpath 237 174 moveto + 620 174 lineto + stroke + gsave 10 dict begin + 333 157 moveto 9.0 -0.5 (T) alignedtext + end grestore + newpath 429 150 moveto + 429 174 lineto + stroke + gsave 10 dict begin + 524 157 moveto 8.0 -0.5 (F) alignedtext + end grestore + end grestore + % Node0x85ffd60->Node0x85ffc18 + newpath 524 174 moveto + 524 218 524 374 524 472 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 521 472 moveto + 524 482 lineto + 528 472 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 521 472 moveto + 524 482 lineto + 528 472 lineto + closepath + stroke + end grestore + % Node0x86002b0 + gsave 10 dict begin + newpath 0 24 moveto + 667 24 lineto + 667 112 lineto + 0 112 lineto + closepath + stroke + gsave 10 dict begin + 8 95 moveto + (loopexit.1: ) + [3.84 6.96 6.96 6.96 5.76 6.96 3.84 3.84 2.64 6.96 3.84 3.6] + xshow + 8 79 moveto + ( %tmp.47 = cast ulong %ri.0.0 to int* ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.48 6.96 3.6 7.92 3.6 6.24 6.24 5.28 3.84 3.6 6.96 3.84 6.96 6.96 6.96 3.6 11.76 5.04 3.84 3.6 6.96 3.6 6.96 3.6 3.84 6.96 3.6 3.84 6.96 3.84 6.96 3.6] + xshow + 8 63 moveto + ( %tmp.51 = load int* %tmp.47 ) + [3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 7.92 3.6 3.84 6.96 6.24 6.96 3.6 3.84 6.96 3.84 6.96 3.6 11.76 3.84 10.56 6.96 3.6 6.48 6.96 3.6] + xshow + 8 47 moveto + ( %tmp.48 = call int \(sbyte*, ...\)* %printf\( sbyte* getelementptr \([4 x sbyte]* %.str_5, long 0, long 0\), int %tmp.51 \) ) + [3.6 11.76 3.84 10.56 6.96 3.6 6.96 6.96 3.6 7.92 3.6 6.24 6.24 3.84 3.84 3.6 3.84 6.96 3.84 3.6 4.56 5.52 6.48 6.96 3.84 6.24 6.96 3.6 3.6 3.6 3.6 3.6 4.56 6.96 3.6 11.76 6.96 5.04 3.84 6.96 3.84 4.56 4.56 3.6 5.52 6.48 6.96 3.84 6.24 6.96 3.6 6.72 6 3.84 6.24 3.84 6.24 10.8 6.24 6.96 3.84 6.96 3.84 4.8 3.6 4.56 4.56 6.96 3.6 6.96 3.6 5.52 6.48 6.96 3.84 6.24 4.56 6.96 3.6 11.76 3.6 5.28 3.84 4.8 6.96 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 3.6 3.6 3.84 6.96 6.96 6.96 3.6 6.96 4.56 3.6 3.6 3.84 6.96 3.84 3.6 11.76 3.84 10.56 6.96 3.6 6 6.96 3.6 4.56 3.6] + xshow + 8 31 moveto + ( ret int 0) + [3.6 4.8 6 3.84 3.6 3.84 6.96 3.84 3.6 6.96] + xshow + end grestore + end grestore + % Node0x85ffd60->Node0x86002b0 + newpath 333 150 moveto + 333 142 333 133 333 122 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 337 122 moveto + 333 112 lineto + 330 122 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 337 122 moveto + 333 112 lineto + 330 122 lineto + closepath + stroke + end grestore + % Node0x85ffe00->Node0x85ffd60 + newpath 383 308 moveto + 387 299 393 286 399 272 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 403 273 moveto + 403 262 lineto + 396 270 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 403 273 moveto + 403 262 lineto + 396 270 lineto + closepath + stroke + end grestore + % Node0x85ffee0->Node0x85ffd60 + newpath 646 300 moveto + 625 291 597 279 567 266 curveto + stroke + gsave 10 dict begin + solid + 1 setlinewidth + 0.000 0.000 0.000 edgecolor + newpath 569 263 moveto + 558 262 lineto + 566 269 lineto + closepath + fill + 0.000 0.000 0.000 edgecolor + newpath 569 263 moveto + 558 262 lineto + 566 269 lineto + closepath + stroke + end grestore + endpage + showpage + grestore + %%PageTrailer + %%EndPage: 1 + %%Trailer + %%Pages: 1 + end + restore + %%EOF + + %%EndDocument + @endspecial 388 4970 a Fi(Figure)32 b(1:)44 b(Break)33 + b(up)g(a)f(p)s(oin)m(ter)h(in)m(to)g(an)f(arra)m(y)h(of)f(b)s(o)s + (oleans)h(and)f(reassem)m(ble)k(it)1894 5251 y(14)p eop + end + %%Page: 15 15 + TeXDict begin 15 14 bop 324 548 a Fk(5)161 b(F)-13 b(uture)52 + b(W)-13 b(ork)324 767 y Fi(The)25 b(implemen)m(tation)i(is)e(missing)h + (some)g(critical)f(features)g(prev)m(en)m(ting)i(it)e(from)f(b)s(eing) + 324 887 y(used)g(to)e(v)m(erify)i(real)f(w)m(orld)g(soft)m(w)m(are.)41 + b(Primarily)-8 b(,)26 b(it)c(lac)m(ks)i(in)m(terpro)s(cedural)g + (analysis.)324 1008 y(Note)36 b(that)h(this)g(is)g(not)f(a)h + (theoretical)g(limitation|an)f(inliner)i(can)e(rewrite)i(a)e(pro-)324 + 1128 y(gram)27 b(without)i(function)f(calls|nor)g(is)h(it)e(a)h + (limitation)g(due)h(to)e(the)h(use)h(of)f(LL)-11 b(VM|)324 + 1249 y(LL)g(VM)23 b(is)g(famous)g(for)f(p)s(erforming)g(extensiv)m(e)k + (in)m(terpro)s(cedural)e(optimizations|but)324 1369 y(merely)34 + b(a)e(limit)h(of)f(the)h(curren)m(t)h(implemen)m(tation.)470 + 1489 y(Chec)m(k)m(er's)i(analysis)e(passes)g(also)f(su\013er)g(from)f + (other,)h(smaller,)h(de\014ciencies:)443 1685 y(1.)49 + b(The)44 b(v)-5 b(alidit)m(y)44 b(pass)g(is)g(unable)f(to)g(detect)h + (an)g(out)f(of)f(b)s(ounds)i(access)h(to)e(an)568 1805 + y(arra)m(y)-8 b(,)38 b(ev)m(en)g(if)f(the)g(b)s(ounds)h(and)f(index)h + (are)f(b)s(oth)g(kno)m(wn)h(at)f(compile)h(time.)568 + 1925 y(Curren)m(tly)-8 b(,)31 b(an)m(y)f(v)-5 b(alue)29 + b(tak)m(en)h(from)f(a)g(memory)h(load)e(is)i(assumed)h(to)d(b)s(e)h(v) + -5 b(alid,)568 2046 y(ev)m(en)34 b(if)e(there)i(is)f(no)f(matc)m(hing)i + (store)f(at)f(all!)568 2206 y(The)h(prop)s(er)g(w)m(a)m(y)h(to)e(\014x) + i(this)f(is)g(to)g(exp)s(ose)h(the)f(p)s(oin)m(ter)g(analysis)h(to)f + (LL)-11 b(VMs)568 2327 y(optimizers)27 b(through)g(the)f(pro)m(vided)i + (AliasAnalysis)h(in)m(terface,)f(so)f(that)f(LL)-11 b(VM)568 + 2447 y(can)33 b(\014nd)g(suc)m(h)h(cases)g(and)e(substitute)j(them)e + (for)f Fg(undef)p Fi(.)443 2648 y(2.)49 b(Due)38 b(to)h(its)g + (optimization-cen)m(tric)h(design,)i(LL)-11 b(VM)39 b(naturally)g(remo) + m(v)m(es)i(par-)568 2768 y(tially)33 b(unde\014ned)h(v)-5 + b(alues.)44 b(F)-8 b(or)32 b(example:)568 3026 y Fg(int)52 + b(f\(\))g({)670 3146 y(int)g(x;)670 3266 y(x)g(|=)g(1;)670 + 3387 y(return)h(x;)568 3507 y(})568 3765 y Fi(is)33 b(optimized)h(in)m + (to:)568 4022 y Fg(int)52 b(\045f\(\))g({)568 4143 y(entry:)978 + 4263 y(ret)g(int)g(-1)568 4383 y(})568 4641 y Fi(While)c(this)g + (substitution)h(is)e(alw)m(a)m(ys)i(v)-5 b(alid)48 b(for)f(an)g + (optimizer,)52 b(it)47 b(replaces)568 4761 y(unde\014ned)c(b)s(eha)m + (viour)g(with)f(de\014ned)h(b)s(eha)m(viour,)i(circum)m(v)m(en)m(ting)f + (c)m(hec)m(k)m(er's)568 4882 y(abilit)m(y)c(to)g(detect)g(the)g + (non-determinism)i(in)e(the)g(original)f(co)s(de.)65 + b(Ho)m(w)m(ev)m(er,)568 5002 y(LL)-11 b(VM)36 b(will)g(generate)g(co)s + (de)g(based)g(on)g(the)f(optimized)i(v)m(ersion,)h(and)e(so,)g(the)1894 + 5251 y(15)p eop end + %%Page: 16 16 + TeXDict begin 16 15 bop 568 548 a Fi(resulting)25 b(program)f(will)h + (not)g(b)s(e)f(non-deterministic.)43 b(In)25 b(this)g(sense,)j(c)m(hec) + m(k)m(er's)568 668 y(failure)22 b(to)g(w)m(arn)h(ab)s(out)f(this)g + (error)h(could)f(b)s(e)h(considered)h(correct,)h(as)d(it)g(is)h(op)s + (er-)568 789 y(ating)k(on)g(the)g(compiler's)i(in)m(terpretation)f(of)f + (the)h(program,)g(not)f(the)h(language)568 909 y(standard's)43 + b(in)m(terpretation.)74 b(Nev)m(ertheless,)48 b(LL)-11 + b(VM)43 b(could)f(b)s(e)h(mo)s(di\014ed)g(to)568 1029 + y(c)m(hange)33 b(its)g(treatmen)m(t)h(of)39 b Fg(undef)p + Fi(.)443 1233 y(3.)49 b(The)44 b(p)s(oin)m(ter)h(analysis)g(is)f + (region-based,)j(and)d(unable)g(to)g(di\013eren)m(tiate)h(b)s(e-)568 + 1353 y(t)m(w)m(een)34 b(accesses)h(of)d(di\013eren)m(t)i(\014elds)g(in) + f(an)f(arra)m(y)h(or)f(structure.)443 1557 y(4.)49 b(The)36 + b(p)s(oin)m(ter)g(analysis)h(could)g(b)s(e)f(made)g(less)h(conserv)-5 + b(ativ)m(e)38 b(in)e(step)g(three)h(b)m(y)568 1677 y(eliminating)48 + b(store)g(instructions)i(that)d(are)h(iden)m(tical)h(in)f(all)f(branc)m + (hes)i(and)568 1797 y(guaran)m(teed)29 b(to)g(execute.)44 + b(This)30 b(is)f(made)h(sligh)m(tly)g(more)f(di\016cult)h(b)s(ecause)g + (the)568 1918 y(order)g(of)f(m)m(ultiple)j(store)e(instructions)i + (storing)e(to)g(the)g(same)h(region)f(needs)i(to)568 + 2038 y(b)s(e)g(compared.)443 2242 y(5.)49 b(Region-based)g(analysis)h + (could)f(b)s(ecome)h(a)e(more)h(\014ne-grained)g(\014eld-based)568 + 2362 y(analysis.)470 2565 y(Ev)m(en)41 b(the)e(b)s(est)g(analysis)i + (pro)s(cess)f(is)f(limited)h(b)m(y)g(its)f(in)m(terface)h(with)f(the)h + (user.)324 2686 y(One)f(w)m(a)m(y)h(to)e(impro)m(v)m(e)j(c)m(hec)m(k)m + (er)h(is)d(to)f(mak)m(e)i(it)f(in)m(teractiv)m(e,)k(allo)m(wing)c(the)g + (user)h(to)324 2806 y(see)49 b(what)f(the)h(aliasing)f(set)h(of)e(a)h + (v)-5 b(ariable)48 b(is)h(at)e(a)h(particular)g(p)s(oin)m(t.)90 + b(A)48 b(more)324 2927 y(adv)-5 b(anced)31 b(v)m(ersion)h(of)e(the)h + (same)h(w)m(ould)f(emplo)m(y)h(LL)-11 b(VMs)31 b(JITter)h(to)e(allo)m + (w)h(a)f(mixed)324 3047 y(static/dynamic)41 b(analysis)g(where)g(the)f + (user)h(could)f(en)m(ter)h(v)-5 b(alues)41 b(for)e(the)h(registers)324 + 3167 y(and)32 b(execute)j(for)d(a)g(few)h(instructions)i(to)d(test)h(a) + f(h)m(yp)s(othesis.)470 3288 y(Finally)-8 b(,)36 b(c)m(hec)m(k)m(er)j + (needs)e(to)e(b)s(e)g(able)h(to)f(prune)h(p)s(oin)m(ters)g(from)f(the)h + (aliasing)g(set)324 3408 y(when)d(a)g(conditional)g(is)g(encoun)m + (tered.)324 3741 y Fk(6)161 b(Conclusion)324 3960 y Fi(Finding)27 + b(simple)h(common)f(errors)g(pro)m(v)m(es)h(p)s(ossible)g(with)f + (relativ)m(ely)i(little)e(w)m(ork.)42 b(W)-8 b(e)324 + 4080 y(ha)m(v)m(e)30 b(found)g(that)f(c)m(hec)m(k)m(er)j(can)d(detect)h + (co)s(ding)g(errors)f(and)h(o\013ers)f(opp)s(ortunities)h(for)324 + 4201 y(further)45 b(extension,)k(but)c(is)g(not)g(y)m(et)g(capable)h + (of)e(prop)s(erly)h(analyzing)g(real-w)m(orld)324 4321 + y(soft)m(w)m(are.)324 4654 y Fk(References)324 4873 y + Fi([ALB)554 4837 y Fe(+)613 4873 y Fi(03])71 b(Vikram)37 + b(Adv)m(e,)i(Chris)e(Lattner,)g(Mic)m(hael)h(Brukman,)h(Anand)d(Sh)m + (ukla,)809 4993 y(and)47 b(Brian)g(Gaek)m(e.)86 b(LL)-11 + b(V)g(A:)48 b(A)f(Lo)m(w-lev)m(el)h(Virtual)f(Instruction)h(Set)1894 + 5251 y(16)p eop end + %%Page: 17 17 + TeXDict begin 17 16 bop 809 548 a Fi(Arc)m(hitecture.)54 + b(In)36 b Fa(Pr)-5 b(o)g(c)g(e)g(e)g(dings)36 b(of)h(the)h(36th)f + (annual)g(A)n(CM/IEEE)g(in-)809 668 y(ternational)48 + b(symp)-5 b(osium)49 b(on)f(Micr)-5 b(o)g(ar)g(chite)g(ctur)g(e)49 + b(\(MICR)n(O-36\))p Fi(,)h(San)809 789 y(Diego,)32 b(California,)g(Dec) + h(2003.)809 909 y(h)m(ttp://llvm.org/pubs/2003-10-01-LL)-11 + b(V)g(A.h)m(tml)324 1110 y([And94])152 b(Lars)23 b(Ole)h(Andersen.)30 + b Fa(Pr)-5 b(o)g(gr)g(am)26 b(A)n(nalysis)g(and)g(Sp)-5 + b(e)g(cialization)24 b(for)i(the)h(C)809 1230 y(Pr)-5 + b(o)g(gr)g(amming)27 b(L)-5 b(anguage)p Fi(.)32 b(PhD)26 + b(thesis,)j(DIKU,)d(Univ)m(ersit)m(y)j(of)c(Cop)s(en-)809 + 1350 y(hagen,)33 b(Ma)m(y)g(1994.)809 1471 y(h)m(ttp://rep)s(ository)-8 + b(.readsc)m(heme.org/ftp/pap)s(ers/topps/D-203.p)s(df)324 + 1672 y([BLQ)557 1635 y Fe(+)616 1672 y Fi(03])68 b(Marc)42 + b(Berndl,)j(Ond)-5 b(\024)-43 b(rej)41 b(Lhot\023)-49 + b(ak,)45 b(F)-8 b(eng)41 b(Qian,)k(Laurie)d(Hendren,)j(and)809 + 1792 y(Na)m(vindra)32 b(Umanee.)42 b(P)m(oin)m(ts-to)32 + b(analysis)h(using)f(b)s(dds.)42 b(In)32 b Fa(Pr)-5 b(o)g(c)g(e)g(e)g + (dings)809 1912 y(of)42 b(the)h(A)n(CM)g(SIGPLAN)h(2003)e(Confer)-5 + b(enc)g(e)42 b(on)g(Pr)-5 b(o)g(gr)g(amming)42 b(L)-5 + b(an-)809 2033 y(guage)46 b(Design)f(and)h(Inplementation)p + Fi(,)g(pages)g(103{114.)e(A)m(CM)i(Press,)809 2153 y(2003.)324 + 2354 y([DKA05])109 b(Dinak)-5 b(ar)35 b(Dh)m(urjati,)i(Suman)m(t)g(Ko)m + (wshik,)h(and)f(Vikram)f(Adv)m(e.)56 b(Enforc-)809 2474 + y(ing)38 b(Alias)g(Analysis)h(for)f(W)-8 b(eakly)39 b(T)m(yp)s(ed)g + (Languages.)59 b(T)-8 b(ec)m(hnical)40 b(Re-)809 2594 + y(p)s(ort)i(#UIUCDCS-R-2005-2657,)h(Computer)h(Science)g(Dept.,)i + (Univ.)809 2715 y(of)32 b(Illinois,)h(No)m(v)h(2005.)809 + 2835 y(h)m(ttp://llvm.org/pubs/2005-11-SAFECo)s(deTR.h)m(tml)324 + 3036 y([DKAL05])48 b(Dinak)-5 b(ar)48 b(Dh)m(urjati,)53 + b(Suman)m(t)d(Ko)m(wshik,)55 b(Vikram)50 b(Adv)m(e,)55 + b(and)49 b(Chris)809 3156 y(Lattner.)35 b(Memory)28 b(safet)m(y)h + (without)e(garbage)g(collection)i(for)e(em)m(b)s(edded)809 + 3277 y(applications.)54 b Fa(T)-7 b(r)i(ans.)36 b(on)i(Emb)-5 + b(e)g(dde)g(d)37 b(Computing)g(Sys.)p Fi(,)f(4\(1\):73{111,)809 + 3397 y(2005.)809 3517 y(h)m(ttp://llvm.org/pubs/2005-02-TECS-SAFECo)s + (de.h)m(tml)324 3718 y([ECCH00])54 b(Da)m(wson)37 b(Engler,)h(Benjamin) + f(Chelf,)h(Andy)f(Chou,)h(and)f(Seth)g(Hallem.)809 3838 + y(Chec)m(king)65 b(System)h(Rules)e(Using)h(System-Sp)s(eci\014c,)74 + b(Programmer-)809 3959 y(W)-8 b(ritten)32 b(Compiler)h(Extensions.)44 + b Fa(4th)34 b(Symp)-5 b(osium)33 b(on)h(Op)-5 b(er)g(ating)33 + b(Sys-)809 4079 y(tems)h(Design)g(&)h(Implementation)p + Fi(,)30 b(2000.)809 4200 y(h)m(ttp://www.stanford.edu/)35 + b(engler/mc-osdi.ps)324 4400 y([LA04a])150 b(Chris)34 + b(Lattner)g(and)g(Vikram)g(Adv)m(e.)48 b(LL)-11 b(VM:)34 + b(A)g(Compilation)g(F)-8 b(rame-)809 4521 y(w)m(ork)39 + b(for)e(Lifelong)h(Program)g(Analysis)i(&)e(T)-8 b(ransformation.)60 + b(In)39 b Fa(Pr)-5 b(o-)809 4641 y(c)g(e)g(e)g(dings)44 + b(of)h(the)g(2004)g(International)f(Symp)-5 b(osium)45 + b(on)g(Co)-5 b(de)45 b(Gener-)809 4761 y(ation)j(and)g(Optimization)g + (\(CGO'04\))p Fi(,)i(P)m(alo)e(Alto,)j(California,)h(Mar)809 + 4882 y(2004.)809 5002 y(h)m(ttp://llvm.org/pubs/2004-01-30-CGO-LL)-11 + b(VM.h)m(tml)1894 5251 y(17)p eop end + %%Page: 18 18 + TeXDict begin 18 17 bop 324 548 a Fi([LA04b])145 b(Chris)41 + b(Lattner)g(and)f(Vikram)h(Adv)m(e.)68 b(The)42 b(LL)-11 + b(VM)41 b(Compiler)g(F)-8 b(rame-)809 668 y(w)m(ork)42 + b(and)f(Infrastructure)h(T)-8 b(utorial.)69 b(In)41 b + Fa(LCPC'04)h(Mini)g(Workshop)809 789 y(on)f(Compiler)g(R)-5 + b(ese)g(ar)g(ch)41 b(Infr)-5 b(astructur)g(es)p Fi(,)43 + b(W)-8 b(est)41 b(Lafa)m(y)m(ette,)i(Indiana,)809 909 + y(Sep)33 b(2004.)809 1029 y(h)m(ttp://llvm.org/pubs/2004-09-22-LCPCLL) + -11 b(VMT)j(utorial.h)m(tml)324 1233 y([Lat06])185 b(Chris)49 + b(Lattner.)91 b(LL)-11 b(VM)49 b(Assem)m(bly)j(Language)c(Reference)i + (Man)m(ual,)809 1353 y(Ma)m(y)33 b(2006.)809 1474 y(h)m + (ttp://llvm.org/do)s(cs/LangRef.h)m(tml)324 1677 y([SN])304 + b(Julian)45 b(Sew)m(ard)h(and)f(Nic)m(k)h(Nethercote.)80 + b(V)-8 b(algrind,)48 b(an)d(op)s(en-source)809 1797 y(memory)33 + b(debugger)h(for)e(x86-GNU/Lin)m(ux.)809 1918 y(h)m(ttp://www.v)-5 + b(algrind.org/)1894 5251 y(18)p eop end + %%Trailer + + userdict /end-hook known{end-hook}if + %%EOF From lattner at cs.uiuc.edu Mon Jun 12 15:34:54 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 15:34:54 -0500 Subject: [llvm-commits] CVS: llvm-www/pubs/index.html Message-ID: <200606122034.PAA01258@zion.cs.uiuc.edu> Changes in directory llvm-www/pubs: index.html updated: 1.38 -> 1.39 --- Log message: Add a new pub --- Diffs of the changes: (+3 -0) index.html | 3 +++ 1 files changed, 3 insertions(+) Index: llvm-www/pubs/index.html diff -u llvm-www/pubs/index.html:1.38 llvm-www/pubs/index.html:1.39 --- llvm-www/pubs/index.html:1.38 Fri Apr 28 12:16:22 2006 +++ llvm-www/pubs/index.html Mon Jun 12 15:34:42 2006 @@ -38,6 +38,9 @@
    +
  1. "Checker: a Static Program Checker"
    +Nicholas Lewycky.
    B.Sc. Thesis, Computer Science Dept., Ryerson University, June 2006.
  2. +
  3. "Vector LLVA: A Virtual Vector Instruction Set for Media Processing"
    Robert L. Bocchino Jr. and Vikram S. Adve.
    Proc. of the Second International Conference on Virtual Execution Environments (VEE'06), Ottawa, Canada, 2006.
  4. From resistor at mac.com Mon Jun 12 16:49:33 2006 From: resistor at mac.com (Owen Anderson) Date: Mon, 12 Jun 2006 16:49:33 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Message-ID: <200606122149.QAA30269@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: LoopUnswitch.cpp updated: 1.38 -> 1.39 --- Log message: Reapply my 6/9 changes. The bug Evan saw no longer occurs. --- Diffs of the changes: (+7 -1) LoopUnswitch.cpp | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.38 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.39 --- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.38 Sun Jun 11 04:32:57 2006 +++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Mon Jun 12 16:49:21 2006 @@ -73,6 +73,8 @@ AU.addPreservedID(LoopSimplifyID); AU.addRequired(); AU.addPreserved(); + AU.addRequiredID(LCSSAID); + AU.addPreservedID(LCSSAID); } private: @@ -154,6 +156,8 @@ } bool LoopUnswitch::visitLoop(Loop *L) { + assert(L->isLCSSAForm()); + bool Changed = false; // Loop over all of the basic blocks in the loop. If we find an interior @@ -198,7 +202,9 @@ } } } - + + assert(L->isLCSSAForm()); + return Changed; } From lattner at cs.uiuc.edu Mon Jun 12 16:51:09 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 16:51:09 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Message-ID: <200606122151.QAA30351@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCRegisterInfo.cpp updated: 1.67 -> 1.68 --- Log message: Fix spilling and reloading of CR regs to reload the right values. This fixes Olden/power (and probably others) with -regalloc=local. --- Diffs of the changes: (+24 -2) PPCRegisterInfo.cpp | 26 ++++++++++++++++++++++++-- 1 files changed, 24 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.67 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.68 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.67 Wed May 17 19:12:25 2006 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Jun 12 16:50:57 2006 @@ -102,7 +102,19 @@ BuildMI(MBB, MI, PPC::MFLR, 1, PPC::R11); addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx); } else if (RC == PPC::CRRCRegisterClass) { + // We need to store the CR in the low 4-bits of the saved value. First, + // issue a MFCR to save all of the CRBits. BuildMI(MBB, MI, PPC::MFCR, 0, PPC::R11); + + // If the saved register wasn't CR0, shift the bits left so that they are in + // CR0's slot. + if (SrcReg != PPC::CR0) { + unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(SrcReg)*4; + // rlwinm r11, r11, ShiftBits, 0, 31. + BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11) + .addReg(PPC::R11).addImm(ShiftBits).addImm(0).addImm(31); + } + addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx); } else if (RC == PPC::GPRCRegisterClass) { addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(SrcReg),FrameIdx); @@ -137,6 +149,16 @@ BuildMI(MBB, MI, PPC::MTLR, 1).addReg(PPC::R11); } else if (RC == PPC::CRRCRegisterClass) { addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R11), FrameIdx); + + // If the reloaded register isn't CR0, shift the bits right so that they are + // in the right CR's slot. + if (DestReg != PPC::CR0) { + unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(DestReg)*4; + // rlwinm r11, r11, 32-ShiftBits, 0, 31. + BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11) + .addReg(PPC::R11).addImm(32-ShiftBits).addImm(0).addImm(31); + } + BuildMI(MBB, MI, PPC::MTCRF, 1, DestReg).addReg(PPC::R11); } else if (RC == PPC::GPRCRegisterClass) { addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, DestReg), FrameIdx); @@ -407,8 +429,8 @@ /// VRRegNo - Map from a numbered VR register to its enum value. /// static const unsigned short VRRegNo[] = { - PPC::V0 , PPC::V1 , PPC::V2 , PPC::V3 , PPC::V4 , PPC::V5 , PPC::V6 , PPC::V7 , - PPC::V8 , PPC::V9 , PPC::V10, PPC::V11, PPC::V12, PPC::V13, PPC::V14, PPC::V15, + PPC::V0 , PPC::V1 , PPC::V2 , PPC::V3 , PPC::V4 , PPC::V5 , PPC::V6 , PPC::V7 , + PPC::V8 , PPC::V9 , PPC::V10, PPC::V11, PPC::V12, PPC::V13, PPC::V14, PPC::V15, PPC::V16, PPC::V17, PPC::V18, PPC::V19, PPC::V20, PPC::V21, PPC::V22, PPC::V23, PPC::V24, PPC::V25, PPC::V26, PPC::V27, PPC::V28, PPC::V29, PPC::V30, PPC::V31 }; From lattner at cs.uiuc.edu Mon Jun 12 18:59:28 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 18:59:28 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Message-ID: <200606122359.SAA31119@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCRegisterInfo.cpp updated: 1.68 -> 1.69 --- Log message: Gaar! Don't use r11 for CR save/restore, use R0. R11 can be register allocated, thus live across the save/reload. This fixes llc-beta /MultiSource/Applications/spiff/spiff llc-beta /MultiSource/Benchmarks/sim/sim: llc-beta /MultiSource/Benchmarks/Ptrdist/bc/bc llc-beta /MultiSource/Benchmarks/McCat/12-IOtest/iotest: llc-beta /MultiSource/Benchmarks/FreeBench/fourinarow/fourinarow llc-beta /MultiSource/Benchmarks/Fhourstones-3.1/fhourstones3.1 llc-beta /MultiSource/Benchmarks/mediabench/adpcm/rawdaudio/rawdaudio llc-beta /MultiSource/Benchmarks/mediabench/adpcm/rawcaudio/rawcaudio llc-beta /MultiSource/Benchmarks/mediabench/g721/g721encode/encode llc-beta /MultiSource/Benchmarks/mediabench/jpeg/jpeg-6a/cjpeg and probably others, with -regalloc=local. --- Diffs of the changes: (+11 -9) PPCRegisterInfo.cpp | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.68 llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.69 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp:1.68 Mon Jun 12 16:50:57 2006 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp Mon Jun 12 18:59:16 2006 @@ -102,20 +102,21 @@ BuildMI(MBB, MI, PPC::MFLR, 1, PPC::R11); addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx); } else if (RC == PPC::CRRCRegisterClass) { + // FIXME: We use R0 here, because it isn't available for RA. // We need to store the CR in the low 4-bits of the saved value. First, // issue a MFCR to save all of the CRBits. - BuildMI(MBB, MI, PPC::MFCR, 0, PPC::R11); + BuildMI(MBB, MI, PPC::MFCR, 0, PPC::R0); // If the saved register wasn't CR0, shift the bits left so that they are in // CR0's slot. if (SrcReg != PPC::CR0) { unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(SrcReg)*4; - // rlwinm r11, r11, ShiftBits, 0, 31. - BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11) - .addReg(PPC::R11).addImm(ShiftBits).addImm(0).addImm(31); + // rlwinm r0, r0, ShiftBits, 0, 31. + BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R0) + .addReg(PPC::R0).addImm(ShiftBits).addImm(0).addImm(31); } - addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R11), FrameIdx); + addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(PPC::R0), FrameIdx); } else if (RC == PPC::GPRCRegisterClass) { addFrameReference(BuildMI(MBB, MI, PPC::STW, 3).addReg(SrcReg),FrameIdx); } else if (RC == PPC::G8RCRegisterClass) { @@ -148,18 +149,19 @@ addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R11), FrameIdx); BuildMI(MBB, MI, PPC::MTLR, 1).addReg(PPC::R11); } else if (RC == PPC::CRRCRegisterClass) { - addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R11), FrameIdx); + // FIXME: We use R0 here, because it isn't available for RA. + addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, PPC::R0), FrameIdx); // If the reloaded register isn't CR0, shift the bits right so that they are // in the right CR's slot. if (DestReg != PPC::CR0) { unsigned ShiftBits = PPCRegisterInfo::getRegisterNumbering(DestReg)*4; // rlwinm r11, r11, 32-ShiftBits, 0, 31. - BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R11) - .addReg(PPC::R11).addImm(32-ShiftBits).addImm(0).addImm(31); + BuildMI(MBB, MI, PPC::RLWINM, 4, PPC::R0) + .addReg(PPC::R0).addImm(32-ShiftBits).addImm(0).addImm(31); } - BuildMI(MBB, MI, PPC::MTCRF, 1, DestReg).addReg(PPC::R11); + BuildMI(MBB, MI, PPC::MTCRF, 1, DestReg).addReg(PPC::R0); } else if (RC == PPC::GPRCRegisterClass) { addFrameReference(BuildMI(MBB, MI, PPC::LWZ, 2, DestReg), FrameIdx); } else if (RC == PPC::G8RCRegisterClass) { From lattner at cs.uiuc.edu Mon Jun 12 22:05:59 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 22:05:59 -0500 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html Message-ID: <200606130305.WAA32096@zion.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.153 -> 1.154 --- Log message: Decribe the "implementation" keyword. --- Diffs of the changes: (+11 -1) LangRef.html | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletion(-) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.153 llvm/docs/LangRef.html:1.154 --- llvm/docs/LangRef.html:1.153 Fri May 19 16:15:36 2006 +++ llvm/docs/LangRef.html Mon Jun 12 22:05:47 2006 @@ -350,6 +350,9 @@ ; External declaration of the puts function declare int %puts(sbyte*) ; int(sbyte*)* +; Global variable / Function body section separator +implementation + ; Definition of main function int %main() { ; int()* ; Convert [13x sbyte]* to sbyte *... @@ -373,6 +376,13 @@ array of char, and a pointer to a function), and have one of the following linkage types.

    +

    Due to a limitation in the current LLVM assembly parser (it is limited by +one-token lookahead), modules are split into two pieces by the "implementation" +keyword. Global variable prototypes and definitions must occur before the +keyword, and function definitions must occur after it. Function prototypes may +occur either before or after it. In the future, the implementation keyword may +become a noop, if the parser gets smarter.

    + @@ -3830,7 +3840,7 @@ Chris Lattner
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/05/19 21:15:36 $ + Last modified: $Date: 2006/06/13 03:05:47 $ From lattner at cs.uiuc.edu Mon Jun 12 22:11:00 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 12 Jun 2006 22:11:00 -0500 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/BugDriver.cpp BugDriver.h ExecutionDriver.cpp OptimizerDriver.cpp bugpoint.cpp Message-ID: <200606130311.WAA32179@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: BugDriver.cpp updated: 1.45 -> 1.46 BugDriver.h updated: 1.42 -> 1.43 ExecutionDriver.cpp updated: 1.60 -> 1.61 OptimizerDriver.cpp updated: 1.38 -> 1.39 bugpoint.cpp updated: 1.30 -> 1.31 --- Log message: Teach bugpoint to kill optimization passes that run over the timeout limit, which allows it to debug optimizer infinite loops. This patch is contributed by Nick Lewycky, thanks! --- Diffs of the changes: (+14 -12) BugDriver.cpp | 5 +++-- BugDriver.h | 3 ++- ExecutionDriver.cpp | 9 ++------- OptimizerDriver.cpp | 2 +- bugpoint.cpp | 7 ++++++- 5 files changed, 14 insertions(+), 12 deletions(-) Index: llvm/tools/bugpoint/BugDriver.cpp diff -u llvm/tools/bugpoint/BugDriver.cpp:1.45 llvm/tools/bugpoint/BugDriver.cpp:1.46 --- llvm/tools/bugpoint/BugDriver.cpp:1.45 Tue Jun 6 17:30:59 2006 +++ llvm/tools/bugpoint/BugDriver.cpp Mon Jun 12 22:10:48 2006 @@ -62,9 +62,10 @@ return Result; } -BugDriver::BugDriver(const char *toolname, bool as_child) +BugDriver::BugDriver(const char *toolname, bool as_child, unsigned timeout) : ToolName(toolname), ReferenceOutputFile(OutputFile), - Program(0), Interpreter(0), cbe(0), gcc(0), run_as_child(as_child) {} + Program(0), Interpreter(0), cbe(0), gcc(0), run_as_child(as_child), + Timeout(timeout) {} /// ParseInputFile - Given a bytecode or assembly input filename, parse and Index: llvm/tools/bugpoint/BugDriver.h diff -u llvm/tools/bugpoint/BugDriver.h:1.42 llvm/tools/bugpoint/BugDriver.h:1.43 --- llvm/tools/bugpoint/BugDriver.h:1.42 Thu Dec 22 14:02:55 2005 +++ llvm/tools/bugpoint/BugDriver.h Mon Jun 12 22:10:48 2006 @@ -48,13 +48,14 @@ CBE *cbe; GCC *gcc; bool run_as_child; + unsigned Timeout; // FIXME: sort out public/private distinctions... friend class ReducePassList; friend class ReduceMisCodegenFunctions; public: - BugDriver(const char *toolname, bool as_child); + BugDriver(const char *toolname, bool as_child, unsigned timeout); const std::string &getToolName() const { return ToolName; } Index: llvm/tools/bugpoint/ExecutionDriver.cpp diff -u llvm/tools/bugpoint/ExecutionDriver.cpp:1.60 llvm/tools/bugpoint/ExecutionDriver.cpp:1.61 --- llvm/tools/bugpoint/ExecutionDriver.cpp:1.60 Tue Jun 6 17:30:59 2006 +++ llvm/tools/bugpoint/ExecutionDriver.cpp Mon Jun 12 22:10:48 2006 @@ -63,11 +63,6 @@ cl::desc("Additional shared objects to load " "into executing programs")); - cl::opt - TimeoutValue("timeout", cl::init(300), cl::value_desc("seconds"), - cl::desc("Number of seconds program is allowed to run before it " - "is killed (default is 300s), 0 disables timeout")); - cl::list AdditionalLinkerArgs("Xlinker", cl::desc("Additional arguments to pass to the linker")); @@ -231,11 +226,11 @@ if (InterpreterSel == RunLLC || InterpreterSel == RunCBE) RetVal = AI->ExecuteProgram(BytecodeFile, InputArgv, InputFile, OutputFile, AdditionalLinkerArgs, SharedObjs, - TimeoutValue); + Timeout); else RetVal = AI->ExecuteProgram(BytecodeFile, InputArgv, InputFile, OutputFile, std::vector(), - SharedObjs, TimeoutValue); + SharedObjs, Timeout); if (RetVal == -1) { std::cerr << ""; Index: llvm/tools/bugpoint/OptimizerDriver.cpp diff -u llvm/tools/bugpoint/OptimizerDriver.cpp:1.38 llvm/tools/bugpoint/OptimizerDriver.cpp:1.39 --- llvm/tools/bugpoint/OptimizerDriver.cpp:1.38 Sun May 14 14:11:40 2006 +++ llvm/tools/bugpoint/OptimizerDriver.cpp Mon Jun 12 22:10:48 2006 @@ -179,7 +179,7 @@ args[n++] = 0; sys::Path prog(sys::Program::FindProgramByName(ToolName)); - int result = sys::Program::ExecuteAndWait(prog,args); + int result = sys::Program::ExecuteAndWait(prog,args,0,0,Timeout); // If we are supposed to delete the bytecode file or if the passes crashed, // remove it now. This may fail if the file was never created, but that's ok. Index: llvm/tools/bugpoint/bugpoint.cpp diff -u llvm/tools/bugpoint/bugpoint.cpp:1.30 llvm/tools/bugpoint/bugpoint.cpp:1.31 --- llvm/tools/bugpoint/bugpoint.cpp:1.30 Wed Jun 7 18:06:50 2006 +++ llvm/tools/bugpoint/bugpoint.cpp Mon Jun 12 22:10:48 2006 @@ -36,6 +36,11 @@ InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("")); +static cl::opt +TimeoutValue("timeout", cl::init(300), cl::value_desc("seconds"), + cl::desc("Number of seconds program is allowed to run before it " + "is killed (default is 300s), 0 disables timeout")); + // The AnalysesList is automatically populated with registered Passes by the // PassNameParser. // @@ -57,7 +62,7 @@ sys::PrintStackTraceOnErrorSignal(); sys::SetInterruptFunction(BugpointInterruptFunction); - BugDriver D(argv[0],AsChild); + BugDriver D(argv[0],AsChild,TimeoutValue); if (D.addSources(InputFilenames)) return 1; D.addPasses(PassList.begin(), PassList.end()); From evan.cheng at apple.com Tue Jun 13 00:14:56 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 13 Jun 2006 00:14:56 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.cpp Message-ID: <200606130514.AAA00310@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86RegisterInfo.cpp updated: 1.157 -> 1.158 --- Log message: Cygwin support: use _alloca to allocate stack if > 4k. Patch by Anton Korobeynikov. --- Diffs of the changes: (+21 -4) X86RegisterInfo.cpp | 25 +++++++++++++++++++++---- 1 files changed, 21 insertions(+), 4 deletions(-) Index: llvm/lib/Target/X86/X86RegisterInfo.cpp diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.157 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.158 --- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.157 Tue Jun 6 18:30:24 2006 +++ llvm/lib/Target/X86/X86RegisterInfo.cpp Tue Jun 13 00:14:44 2006 @@ -740,7 +740,7 @@ const Function* Fn = MF.getFunction(); const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget(); MachineInstr *MI; - + // Get the number of bytes to allocate from the FrameInfo unsigned NumBytes = MFI->getStackSize(); if (MFI->hasCalls() || MF.getFrameInfo()->hasVarSizedObjects()) { @@ -760,9 +760,20 @@ MFI->setStackSize(NumBytes); if (NumBytes) { // adjust stack pointer: ESP -= numbytes - unsigned Opc = NumBytes < 128 ? X86::SUB32ri8 : X86::SUB32ri; - MI = BuildMI(Opc, 1, X86::ESP,MachineOperand::UseAndDef).addImm(NumBytes); - MBB.insert(MBBI, MI); + if (NumBytes >= 4096 && Subtarget->TargetType == X86Subtarget::isCygwin) { + // Function prologue calls _alloca to probe the stack when allocating + // more than 4k bytes in one go. Touching the stack at 4K increments is + // necessary to ensure that the guard pages used by the OS virtual memory + // manager are allocated in correct sequence. + MI = BuildMI(X86::MOV32ri, 2, X86::EAX).addImm(NumBytes); + MBB.insert(MBBI, MI); + MI = BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("_alloca"); + MBB.insert(MBBI, MI); + } else { + unsigned Opc = NumBytes < 128 ? X86::SUB32ri8 : X86::SUB32ri; + MI = BuildMI(Opc, 1, X86::ESP,MachineOperand::UseAndDef).addImm(NumBytes); + MBB.insert(MBBI, MI); + } } if (hasFP(MF)) { @@ -789,6 +800,12 @@ Subtarget->TargetType == X86Subtarget::isCygwin) { MI = BuildMI(X86::AND32ri, 2, X86::ESP).addImm(-Align); MBB.insert(MBBI, MI); + + // Probe the stack + MI = BuildMI(X86::MOV32ri, 2, X86::EAX).addImm(Align); + MBB.insert(MBBI, MI); + MI = BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("_alloca"); + MBB.insert(MBBI, MI); } } From sabre at nondot.org Tue Jun 13 00:34:27 2006 From: sabre at nondot.org (Chris Lattner) Date: Tue, 13 Jun 2006 00:34:27 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.cpp In-Reply-To: <200606130514.AAA00310@zion.cs.uiuc.edu> References: <200606130514.AAA00310@zion.cs.uiuc.edu> Message-ID: Does this fix PR331? -Chris On Tue, 13 Jun 2006, Evan Cheng wrote: > > > Changes in directory llvm/lib/Target/X86: > > X86RegisterInfo.cpp updated: 1.157 -> 1.158 > --- > Log message: > > Cygwin support: use _alloca to allocate stack if > 4k. Patch by Anton Korobeynikov. > > --- > Diffs of the changes: (+21 -4) > > X86RegisterInfo.cpp | 25 +++++++++++++++++++++---- > 1 files changed, 21 insertions(+), 4 deletions(-) > > > Index: llvm/lib/Target/X86/X86RegisterInfo.cpp > diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.157 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.158 > --- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.157 Tue Jun 6 18:30:24 2006 > +++ llvm/lib/Target/X86/X86RegisterInfo.cpp Tue Jun 13 00:14:44 2006 > @@ -740,7 +740,7 @@ > const Function* Fn = MF.getFunction(); > const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget(); > MachineInstr *MI; > - > + > // Get the number of bytes to allocate from the FrameInfo > unsigned NumBytes = MFI->getStackSize(); > if (MFI->hasCalls() || MF.getFrameInfo()->hasVarSizedObjects()) { > @@ -760,9 +760,20 @@ > MFI->setStackSize(NumBytes); > > if (NumBytes) { // adjust stack pointer: ESP -= numbytes > - unsigned Opc = NumBytes < 128 ? X86::SUB32ri8 : X86::SUB32ri; > - MI = BuildMI(Opc, 1, X86::ESP,MachineOperand::UseAndDef).addImm(NumBytes); > - MBB.insert(MBBI, MI); > + if (NumBytes >= 4096 && Subtarget->TargetType == X86Subtarget::isCygwin) { > + // Function prologue calls _alloca to probe the stack when allocating > + // more than 4k bytes in one go. Touching the stack at 4K increments is > + // necessary to ensure that the guard pages used by the OS virtual memory > + // manager are allocated in correct sequence. > + MI = BuildMI(X86::MOV32ri, 2, X86::EAX).addImm(NumBytes); > + MBB.insert(MBBI, MI); > + MI = BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("_alloca"); > + MBB.insert(MBBI, MI); > + } else { > + unsigned Opc = NumBytes < 128 ? X86::SUB32ri8 : X86::SUB32ri; > + MI = BuildMI(Opc, 1, X86::ESP,MachineOperand::UseAndDef).addImm(NumBytes); > + MBB.insert(MBBI, MI); > + } > } > > if (hasFP(MF)) { > @@ -789,6 +800,12 @@ > Subtarget->TargetType == X86Subtarget::isCygwin) { > MI = BuildMI(X86::AND32ri, 2, X86::ESP).addImm(-Align); > MBB.insert(MBBI, MI); > + > + // Probe the stack > + MI = BuildMI(X86::MOV32ri, 2, X86::EAX).addImm(Align); > + MBB.insert(MBBI, MI); > + MI = BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("_alloca"); > + MBB.insert(MBBI, MI); > } > } > > > > > _______________________________________________ > llvm-commits mailing list > llvm-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > -Chris -- http://nondot.org/sabre/ http://llvm.org/ From sabre at nondot.org Tue Jun 13 00:35:57 2006 From: sabre at nondot.org (Chris Lattner) Date: Tue, 13 Jun 2006 00:35:57 -0500 (CDT) Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.cpp In-Reply-To: References: <200606130514.AAA00310@zion.cs.uiuc.edu> Message-ID: On Tue, 13 Jun 2006, Chris Lattner wrote: > Does this fix PR331? Actually no, I don't think it does. Dynamic alloca lowering would also need to be updated. That would be a logical next step :) -Chris > -Chris > > On Tue, 13 Jun 2006, Evan Cheng wrote: > >> >> >> Changes in directory llvm/lib/Target/X86: >> >> X86RegisterInfo.cpp updated: 1.157 -> 1.158 >> --- >> Log message: >> >> Cygwin support: use _alloca to allocate stack if > 4k. Patch by Anton >> Korobeynikov. >> >> --- >> Diffs of the changes: (+21 -4) >> >> X86RegisterInfo.cpp | 25 +++++++++++++++++++++---- >> 1 files changed, 21 insertions(+), 4 deletions(-) >> >> >> Index: llvm/lib/Target/X86/X86RegisterInfo.cpp >> diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.157 >> llvm/lib/Target/X86/X86RegisterInfo.cpp:1.158 >> --- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.157 Tue Jun 6 18:30:24 >> 2006 >> +++ llvm/lib/Target/X86/X86RegisterInfo.cpp Tue Jun 13 00:14:44 2006 >> @@ -740,7 +740,7 @@ >> const Function* Fn = MF.getFunction(); >> const X86Subtarget* Subtarget = >> &MF.getTarget().getSubtarget(); >> MachineInstr *MI; >> - >> + >> // Get the number of bytes to allocate from the FrameInfo >> unsigned NumBytes = MFI->getStackSize(); >> if (MFI->hasCalls() || MF.getFrameInfo()->hasVarSizedObjects()) { >> @@ -760,9 +760,20 @@ >> MFI->setStackSize(NumBytes); >> >> if (NumBytes) { // adjust stack pointer: ESP -= numbytes >> - unsigned Opc = NumBytes < 128 ? X86::SUB32ri8 : X86::SUB32ri; >> - MI = BuildMI(Opc, 1, >> X86::ESP,MachineOperand::UseAndDef).addImm(NumBytes); >> - MBB.insert(MBBI, MI); >> + if (NumBytes >= 4096 && Subtarget->TargetType == >> X86Subtarget::isCygwin) { >> + // Function prologue calls _alloca to probe the stack when >> allocating >> + // more than 4k bytes in one go. Touching the stack at 4K increments >> is >> + // necessary to ensure that the guard pages used by the OS virtual >> memory >> + // manager are allocated in correct sequence. >> + MI = BuildMI(X86::MOV32ri, 2, X86::EAX).addImm(NumBytes); >> + MBB.insert(MBBI, MI); >> + MI = BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("_alloca"); >> + MBB.insert(MBBI, MI); >> + } else { >> + unsigned Opc = NumBytes < 128 ? X86::SUB32ri8 : X86::SUB32ri; >> + MI = BuildMI(Opc, 1, >> X86::ESP,MachineOperand::UseAndDef).addImm(NumBytes); >> + MBB.insert(MBBI, MI); >> + } >> } >> >> if (hasFP(MF)) { >> @@ -789,6 +800,12 @@ >> Subtarget->TargetType == X86Subtarget::isCygwin) { >> MI = BuildMI(X86::AND32ri, 2, X86::ESP).addImm(-Align); >> MBB.insert(MBBI, MI); >> + >> + // Probe the stack >> + MI = BuildMI(X86::MOV32ri, 2, X86::EAX).addImm(Align); >> + MBB.insert(MBBI, MI); >> + MI = BuildMI(X86::CALLpcrel32, 1).addExternalSymbol("_alloca"); >> + MBB.insert(MBBI, MI); >> } >> } >> >> >> >> >> _______________________________________________ >> llvm-commits mailing list >> llvm-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits >> > > -Chris > > -Chris -- http://nondot.org/sabre/ http://llvm.org/ From jlaskey at apple.com Tue Jun 13 08:09:24 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 13 Jun 2006 08:09:24 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200606131309.IAA02502@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.67 -> 1.68 --- Log message: TargetLowering::ComputeMaskedBits was not clearing reciprocal bits on shifts. --- Diffs of the changes: (+11 -6) TargetLowering.cpp | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.67 llvm/lib/Target/TargetLowering.cpp:1.68 --- llvm/lib/Target/TargetLowering.cpp:1.67 Mon Jun 12 11:07:18 2006 +++ llvm/lib/Target/TargetLowering.cpp Tue Jun 13 08:08:58 2006 @@ -780,12 +780,14 @@ case ISD::SHL: // (shl X, C1) & C2 == 0 iff (X & C2 >>u C1) == 0 if (ConstantSDNode *SA = dyn_cast(Op.getOperand(1))) { + uint64_t LowBits = (1ULL << SA->getValue())-1; Mask >>= SA->getValue(); ComputeMaskedBits(Op.getOperand(0), Mask, KnownZero, KnownOne, Depth+1); assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); KnownZero <<= SA->getValue(); KnownOne <<= SA->getValue(); - KnownZero |= (1ULL << SA->getValue())-1; // low bits known zero. + KnownZero |= LowBits; // low bits known zero + KnownOne &= ~LowBits; // and known not to be one. } return; case ISD::SRL: @@ -798,7 +800,8 @@ assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); KnownZero >>= SA->getValue(); KnownOne >>= SA->getValue(); - KnownZero |= HighBits; // high bits known zero. + KnownZero |= HighBits; // high bits known zero + KnownOne &= ~HighBits; // and known not to be one. } return; case ISD::SRA: @@ -815,10 +818,12 @@ uint64_t SignBit = 1ULL << (MVT::getSizeInBits(Op.getValueType())-1); SignBit >>= SA->getValue(); // Adjust to where it is now in the mask. - if (KnownZero & SignBit) { // New bits are known zero. - KnownZero |= HighBits; - } else if (KnownOne & SignBit) { // New bits are known one. - KnownOne |= HighBits; + if (KnownZero & SignBit) { + KnownZero |= HighBits; // New bits are known zero + KnownOne &= ~HighBits; // and known not to be one. + } else if (KnownOne & SignBit) { + KnownOne |= HighBits; // New bits are known one + KnownZero &= ~HighBits; // and known not to be zero. } } return; From jlaskey at apple.com Tue Jun 13 08:10:56 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 13 Jun 2006 08:10:56 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll Message-ID: <200606131310.IAA02618@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Generic: 2006-06-13-ComputeMaskedBitsCrash.ll added (r1.1) --- Log message: Tests to make sure that ComputeMaskedBits discards bits for shifts. --- Diffs of the changes: (+50 -0) 2006-06-13-ComputeMaskedBitsCrash.ll | 50 +++++++++++++++++++++++++++++++++++ 1 files changed, 50 insertions(+) Index: llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll diff -c /dev/null llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll:1.1 *** /dev/null Tue Jun 13 08:10:54 2006 --- llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll Tue Jun 13 08:10:44 2006 *************** *** 0 **** --- 1,50 ---- + ; RUN: llvm-as < %s | llc -fast + + uint %test1(uint %tmp1) { + %tmp2 = or uint %tmp1, 2147483648 + %tmp3 = shr uint %tmp2, ubyte 31 + %tmp4 = and uint %tmp3, 2147483648 + %tmp5 = seteq uint %tmp4, 0 + br bool %tmp5, label %cond_true, label %cond_false + + cond_true: + ret uint %tmp1 + + cond_false: + + ret uint %tmp2 + } + + + uint %test2(uint %tmp1) { + %tmp2 = or uint %tmp1, 2147483648 + %tmp3 = cast uint %tmp2 to int + %tmp4 = shr int %tmp3, ubyte 31 + %tmp5 = cast int %tmp4 to uint + %tmp6 = and uint %tmp5, 2147483648 + %tmp7 = seteq uint %tmp6, 0 + br bool %tmp7, label %cond_true, label %cond_false + + cond_true: + ret uint %tmp1 + + cond_false: + + ret uint %tmp2 + } + + + uint %test3(uint %tmp1) { + %tmp2 = or uint %tmp1, 1 + %tmp3 = shl uint %tmp2, ubyte 31 + %tmp4 = and uint %tmp3, 1 + %tmp5 = seteq uint %tmp4, 0 + br bool %tmp5, label %cond_true, label %cond_false + + cond_true: + ret uint %tmp1 + + cond_false: + + ret uint %tmp2 + } From jlaskey at apple.com Tue Jun 13 10:23:01 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 13 Jun 2006 10:23:01 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll Message-ID: <200606131523.KAA14635@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Generic: 2006-06-13-ComputeMaskedBitsCrash.ll updated: 1.1 -> 1.2 --- Log message: My original test case was bogus. Reverting to crasher case. --- Diffs of the changes: (+31 -44) 2006-06-13-ComputeMaskedBitsCrash.ll | 75 ++++++++++++++--------------------- 1 files changed, 31 insertions(+), 44 deletions(-) Index: llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll diff -u llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll:1.1 llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll:1.2 --- llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll:1.1 Tue Jun 13 08:10:44 2006 +++ llvm/test/Regression/CodeGen/Generic/2006-06-13-ComputeMaskedBitsCrash.ll Tue Jun 13 10:22:49 2006 @@ -1,50 +1,37 @@ ; RUN: llvm-as < %s | llc -fast -uint %test1(uint %tmp1) { - %tmp2 = or uint %tmp1, 2147483648 - %tmp3 = shr uint %tmp2, ubyte 31 - %tmp4 = and uint %tmp3, 2147483648 - %tmp5 = seteq uint %tmp4, 0 - br bool %tmp5, label %cond_true, label %cond_false - -cond_true: - ret uint %tmp1 - -cond_false: - - ret uint %tmp2 -} - - -uint %test2(uint %tmp1) { - %tmp2 = or uint %tmp1, 2147483648 - %tmp3 = cast uint %tmp2 to int - %tmp4 = shr int %tmp3, ubyte 31 - %tmp5 = cast int %tmp4 to uint - %tmp6 = and uint %tmp5, 2147483648 - %tmp7 = seteq uint %tmp6, 0 - br bool %tmp7, label %cond_true, label %cond_false - -cond_true: - ret uint %tmp1 - -cond_false: - - ret uint %tmp2 -} + %struct.cl_perfunc_opts = type { ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, ubyte, int, int, int, int, int, int, int } +%cl_pf_opts = external global %struct.cl_perfunc_opts ; <%struct.cl_perfunc_opts*> [#uses=2] +implementation ; Functions: -uint %test3(uint %tmp1) { - %tmp2 = or uint %tmp1, 1 - %tmp3 = shl uint %tmp2, ubyte 31 - %tmp4 = and uint %tmp3, 1 - %tmp5 = seteq uint %tmp4, 0 - br bool %tmp5, label %cond_true, label %cond_false - -cond_true: - ret uint %tmp1 - -cond_false: +void %set_flags_from_O() { +entry: + %tmp22 = setgt int 0, 0 ; [#uses=1] + br bool %tmp22, label %cond_true23, label %cond_next159 + +cond_true23: ; preds = %entry + %tmp138 = getelementptr %struct.cl_perfunc_opts* %cl_pf_opts, int 0, uint 8 ; [#uses=1] + %tmp138 = cast ubyte* %tmp138 to uint* ; [#uses=2] + %tmp139 = load uint* %tmp138 ; [#uses=1] + %tmp140 = shl uint 1, ubyte 27 ; [#uses=1] + %tmp141 = and uint %tmp140, 134217728 ; [#uses=1] + %tmp142 = and uint %tmp139, 4160749567 ; [#uses=1] + %tmp143 = or uint %tmp142, %tmp141 ; [#uses=1] + store uint %tmp143, uint* %tmp138 + %tmp144 = getelementptr %struct.cl_perfunc_opts* %cl_pf_opts, int 0, uint 8 ; [#uses=1] + %tmp144 = cast ubyte* %tmp144 to uint* ; [#uses=1] + %tmp145 = load uint* %tmp144 ; [#uses=1] + %tmp146 = shl uint %tmp145, ubyte 22 ; [#uses=1] + %tmp147 = shr uint %tmp146, ubyte 31 ; [#uses=1] + %tmp147 = cast uint %tmp147 to ubyte ; [#uses=1] + %tmp148 = seteq ubyte %tmp147, 0 ; [#uses=1] + br bool %tmp148, label %cond_true149, label %cond_next159 + +cond_true149: ; preds = %cond_true23 + %tmp150 = cast ubyte* null to uint* ; [#uses=0] + ret void - ret uint %tmp2 +cond_next159: ; preds = %cond_true23, %entry + ret void } From lattner at cs.uiuc.edu Tue Jun 13 11:52:49 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Jun 2006 11:52:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp Message-ID: <200606131652.LAA15096@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetLowering.cpp updated: 1.68 -> 1.69 --- Log message: Port some bugfixes in shift handling from SimplifyDemandedBits over to ComputeMaskedBits. DemandedMasks and KnownZero/One masks should never have bits set out of the range of the base datatype. --- Diffs of the changes: (+51 -35) TargetLowering.cpp | 86 +++++++++++++++++++++++++++++++---------------------- 1 files changed, 51 insertions(+), 35 deletions(-) Index: llvm/lib/Target/TargetLowering.cpp diff -u llvm/lib/Target/TargetLowering.cpp:1.68 llvm/lib/Target/TargetLowering.cpp:1.69 --- llvm/lib/Target/TargetLowering.cpp:1.68 Tue Jun 13 08:08:58 2006 +++ llvm/lib/Target/TargetLowering.cpp Tue Jun 13 11:52:37 2006 @@ -442,10 +442,7 @@ unsigned ShAmt = SA->getValue(); // Compute the new bits that are at the top now. - uint64_t HighBits = (1ULL << ShAmt)-1; - HighBits <<= MVT::getSizeInBits(VT) - ShAmt; uint64_t TypeMask = MVT::getIntVTBitMask(VT); - if (SimplifyDemandedBits(Op.getOperand(0), (DemandedMask << ShAmt) & TypeMask, KnownZero, KnownOne, TLO, Depth+1)) @@ -455,7 +452,10 @@ KnownOne &= TypeMask; KnownZero >>= ShAmt; KnownOne >>= ShAmt; - KnownZero |= HighBits; // high bits known zero. + + uint64_t HighBits = (1ULL << ShAmt)-1; + HighBits <<= MVT::getSizeInBits(VT) - ShAmt; + KnownZero |= HighBits; // High bits known zero. } break; case ISD::SRA: @@ -464,14 +464,14 @@ unsigned ShAmt = SA->getValue(); // Compute the new bits that are at the top now. - uint64_t HighBits = (1ULL << ShAmt)-1; - HighBits <<= MVT::getSizeInBits(VT) - ShAmt; uint64_t TypeMask = MVT::getIntVTBitMask(VT); uint64_t InDemandedMask = (DemandedMask << ShAmt) & TypeMask; // If any of the demanded bits are produced by the sign extension, we also // demand the input sign bit. + uint64_t HighBits = (1ULL << ShAmt)-1; + HighBits <<= MVT::getSizeInBits(VT) - ShAmt; if (HighBits & DemandedMask) InDemandedMask |= MVT::getIntVTSignBit(VT); @@ -481,12 +481,12 @@ assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); KnownZero &= TypeMask; KnownOne &= TypeMask; - KnownZero >>= SA->getValue(); - KnownOne >>= SA->getValue(); + KnownZero >>= ShAmt; + KnownOne >>= ShAmt; // Handle the sign bits. uint64_t SignBit = MVT::getIntVTSignBit(VT); - SignBit >>= SA->getValue(); // Adjust to where it is now in the mask. + SignBit >>= ShAmt; // Adjust to where it is now in the mask. // If the input sign bit is known to be zero, or if none of the top bits // are demanded, turn this into an unsigned shift right. @@ -780,50 +780,66 @@ case ISD::SHL: // (shl X, C1) & C2 == 0 iff (X & C2 >>u C1) == 0 if (ConstantSDNode *SA = dyn_cast(Op.getOperand(1))) { - uint64_t LowBits = (1ULL << SA->getValue())-1; - Mask >>= SA->getValue(); - ComputeMaskedBits(Op.getOperand(0), Mask, KnownZero, KnownOne, Depth+1); + ComputeMaskedBits(Op.getOperand(0), Mask >> SA->getValue(), + KnownZero, KnownOne, Depth+1); assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); KnownZero <<= SA->getValue(); KnownOne <<= SA->getValue(); - KnownZero |= LowBits; // low bits known zero - KnownOne &= ~LowBits; // and known not to be one. + KnownZero |= (1ULL << SA->getValue())-1; // low bits known zero. } return; case ISD::SRL: // (ushr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0 if (ConstantSDNode *SA = dyn_cast(Op.getOperand(1))) { - uint64_t HighBits = (1ULL << SA->getValue())-1; - HighBits <<= MVT::getSizeInBits(Op.getValueType())-SA->getValue(); - Mask <<= SA->getValue(); - ComputeMaskedBits(Op.getOperand(0), Mask, KnownZero, KnownOne, Depth+1); + MVT::ValueType VT = Op.getValueType(); + unsigned ShAmt = SA->getValue(); + + uint64_t TypeMask = MVT::getIntVTBitMask(VT); + ComputeMaskedBits(Op.getOperand(0), (Mask << ShAmt) & TypeMask, + KnownZero, KnownOne, Depth+1); assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); - KnownZero >>= SA->getValue(); - KnownOne >>= SA->getValue(); - KnownZero |= HighBits; // high bits known zero - KnownOne &= ~HighBits; // and known not to be one. + KnownZero &= TypeMask; + KnownOne &= TypeMask; + KnownZero >>= ShAmt; + KnownOne >>= ShAmt; + + uint64_t HighBits = (1ULL << ShAmt)-1; + HighBits <<= MVT::getSizeInBits(VT)-ShAmt; + KnownZero |= HighBits; // High bits known zero. } return; case ISD::SRA: if (ConstantSDNode *SA = dyn_cast(Op.getOperand(1))) { - uint64_t HighBits = (1ULL << SA->getValue())-1; - HighBits <<= MVT::getSizeInBits(Op.getValueType())-SA->getValue(); - Mask <<= SA->getValue(); - ComputeMaskedBits(Op.getOperand(0), Mask, KnownZero, KnownOne, Depth+1); - assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?"); - KnownZero >>= SA->getValue(); - KnownOne >>= SA->getValue(); + MVT::ValueType VT = Op.getValueType(); + unsigned ShAmt = SA->getValue(); + + // Compute the new bits that are at the top now. + uint64_t TypeMask = MVT::getIntVTBitMask(VT); + + uint64_t InDemandedMask = (Mask << ShAmt) & TypeMask; + // If any of the demanded bits are produced by the sign extension, we also + // demand the input sign bit. + uint64_t HighBits = (1ULL << ShAmt)-1; + HighBits <<= MVT::getSizeInBits(VT) - ShAmt; + if (HighBits & Mask) + InDemandedMask |= MVT::getIntVTSignBit(VT); + + ComputeMaskedBits(Op.getOperand(0), InDemandedMask, KnownZero, KnownOne, + Depth+1); + assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); + KnownZero &= TypeMask; + KnownOne &= TypeMask; + KnownZero >>= ShAmt; + KnownOne >>= ShAmt; // Handle the sign bits. - uint64_t SignBit = 1ULL << (MVT::getSizeInBits(Op.getValueType())-1); - SignBit >>= SA->getValue(); // Adjust to where it is now in the mask. + uint64_t SignBit = MVT::getIntVTSignBit(VT); + SignBit >>= ShAmt; // Adjust to where it is now in the mask. if (KnownZero & SignBit) { - KnownZero |= HighBits; // New bits are known zero - KnownOne &= ~HighBits; // and known not to be one. + KnownZero |= HighBits; // New bits are known zero. } else if (KnownOne & SignBit) { - KnownOne |= HighBits; // New bits are known one - KnownZero &= ~HighBits; // and known not to be zero. + KnownOne |= HighBits; // New bits are known one. } } return; From alenhar2 at cs.uiuc.edu Tue Jun 13 13:27:51 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Tue, 13 Jun 2006 13:27:51 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp AlphaISelLowering.cpp AlphaISelLowering.h Message-ID: <200606131827.NAA15721@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelDAGToDAG.cpp updated: 1.43 -> 1.44 AlphaISelLowering.cpp updated: 1.50 -> 1.51 AlphaISelLowering.h updated: 1.17 -> 1.18 --- Log message: It really helps to be returning to the correct place --- Diffs of the changes: (+17 -33) AlphaISelDAGToDAG.cpp | 32 +++++--------------------------- AlphaISelLowering.cpp | 15 +++++++++------ AlphaISelLowering.h | 3 +++ 3 files changed, 17 insertions(+), 33 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.43 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.44 --- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.43 Fri May 26 18:10:12 2006 +++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Tue Jun 13 13:27:39 2006 @@ -124,7 +124,7 @@ private: SDOperand getGlobalBaseReg(); - SDOperand getRASaveReg(); + SDOperand getGlobalRetAddr(); SDOperand SelectCALL(SDOperand Op); }; @@ -141,7 +141,7 @@ /// getRASaveReg - Grab the return address /// -SDOperand AlphaDAGToDAGISel::getRASaveReg() { +SDOperand AlphaDAGToDAGISel::getGlobalRetAddr() { return CurDAG->getCopyFromReg(CurDAG->getEntryNode(), AlphaLowering.getVRegRA(), MVT::i64); @@ -197,6 +197,9 @@ case AlphaISD::GlobalBaseReg: Result = getGlobalBaseReg(); return; + case AlphaISD::GlobalRetAddr: + Result = getGlobalRetAddr(); + return; case AlphaISD::DivCall: { SDOperand Chain = CurDAG->getEntryNode(); @@ -226,30 +229,6 @@ return; } - case ISD::RET: { - SDOperand Chain; - Select(Chain, N->getOperand(0)); // Token chain. - SDOperand InFlag(0,0); - - if (N->getNumOperands() == 3) { - SDOperand Val; - Select(Val, N->getOperand(1)); - if (N->getOperand(1).getValueType() == MVT::i64) { - Chain = CurDAG->getCopyToReg(Chain, Alpha::R0, Val, InFlag); - InFlag = Chain.getValue(1); - } else if (N->getOperand(1).getValueType() == MVT::f64 || - N->getOperand(1).getValueType() == MVT::f32) { - Chain = CurDAG->getCopyToReg(Chain, Alpha::F0, Val, InFlag); - InFlag = Chain.getValue(1); - } - } - Chain = CurDAG->getCopyToReg(Chain, Alpha::R26, getRASaveReg(), InFlag); - InFlag = Chain.getValue(1); - - // Finally, select this to a ret instruction. - Result = CurDAG->SelectNodeTo(N, Alpha::RETDAG, MVT::Other, Chain, InFlag); - return; - } case ISD::Constant: { uint64_t uval = cast(N)->getValue(); @@ -469,7 +448,6 @@ assert(0 && "Unknown operand"); } - // Finally, once everything is in registers to pass to the call, emit the // call itself. if (Addr.getOpcode() == AlphaISD::GPRelLo) { Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.50 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.51 --- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.50 Mon Jun 12 13:09:24 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Tue Jun 13 13:27:39 2006 @@ -154,6 +154,7 @@ case AlphaISD::GPRelLo: return "Alpha::GPRelLo"; case AlphaISD::RelLit: return "Alpha::RelLit"; case AlphaISD::GlobalBaseReg: return "Alpha::GlobalBaseReg"; + case AlphaISD::GlobalRetAddr: return "Alpha::GlobalRetAddr"; case AlphaISD::CALL: return "Alpha::CALL"; case AlphaISD::DivCall: return "Alpha::DivCall"; case AlphaISD::RET_FLAG: return "Alpha::RET_FLAG"; @@ -268,14 +269,17 @@ return DAG.getNode(ISD::MERGE_VALUES, RetVT, ArgValues); } -static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) { - SDOperand Copy; +static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG, unsigned int RA) { + SDOperand Copy = DAG.getCopyToReg(Op.getOperand(0), Alpha::R26, + DAG.getNode(AlphaISD::GlobalRetAddr, MVT::i64), + SDOperand()); switch (Op.getNumOperands()) { default: assert(0 && "Do not know how to return this many arguments!"); abort(); case 1: - return SDOperand(); // ret void is legal + break; + //return SDOperand(); // ret void is legal case 3: { MVT::ValueType ArgVT = Op.getOperand(1).getValueType(); unsigned ArgReg; @@ -285,8 +289,7 @@ assert(MVT::isFloatingPoint(ArgVT)); ArgReg = Alpha::F0; } - Copy = DAG.getCopyToReg(Op.getOperand(0), ArgReg, Op.getOperand(1), - SDOperand()); + Copy = DAG.getCopyToReg(Copy, ArgReg, Op.getOperand(1), Copy.getValue(1)); if(DAG.getMachineFunction().liveout_empty()) DAG.getMachineFunction().addLiveOut(ArgReg); break; @@ -384,7 +387,7 @@ VarArgsBase, VarArgsOffset, GP, RA); - case ISD::RET: return LowerRET(Op,DAG); + case ISD::RET: return LowerRET(Op,DAG, getVRegRA()); case ISD::SINT_TO_FP: { assert(MVT::i64 == Op.getOperand(0).getValueType() && "Unhandled SINT_TO_FP type in custom expander!"); Index: llvm/lib/Target/Alpha/AlphaISelLowering.h diff -u llvm/lib/Target/Alpha/AlphaISelLowering.h:1.17 llvm/lib/Target/Alpha/AlphaISelLowering.h:1.18 --- llvm/lib/Target/Alpha/AlphaISelLowering.h:1.17 Mon Jun 12 13:09:24 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.h Tue Jun 13 13:27:39 2006 @@ -37,6 +37,9 @@ /// GlobalBaseReg - used to restore the GOT ptr GlobalBaseReg, + + /// GlobalRetAddr - used to restore the return address + GlobalRetAddr, /// CALL - Normal call. CALL, From lattner at cs.uiuc.edu Tue Jun 13 13:52:41 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Jun 2006 13:52:41 -0500 Subject: [llvm-commits] CVS: llvm-test/External/SPEC/Makefile.spec Message-ID: <200606131852.NAA15919@zion.cs.uiuc.edu> Changes in directory llvm-test/External/SPEC: Makefile.spec updated: 1.53 -> 1.54 --- Log message: Use the new bugpoint -Xlinker option to pass down LDFLAGS to bugpoint, allowing us to debug NAG Fortran programs and povray without ugly hacks --- Diffs of the changes: (+6 -0) Makefile.spec | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm-test/External/SPEC/Makefile.spec diff -u llvm-test/External/SPEC/Makefile.spec:1.53 llvm-test/External/SPEC/Makefile.spec:1.54 --- llvm-test/External/SPEC/Makefile.spec:1.53 Mon Feb 27 16:11:02 2006 +++ llvm-test/External/SPEC/Makefile.spec Tue Jun 13 13:52:28 2006 @@ -135,6 +135,12 @@ BUGPOINT_OPTIONS += -abs-tolerance $(FP_ABSTOLERANCE) endif + +# Give bugpoint information about LDFLAGS to pass down to the actual link stage +# of the program. +BUGPOINT_OPTIONS += $(LDFLAGS:%=-Xlinker=%) + + # Specify stdin, reference output, and command line options for the program... BUGPOINT_OPTIONS += -input=$(STDIN_FILENAME) -output=../$*.out-nat BUGPOINT_OPTIONS += -timeout=$(RUNTIMELIMIT) From lattner at cs.uiuc.edu Tue Jun 13 13:52:41 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Jun 2006 13:52:41 -0500 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200606131852.NAA15923@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.215 -> 1.216 --- Log message: Use the new bugpoint -Xlinker option to pass down LDFLAGS to bugpoint, allowing us to debug NAG Fortran programs and povray without ugly hacks --- Diffs of the changes: (+4 -0) Makefile.programs | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.215 llvm-test/Makefile.programs:1.216 --- llvm-test/Makefile.programs:1.215 Fri Jun 9 16:47:24 2006 +++ llvm-test/Makefile.programs Tue Jun 13 13:52:28 2006 @@ -379,6 +379,10 @@ BUGPOINT_OPTIONS += -abs-tolerance $(FP_ABSTOLERANCE) endif +# Give bugpoint information about LDFLAGS to pass down to the actual link stage +# of the program. +BUGPOINT_OPTIONS += $(LDFLAGS:%=-Xlinker=%) + # Specify stdin, reference output, and command line options for the program... BUGPOINT_OPTIONS += -input=$(STDIN_FILENAME) -output=Output/$*.out-nat BUGPOINT_OPTIONS += -timeout=$(RUNTIMELIMIT) From resistor at mac.com Tue Jun 13 14:37:30 2006 From: resistor at mac.com (Owen Anderson) Date: Tue, 13 Jun 2006 14:37:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/LCSSA.cpp Message-ID: <200606131937.OAA16142@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: LCSSA.cpp updated: 1.20 -> 1.21 --- Log message: Fix a bug that was causing major slowdowns in povray. This was due to LCSSA not handling PHI nodes correctly when determining if a value was live-out. This patch reduces the number of detected live-out variables in the testcase from 6565 to 485. --- Diffs of the changes: (+7 -2) LCSSA.cpp | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/Utils/LCSSA.cpp diff -u llvm/lib/Transforms/Utils/LCSSA.cpp:1.20 llvm/lib/Transforms/Utils/LCSSA.cpp:1.21 --- llvm/lib/Transforms/Utils/LCSSA.cpp:1.20 Mon Jun 12 02:10:16 2006 +++ llvm/lib/Transforms/Utils/LCSSA.cpp Tue Jun 13 14:37:18 2006 @@ -91,6 +91,7 @@ /// runOnFunction - Process all loops in the function, inner-most out. bool LCSSA::runOnFunction(Function &F) { bool changed = false; + LI = &getAnalysis(); DF = &getAnalysis(); DT = &getAnalysis(); @@ -107,7 +108,7 @@ bool LCSSA::visitSubloop(Loop* L) { for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I) visitSubloop(*I); - + // Speed up queries by creating a sorted list of blocks LoopBlocks.clear(); LoopBlocks.insert(LoopBlocks.end(), L->block_begin(), L->block_end()); @@ -162,7 +163,6 @@ phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa", (*BBI)->begin()); workList.push_back(cast(phi)); - Phis[*BBI] = phi; } } @@ -253,6 +253,11 @@ for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI) { BasicBlock *UserBB = cast(*UI)->getParent(); + if (PHINode* p = dyn_cast(*UI)) { + unsigned OperandNo = UI.getOperandNo(); + UserBB = p->getIncomingBlock(OperandNo/2); + } + if (!inLoop(UserBB)) { AffectedValues.insert(I); break; From alenhar2 at cs.uiuc.edu Tue Jun 13 15:35:00 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Tue, 13 Jun 2006 15:35:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Message-ID: <200606132035.PAA16496@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelDAGToDAG.cpp updated: 1.44 -> 1.45 --- Log message: I am sure I had commited this workaround before. Perhaps soon I should sort it all out --- Diffs of the changes: (+6 -6) AlphaISelDAGToDAG.cpp | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.44 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.45 --- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.44 Tue Jun 13 13:27:39 2006 +++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Tue Jun 13 15:34:47 2006 @@ -286,12 +286,12 @@ bool isNE = false; switch(CC) { default: N->dump(); assert(0 && "Unknown FP comparison!"); - case ISD::SETEQ: Opc = Alpha::CMPTEQ; break; - case ISD::SETLT: Opc = Alpha::CMPTLT; break; - case ISD::SETLE: Opc = Alpha::CMPTLE; break; - case ISD::SETGT: Opc = Alpha::CMPTLT; rev = true; break; - case ISD::SETGE: Opc = Alpha::CMPTLE; rev = true; break; - case ISD::SETNE: Opc = Alpha::CMPTEQ; isNE = true; break; + case ISD::SETEQ: case ISD::SETOEQ: case ISD::SETUEQ: Opc = Alpha::CMPTEQ; break; + case ISD::SETLT: case ISD::SETOLT: case ISD::SETULT: Opc = Alpha::CMPTLT; break; + case ISD::SETLE: case ISD::SETOLE: case ISD::SETULE: Opc = Alpha::CMPTLE; break; + case ISD::SETGT: case ISD::SETOGT: case ISD::SETUGT: Opc = Alpha::CMPTLT; rev = true; break; + case ISD::SETGE: case ISD::SETOGE: case ISD::SETUGE: Opc = Alpha::CMPTLE; rev = true; break; + case ISD::SETNE: case ISD::SETONE: case ISD::SETUNE: Opc = Alpha::CMPTEQ; isNE = true; break; }; SDOperand tmp1, tmp2; Select(tmp1, N->getOperand(0)); From resistor at mac.com Tue Jun 13 15:45:34 2006 From: resistor at mac.com (Owen Anderson) Date: Tue, 13 Jun 2006 15:45:34 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/LoopInfo.cpp Message-ID: <200606132045.PAA16646@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: LoopInfo.cpp updated: 1.73 -> 1.74 --- Log message: Update isLCSSAForm to handle PHI nodes specially for live-out detection. This is the same as the recent patch to LCSSA.cpp. --- Diffs of the changes: (+6 -1) LoopInfo.cpp | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/Analysis/LoopInfo.cpp diff -u llvm/lib/Analysis/LoopInfo.cpp:1.73 llvm/lib/Analysis/LoopInfo.cpp:1.74 --- llvm/lib/Analysis/LoopInfo.cpp:1.73 Sun Jun 11 14:22:28 2006 +++ llvm/lib/Analysis/LoopInfo.cpp Tue Jun 13 15:45:22 2006 @@ -487,7 +487,12 @@ for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI) { BasicBlock *UserBB = cast(*UI)->getParent(); - if (!isa(*UI) && !contains(UserBB)) { + if (PHINode* p = dyn_cast(*UI)) { + unsigned OperandNo = UI.getOperandNo(); + UserBB = p->getIncomingBlock(OperandNo/2); + } + + if (!contains(UserBB)) { return false; } } From resistor at mac.com Tue Jun 13 15:50:22 2006 From: resistor at mac.com (Owen Anderson) Date: Tue, 13 Jun 2006 15:50:22 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/LCSSA.cpp Message-ID: <200606132050.PAA16714@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: LCSSA.cpp updated: 1.21 -> 1.22 --- Log message: Fix another instance where PHI nodes need special treatment. --- Diffs of the changes: (+6 -0) LCSSA.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/lib/Transforms/Utils/LCSSA.cpp diff -u llvm/lib/Transforms/Utils/LCSSA.cpp:1.21 llvm/lib/Transforms/Utils/LCSSA.cpp:1.22 --- llvm/lib/Transforms/Utils/LCSSA.cpp:1.21 Tue Jun 13 14:37:18 2006 +++ llvm/lib/Transforms/Utils/LCSSA.cpp Tue Jun 13 15:50:09 2006 @@ -215,6 +215,12 @@ for (Instruction::use_iterator UI = Instr->use_begin(), UE = Instr->use_end(); UI != UE; ++UI) { Instruction* use = cast(*UI); + BasicBlock* UserBB = use->getParent(); + if (PHINode* p = dyn_cast(use)) { + unsigned OperandNo = UI.getOperandNo(); + UserBB = p->getIncomingBlock(OperandNo/2); + } + // Don't need to update uses within the loop body. if (!inLoop(use->getParent())) Uses.push_back(use); From evan.cheng at apple.com Tue Jun 13 16:47:40 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 13 Jun 2006 16:47:40 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200606132147.QAA17087@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.208 -> 1.209 --- Log message: getOperandNum(): error if specified operand number is out of range. --- Diffs of the changes: (+7 -0) DAGISelEmitter.cpp | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.208 llvm/utils/TableGen/DAGISelEmitter.cpp:1.209 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.208 Fri Jun 9 18:59:44 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Jun 13 16:47:27 2006 @@ -121,6 +121,13 @@ assert(NumResults <= 1 && "We only work with nodes with zero or one result so far!"); + if (OpNo >= (NumResults + N->getNumChildren())) { + std::cerr << "Invalid operand number " << OpNo << " "; + N->dump(); + std::cerr << '\n'; + exit(1); + } + if (OpNo < NumResults) return N; // FIXME: need value # else From lattner at cs.uiuc.edu Tue Jun 13 20:14:09 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Jun 2006 20:14:09 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/LCSSA.cpp Message-ID: <200606140114.UAA18043@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: LCSSA.cpp updated: 1.22 -> 1.23 --- Log message: Use the PotDoms map to memoize 'dominating value' lookup. With this patch, LCSSA is still the slowest pass when gccas'ing 252.eon, but now it only takes 39s instead of 289s. :) --- Diffs of the changes: (+14 -17) LCSSA.cpp | 31 ++++++++++++++----------------- 1 files changed, 14 insertions(+), 17 deletions(-) Index: llvm/lib/Transforms/Utils/LCSSA.cpp diff -u llvm/lib/Transforms/Utils/LCSSA.cpp:1.22 llvm/lib/Transforms/Utils/LCSSA.cpp:1.23 --- llvm/lib/Transforms/Utils/LCSSA.cpp:1.22 Tue Jun 13 15:50:09 2006 +++ llvm/lib/Transforms/Utils/LCSSA.cpp Tue Jun 13 20:13:57 2006 @@ -74,8 +74,12 @@ private: SetVector getLoopValuesUsedOutsideLoop(Loop *L); Instruction *getValueDominatingBlock(BasicBlock *BB, + std::map& PotDoms) { + return getValueDominatingDTNode(DT->getNode(BB), PotDoms); + } + Instruction *getValueDominatingDTNode(DominatorTree::Node *Node, std::map& PotDoms); - + /// inLoop - returns true if the given block is within the current loop const bool inLoop(BasicBlock* B) { return std::binary_search(LoopBlocks.begin(), LoopBlocks.end(), B); @@ -237,8 +241,8 @@ } } } else { - Value *NewVal = getValueDominatingBlock((*II)->getParent(), Phis); - (*II)->replaceUsesOfWith(Instr, NewVal); + Value *NewVal = getValueDominatingBlock((*II)->getParent(), Phis); + (*II)->replaceUsesOfWith(Instr, NewVal); } } } @@ -275,19 +279,12 @@ /// getValueDominatingBlock - Return the value within the potential dominators /// map that dominates the given block. -Instruction *LCSSA::getValueDominatingBlock(BasicBlock *BB, - std::map& PotDoms) { - DominatorTree::Node* bbNode = DT->getNode(BB); - while (bbNode != 0) { - std::map::iterator I = - PotDoms.find(bbNode->getBlock()); - if (I != PotDoms.end()) { - return (*I).second; - } - bbNode = bbNode->getIDom(); - } - - assert(0 && "No dominating value found."); +Instruction *LCSSA::getValueDominatingDTNode(DominatorTree::Node *Node, + std::map& PotDoms) { + assert(Node != 0 && "Didn't find dom value?"); + Instruction *&CacheSlot = PotDoms[Node->getBlock()]; + if (CacheSlot) return CacheSlot; - return 0; + // Otherwise, return the value of the idom and remember this for next time. + return CacheSlot = getValueDominatingDTNode(Node->getIDom(), PotDoms); } From resistor at mac.com Tue Jun 13 23:43:26 2006 From: resistor at mac.com (Owen Anderson) Date: Tue, 13 Jun 2006 23:43:26 -0500 Subject: [llvm-commits] CVS: llvm/lib/VMCore/BasicBlock.cpp Message-ID: <200606140443.XAA19375@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: BasicBlock.cpp updated: 1.70 -> 1.71 --- Log message: When asked not to delete useless PHIs, really don't delete them, no matter how redundant they are. --- Diffs of the changes: (+2 -1) BasicBlock.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/VMCore/BasicBlock.cpp diff -u llvm/lib/VMCore/BasicBlock.cpp:1.70 llvm/lib/VMCore/BasicBlock.cpp:1.71 --- llvm/lib/VMCore/BasicBlock.cpp:1.70 Thu Jun 8 11:03:13 2006 +++ llvm/lib/VMCore/BasicBlock.cpp Tue Jun 13 23:43:14 2006 @@ -213,7 +213,8 @@ PN->removeIncomingValue(Pred, false); // If all incoming values to the Phi are the same, we can replace the Phi // with that value. - if (Value *PNV = PN->hasConstantValue()) { + Value* PNV = 0; + if (!DontDeleteUselessPHIs && (PNV = PN->hasConstantValue())) { PN->replaceAllUsesWith(PNV); PN->eraseFromParent(); } From lattner at cs.uiuc.edu Tue Jun 13 23:45:57 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Jun 2006 23:45:57 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll Message-ID: <200606140445.XAA19469@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/LoopUnswitch: 2006-06-13-SingleEntryPHI.ll added (r1.1) --- Log message: new testcase, distilled from povray --- Diffs of the changes: (+44 -0) 2006-06-13-SingleEntryPHI.ll | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 44 insertions(+) Index: llvm/test/Regression/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll diff -c /dev/null llvm/test/Regression/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll:1.1 *** /dev/null Tue Jun 13 23:45:55 2006 --- llvm/test/Regression/Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll Tue Jun 13 23:45:45 2006 *************** *** 0 **** --- 1,44 ---- + ; RUN: llvm-as < %s | opt -loop-unswitch -disable-output + + %struct.BLEND_MAP = type { short, short, short, int, %struct.BLEND_MAP_ENTRY* } + %struct.BLEND_MAP_ENTRY = type { float, ubyte, { [5 x float], [4 x ubyte] } } + %struct.TPATTERN = type { ushort, ushort, ushort, int, float, float, float, %struct.WARP*, %struct.TPATTERN*, %struct.BLEND_MAP*, { %struct.anon, [4 x ubyte] } } + %struct.TURB = type { ushort, %struct.WARP*, [3 x double], int, float, float } + %struct.WARP = type { ushort, %struct.WARP* } + %struct.anon = type { float, [3 x double] } + + implementation ; Functions: + + void %Parse_Pattern() { + entry: + br label %bb1096.outer20 + + bb671: ; preds = %cond_true1099 + br label %bb1096.outer23 + + bb1096.outer20.loopexit: ; preds = %cond_true1099 + %Local_Turb.0.ph24.lcssa = phi %struct.TURB* [ %Local_Turb.0.ph24, %cond_true1099 ] ; <%struct.TURB*> [#uses=1] + br label %bb1096.outer20 + + bb1096.outer20: ; preds = %bb1096.outer20.loopexit, %entry + %Local_Turb.0.ph22 = phi %struct.TURB* [ undef, %entry ], [ %Local_Turb.0.ph24.lcssa, %bb1096.outer20.loopexit ] ; <%struct.TURB*> [#uses=1] + %tmp1098 = seteq int 0, 0 ; [#uses=1] + br label %bb1096.outer23 + + bb1096.outer23: ; preds = %bb1096.outer20, %bb671 + %Local_Turb.0.ph24 = phi %struct.TURB* [ %Local_Turb.0.ph22, %bb1096.outer20 ], [ null, %bb671 ] ; <%struct.TURB*> [#uses=2] + br label %bb1096 + + bb1096: ; preds = %cond_true1099, %bb1096.outer23 + br bool %tmp1098, label %cond_true1099, label %bb1102 + + cond_true1099: ; preds = %bb1096 + switch int 0, label %bb1096.outer20.loopexit [ + int 161, label %bb671 + int 359, label %bb1096 + ] + + bb1102: ; preds = %bb1096 + %Local_Turb.0.ph24.lcssa1 = phi %struct.TURB* [ %Local_Turb.0.ph24, %bb1096 ] ; <%struct.TURB*> [#uses=0] + ret void + } From lattner at cs.uiuc.edu Tue Jun 13 23:46:29 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Jun 2006 23:46:29 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Message-ID: <200606140446.XAA19500@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: LoopUnswitch.cpp updated: 1.39 -> 1.40 --- Log message: Fix Transforms/LoopUnswitch/2006-06-13-SingleEntryPHI.ll, a loop unswitch bug exposed by the recent lcssa work. --- Diffs of the changes: (+13 -1) LoopUnswitch.cpp | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletion(-) Index: llvm/lib/Transforms/Scalar/LoopUnswitch.cpp diff -u llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.39 llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.40 --- llvm/lib/Transforms/Scalar/LoopUnswitch.cpp:1.39 Mon Jun 12 16:49:21 2006 +++ llvm/lib/Transforms/Scalar/LoopUnswitch.cpp Tue Jun 13 23:46:17 2006 @@ -401,7 +401,7 @@ << Cost << "\n"); return false; } - + // If this is a trivial condition to unswitch (which results in no code // duplication), do it now. Constant *CondVal; @@ -456,6 +456,18 @@ // If the successor only has a single pred, split the top of the successor // block. assert(SP == BB && "CFG broken"); + + // If this block has a single predecessor, remove any phi nodes. Unswitch + // expect that, after split the edges from inside the loop to the exit + // block, that there will be no phi nodes in the new exit block. Single + // entry phi nodes break this assumption. + BasicBlock::iterator I = Succ->begin(); + while (PHINode *PN = dyn_cast(I)) { + PN->replaceAllUsesWith(PN->getIncomingValue(0)); + PN->eraseFromParent(); + I = Succ->begin(); + } + return SplitBlock(Succ, Succ->begin()); } else { // Otherwise, if BB has a single successor, split it at the bottom of the From lattner at cs.uiuc.edu Tue Jun 13 23:48:49 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 13 Jun 2006 23:48:49 -0500 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200606140448.XAA19543@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.216 -> 1.217 --- Log message: For good measure, test that -fast doesn't expose any bugs either. --- Diffs of the changes: (+1 -1) Makefile.programs | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.216 llvm-test/Makefile.programs:1.217 --- llvm-test/Makefile.programs:1.216 Tue Jun 13 13:52:28 2006 +++ llvm-test/Makefile.programs Tue Jun 13 23:48:37 2006 @@ -187,7 +187,7 @@ endif#DISABLE_DIFFS ifeq ($(ARCH),PowerPC) -LLCBETAOPTION := -regalloc=local +LLCBETAOPTION := -regalloc=local -fast endif ifeq ($(ARCH),Alpha) LLCBETAOPTION := -sched=list-td From jlaskey at apple.com Wed Jun 14 06:35:16 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 14 Jun 2006 06:35:16 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineDebugInfo.cpp Message-ID: <200606141135.GAA19324@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.60 -> 1.61 MachineDebugInfo.cpp updated: 1.38 -> 1.39 --- Log message: Place dwarf headers at earliest possible point. Well behaved when skipping functions. --- Diffs of the changes: (+57 -51) DwarfWriter.cpp | 100 +++++++++++++++++++++++++++------------------------ MachineDebugInfo.cpp | 8 ++-- 2 files changed, 57 insertions(+), 51 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.60 llvm/lib/CodeGen/DwarfWriter.cpp:1.61 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.60 Fri May 12 01:33:48 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Wed Jun 14 06:35:03 2006 @@ -1646,7 +1646,11 @@ /// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc /// tools to recognize the object file contains Dwarf information. /// -void DwarfWriter::EmitInitial() const { +void DwarfWriter::EmitInitial() { + // Check to see if we already emitted intial headers. + if (didInitial) return; + didInitial = true; + // Dwarf sections base addresses. Asm->SwitchToDataSection(DwarfFrameSection, 0); EmitLabel("section_frame", 0); @@ -1676,6 +1680,9 @@ EmitLabel("text_begin", 0); Asm->SwitchToDataSection(DataSection, 0); EmitLabel("data_begin", 0); + + // Emit common frame information. + EmitInitialDebugFrame(); } /// EmitDIE - Recusively Emits a debug information entry. @@ -2286,35 +2293,6 @@ } } -/// ShouldEmitDwarf - Determine if Dwarf declarations should be made. -/// -bool DwarfWriter::ShouldEmitDwarf() { - // Check if debug info is present. - if (!DebugInfo || !DebugInfo->hasInfo()) return false; - - // Make sure initial declarations are made. - if (!didInitial) { - EmitInitial(); - - // Emit common frame information. - EmitInitialDebugFrame(); - - // Create all the compile unit DIEs. - ConstructCompileUnitDIEs(); - - // Create DIEs for each of the externally visible global variables. - ConstructGlobalDIEs(); - - // Create DIEs for each of the externally visible subprograms. - ConstructSubprogramDIEs(); - - didInitial = true; - } - - // Okay to emit. - return true; -} - //===----------------------------------------------------------------------===// // Main entry points. // @@ -2328,6 +2306,8 @@ , MF(NULL) , DebugInfo(NULL) , didInitial(false) +, shouldEmit(false) +, IsNormalText(false) , SubprogramCount(0) , CompileUnits() , Abbreviations() @@ -2363,7 +2343,23 @@ /// SetDebugInfo - Set DebugInfo when it's known that pass manager has /// created it. Set by the target AsmPrinter. void DwarfWriter::SetDebugInfo(MachineDebugInfo *DI) { - DebugInfo = DI; + // Make sure initial declarations are made. + if (!DebugInfo && DI->hasInfo()) { + DebugInfo = DI; + shouldEmit = true; + + // Emit initial sections + EmitInitial(); + + // Create all the compile unit DIEs. + ConstructCompileUnitDIEs(); + + // Create DIEs for each of the externally visible global variables. + ConstructGlobalDIEs(); + + // Create DIEs for each of the externally visible subprograms. + ConstructSubprogramDIEs(); + } } /// BeginModule - Emit all Dwarf sections that should come prior to the content. @@ -2420,17 +2416,24 @@ /// BeginFunction - Gather pre-function debug information. Assumes being /// emitted immediately after the function entry point. -void DwarfWriter::BeginFunction(MachineFunction *MF) { +void DwarfWriter::BeginFunction(MachineFunction *MF, bool IsNormalText) { this->MF = MF; + // FIXME - should be able to debug coalesced functions. + this->IsNormalText = IsNormalText; - // Begin accumulating function debug information. - DebugInfo->BeginFunction(MF); - - if (!ShouldEmitDwarf()) return; - EOL("Dwarf Begin Function"); - - // Assumes in correct section after the entry point. - EmitLabel("func_begin", ++SubprogramCount); + // FIXME - should be able to debug coalesced functions. + if (IsNormalText) { + // Begin accumulating function debug information. + DebugInfo->BeginFunction(MF); + + if (!ShouldEmitDwarf()) return; + EOL("Dwarf Begin Function"); + + // Assumes in correct section after the entry point. + EmitLabel("func_begin", ++SubprogramCount); + } else { + ShouldEmitDwarf(); + } } /// EndFunction - Gather and emit post-function debug information. @@ -2439,14 +2442,17 @@ if (!ShouldEmitDwarf()) return; EOL("Dwarf End Function"); - // Define end label for subprogram. - EmitLabel("func_end", SubprogramCount); - - // Construct scopes for subprogram. - ConstructRootScope(DebugInfo->getRootScope()); + // FIXME - should be able to debug coalesced functions. + if (IsNormalText) { + // Define end label for subprogram. + EmitLabel("func_end", SubprogramCount); - // Emit function frame information. - EmitFunctionDebugFrame(); + // Construct scopes for subprogram. + ConstructRootScope(DebugInfo->getRootScope()); + + // Emit function frame information. + EmitFunctionDebugFrame(); + } // Clear function debug information. DebugInfo->EndFunction(); Index: llvm/lib/CodeGen/MachineDebugInfo.cpp diff -u llvm/lib/CodeGen/MachineDebugInfo.cpp:1.38 llvm/lib/CodeGen/MachineDebugInfo.cpp:1.39 --- llvm/lib/CodeGen/MachineDebugInfo.cpp:1.38 Thu Apr 13 13:29:58 2006 +++ llvm/lib/CodeGen/MachineDebugInfo.cpp Wed Jun 14 06:35:03 2006 @@ -262,10 +262,10 @@ Elements.push_back(ConstantUInt::get(Type::UIntTy, Field)); } virtual void Apply(int64_t &Field) { - Elements.push_back(ConstantSInt::get(Type::IntTy, Field)); + Elements.push_back(ConstantSInt::get(Type::LongTy, Field)); } virtual void Apply(uint64_t &Field) { - Elements.push_back(ConstantUInt::get(Type::UIntTy, Field)); + Elements.push_back(ConstantUInt::get(Type::ULongTy, Field)); } virtual void Apply(bool &Field) { Elements.push_back(ConstantBool::get(Field)); @@ -345,10 +345,10 @@ Fields.push_back(Type::UIntTy); } virtual void Apply(int64_t &Field) { - Fields.push_back(Type::IntTy); + Fields.push_back(Type::LongTy); } virtual void Apply(uint64_t &Field) { - Fields.push_back(Type::UIntTy); + Fields.push_back(Type::ULongTy); } virtual void Apply(bool &Field) { Fields.push_back(Type::BoolTy); From jlaskey at apple.com Wed Jun 14 06:35:17 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 14 Jun 2006 06:35:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp Message-ID: <200606141135.GAA19328@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ATTAsmPrinter.cpp updated: 1.50 -> 1.51 --- Log message: Place dwarf headers at earliest possible point. Well behaved when skipping functions. --- Diffs of the changes: (+4 -1) X86ATTAsmPrinter.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp diff -u llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.50 llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.51 --- llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.50 Wed May 31 17:34:26 2006 +++ llvm/lib/Target/X86/X86ATTAsmPrinter.cpp Wed Jun 14 06:35:03 2006 @@ -29,6 +29,8 @@ // Let PassManager know we need debug information and relay // the MachineDebugInfo address on to DwarfWriter. DW.SetDebugInfo(&getAnalysis()); + // FIXME - should be able to debug coalesced functions. + bool IsNormalText = true; SetupMachineFunction(MF); O << "\n\n"; @@ -72,13 +74,14 @@ SwitchToTextSection("", F); O << "\t.weak " << CurrentFnName << "\n"; } + IsNormalText = false; break; } O << CurrentFnName << ":\n"; if (Subtarget->TargetType == X86Subtarget::isDarwin) { // Emit pre-function debug information. - DW.BeginFunction(&MF); + DW.BeginFunction(&MF, IsNormalText); } // Print out code for the function. From jlaskey at apple.com Wed Jun 14 06:35:18 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 14 Jun 2006 06:35:18 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200606141135.GAA19332@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.36 -> 1.37 --- Log message: Place dwarf headers at earliest possible point. Well behaved when skipping functions. --- Diffs of the changes: (+17 -5) DwarfWriter.h | 22 +++++++++++++++++----- 1 files changed, 17 insertions(+), 5 deletions(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.36 llvm/include/llvm/CodeGen/DwarfWriter.h:1.37 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.36 Fri May 19 14:07:54 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Wed Jun 14 06:35:03 2006 @@ -106,6 +106,15 @@ /// bool didInitial; + /// shouldEmit - Flag to indicate if debug information should be emitted. + /// + bool shouldEmit; + + /// IsNormalText - Flag to indicate if routine is not special case text + /// (coalesced.) + // FIXME - should be able to debug coalesced functions. + bool IsNormalText; + /// SubprogramCount - The running count of functions being compiled. /// unsigned SubprogramCount; @@ -372,7 +381,7 @@ /// EmitInitial - Emit initial Dwarf declarations. /// - void EmitInitial() const; + void EmitInitial(); /// EmitDIE - Recusively Emits a debug information entry. /// @@ -448,9 +457,8 @@ void ConstructSubprogramDIEs(); /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made. - /// When called it also checks to see if debug info is newly available. if - /// so the initial Dwarf headers are emitted. - bool ShouldEmitDwarf(); + /// + bool ShouldEmitDwarf() const { return shouldEmit; } public: @@ -475,11 +483,15 @@ /// BeginFunction - Gather pre-function debug information. Assumes being /// emitted immediately after the function entry point. - void BeginFunction(MachineFunction *MF); + void BeginFunction(MachineFunction *MF, bool IsNormalText); /// EndFunction - Gather and emit post-function debug information. /// void EndFunction(); + + /// NonFunction - Function does not have a true body. + /// + void NonFunction(); }; } // end llvm namespace From jlaskey at apple.com Wed Jun 14 06:35:19 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 14 Jun 2006 06:35:19 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200606141135.GAA19336@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.176 -> 1.177 --- Log message: Place dwarf headers at earliest possible point. Well behaved when skipping functions. --- Diffs of the changes: (+4 -2) PPCAsmPrinter.cpp | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.176 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.177 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.176 Mon May 15 00:48:32 2006 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Wed Jun 14 06:35:03 2006 @@ -488,8 +488,9 @@ /// method to print assembly for each instruction. /// bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { - // FIXME - is this the earliest this can be set? DW.SetDebugInfo(&getAnalysis()); + // FIXME - should be able to debug coalesced functions. + bool IsNormalText = true; SetupMachineFunction(MF); O << "\n\n"; @@ -517,13 +518,14 @@ ".section __TEXT,__textcoal_nt,coalesced,pure_instructions", F); O << "\t.globl\t" << CurrentFnName << "\n"; O << "\t.weak_definition\t" << CurrentFnName << "\n"; + IsNormalText = false; break; } EmitAlignment(4, F); O << CurrentFnName << ":\n"; // Emit pre-function debug information. - DW.BeginFunction(&MF); + DW.BeginFunction(&MF, IsNormalText); // Print out code for the function. for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); From jlaskey at apple.com Wed Jun 14 09:45:51 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 14 Jun 2006 09:45:51 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/MachineDebugInfo.h Message-ID: <200606141445.JAA02068@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: MachineDebugInfo.h updated: 1.33 -> 1.34 --- Log message: Change versioning to per debug info descriptor (merged with tag.) --- Diffs of the changes: (+21 -26) MachineDebugInfo.h | 47 +++++++++++++++++++++-------------------------- 1 files changed, 21 insertions(+), 26 deletions(-) Index: llvm/include/llvm/CodeGen/MachineDebugInfo.h diff -u llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.33 llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.34 --- llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.33 Fri Apr 7 11:34:45 2006 +++ llvm/include/llvm/CodeGen/MachineDebugInfo.h Wed Jun 14 09:45:39 2006 @@ -90,23 +90,35 @@ /// class DebugInfoDesc { private: + enum { + tag_mask = 0x0000ffff, + version_shift = 16 + }; + + unsigned Tag; // Content indicator. Dwarf values are // used but that does not limit use to // Dwarf writers. protected: - DebugInfoDesc(unsigned T) : Tag(T) {} + DebugInfoDesc(unsigned T) : Tag(T | (LLVMDebugVersion << version_shift)) {} public: virtual ~DebugInfoDesc() {} // Accessors - unsigned getTag() const { return Tag; } + unsigned getTag() const { return Tag & tag_mask; } + unsigned getVersion() const { return Tag >> version_shift; } - /// TagFromGlobal - Returns the Tag number from a debug info descriptor - /// GlobalVariable. Return DIIValid if operand is not an unsigned int. + /// TagFromGlobal - Returns the tag number from a debug info descriptor + /// GlobalVariable. Return DIIValid if operand is not an unsigned int. static unsigned TagFromGlobal(GlobalVariable *GV); + /// VersionFromGlobal - Returns the version number from a debug info + /// descriptor GlobalVariable. Return DIIValid if operand is not an unsigned + /// int. + static unsigned VersionFromGlobal(GlobalVariable *GV); + /// DescFactory - Create an instance of debug info descriptor based on Tag. /// Return NULL if not a recognized Tag. static DebugInfoDesc *DescFactory(unsigned Tag); @@ -216,7 +228,6 @@ /// source/header file. class CompileUnitDesc : public AnchoredDesc { private: - unsigned DebugVersion; // LLVM debug version when produced. unsigned Language; // Language number (ex. DW_LANG_C89.) std::string FileName; // Source file name. std::string Directory; // Source file directory. @@ -227,7 +238,6 @@ // Accessors - unsigned getDebugVersion() const { return DebugVersion; } unsigned getLanguage() const { return Language; } const std::string &getFileName() const { return FileName; } const std::string &getDirectory() const { return Directory; } @@ -243,10 +253,6 @@ static bool classof(const CompileUnitDesc *) { return true; } static bool classof(const DebugInfoDesc *D); - /// DebugVersionFromGlobal - Returns the version number from a compile unit - /// GlobalVariable. Return DIIValid if operand is not an unsigned int. - static unsigned DebugVersionFromGlobal(GlobalVariable *GV); - /// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. /// virtual void ApplyToFields(DIVisitor *Visitor); @@ -702,17 +708,13 @@ /// into DebugInfoDesc objects. class DIDeserializer { private: - unsigned DebugVersion; // Version of debug information in use. std::map GlobalDescs; // Previously defined gloabls. public: - DIDeserializer() : DebugVersion(LLVMDebugVersion) {} + DIDeserializer() {} ~DIDeserializer() {} - // Accessors - unsigned getDebugVersion() const { return DebugVersion; } - /// Deserialize - Reconstitute a GlobalVariable into it's component /// DebugInfoDesc objects. DebugInfoDesc *Deserialize(Value *V); @@ -780,14 +782,12 @@ Invalid, Valid }; - unsigned DebugVersion; // Version of debug information in use. std::map Validity;// Tracks prior results. std::map Counts; // Count of fields per Tag type. public: DIVerifier() - : DebugVersion(LLVMDebugVersion) - , Validity() + : Validity() , Counts() {} ~DIVerifier() {} @@ -1039,15 +1039,10 @@ std::vector AnchoredDescs; for (unsigned i = 0, N = Globals.size(); i < N; ++i) { GlobalVariable *GV = Globals[i]; - unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); - - if (isa(&Desc)) { - unsigned DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV); - // FIXME - In the short term, changes are too drastic to continue. - if (DebugVersion != LLVMDebugVersion) break; - } - if (Tag == Desc.getTag()) { + // FIXME - In the short term, changes are too drastic to continue. + if (DebugInfoDesc::TagFromGlobal(GV) == Desc.getTag() && + DebugInfoDesc::VersionFromGlobal(GV) == LLVMDebugVersion) { AnchoredDescs.push_back(cast(DR.Deserialize(GV))); } } From jlaskey at apple.com Wed Jun 14 09:45:52 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 14 Jun 2006 09:45:52 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/MachineDebugInfo.cpp Message-ID: <200606141445.JAA02072@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: MachineDebugInfo.cpp updated: 1.39 -> 1.40 --- Log message: Change versioning to per debug info descriptor (merged with tag.) --- Diffs of the changes: (+24 -28) MachineDebugInfo.cpp | 52 +++++++++++++++++++++++---------------------------- 1 files changed, 24 insertions(+), 28 deletions(-) Index: llvm/lib/CodeGen/MachineDebugInfo.cpp diff -u llvm/lib/CodeGen/MachineDebugInfo.cpp:1.39 llvm/lib/CodeGen/MachineDebugInfo.cpp:1.40 --- llvm/lib/CodeGen/MachineDebugInfo.cpp:1.39 Wed Jun 14 06:35:03 2006 +++ llvm/lib/CodeGen/MachineDebugInfo.cpp Wed Jun 14 09:45:39 2006 @@ -455,11 +455,20 @@ //===----------------------------------------------------------------------===// -/// TagFromGlobal - Returns the Tag number from a debug info descriptor -/// GlobalVariable. +/// TagFromGlobal - Returns the tag number from a debug info descriptor +/// GlobalVariable. Return DIIValid if operand is not an unsigned int. unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { ConstantUInt *C = getUIntOperand(GV, 0); - return C ? (unsigned)C->getValue() : (unsigned)DW_TAG_invalid; + return C ? ((unsigned)C->getValue() & tag_mask) : (unsigned)DW_TAG_invalid; +} + +/// VersionFromGlobal - Returns the version number from a debug info +/// descriptor GlobalVariable. Return DIIValid if operand is not an unsigned +/// int. +unsigned DebugInfoDesc::VersionFromGlobal(GlobalVariable *GV) { + ConstantUInt *C = getUIntOperand(GV, 0); + return C ? ((unsigned)C->getValue() >> version_shift) : + (unsigned)DW_TAG_invalid; } /// DescFactory - Create an instance of debug info descriptor based on Tag. @@ -563,6 +572,7 @@ #ifndef NDEBUG void AnchorDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "AnchorTag(" << AnchorTag << ")\n"; } @@ -589,7 +599,6 @@ CompileUnitDesc::CompileUnitDesc() : AnchoredDesc(DW_TAG_compile_unit) -, DebugVersion(LLVMDebugVersion) , Language(0) , FileName("") , Directory("") @@ -601,19 +610,11 @@ return D->getTag() == DW_TAG_compile_unit; } -/// DebugVersionFromGlobal - Returns the version number from a compile unit -/// GlobalVariable. -unsigned CompileUnitDesc::DebugVersionFromGlobal(GlobalVariable *GV) { - ConstantUInt *C = getUIntOperand(GV, 2); - return C ? (unsigned)C->getValue() : (unsigned)DW_TAG_invalid; -} - /// ApplyToFields - Target the visitor to the fields of the CompileUnitDesc. /// void CompileUnitDesc::ApplyToFields(DIVisitor *Visitor) { AnchoredDesc::ApplyToFields(Visitor); - Visitor->Apply(DebugVersion); Visitor->Apply(Language); Visitor->Apply(FileName); Visitor->Apply(Directory); @@ -642,9 +643,9 @@ #ifndef NDEBUG void CompileUnitDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Anchor(" << getAnchor() << "), " - << "DebugVersion(" << DebugVersion << "), " << "Language(" << Language << "), " << "FileName(\"" << FileName << "\"), " << "Directory(\"" << Directory << "\"), " @@ -696,6 +697,7 @@ #ifndef NDEBUG void TypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << Context << "), " << "Name(\"" << Name << "\"), " @@ -742,6 +744,7 @@ #ifndef NDEBUG void BasicTypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << getContext() << "), " << "Name(\"" << getName() << "\"), " @@ -799,6 +802,7 @@ #ifndef NDEBUG void DerivedTypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << getContext() << "), " << "Name(\"" << getName() << "\"), " @@ -853,6 +857,7 @@ #ifndef NDEBUG void CompositeTypeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << getContext() << "), " << "Name(\"" << getName() << "\"), " @@ -901,6 +906,7 @@ #ifndef NDEBUG void SubrangeDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Lo(" << Lo << "), " << "Hi(" << Hi << ")\n"; @@ -944,6 +950,7 @@ #ifndef NDEBUG void EnumeratorDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Name(" << Name << "), " << "Value(" << Value << ")\n"; @@ -1005,6 +1012,7 @@ #ifndef NDEBUG void VariableDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Context(" << Context << "), " << "Name(\"" << Name << "\"), " @@ -1087,6 +1095,7 @@ #ifndef NDEBUG void GlobalVariableDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Anchor(" << getAnchor() << "), " << "Name(\"" << getName() << "\"), " @@ -1138,6 +1147,7 @@ #ifndef NDEBUG void SubprogramDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << "), " << "Anchor(" << getAnchor() << "), " << "Name(\"" << getName() << "\"), " @@ -1184,6 +1194,7 @@ #ifndef NDEBUG void BlockDesc::dump() { std::cerr << getDescString() << " " + << "Version(" << getVersion() << "), " << "Tag(" << getTag() << ")," << "Context(" << Context << ")\n"; } @@ -1205,11 +1216,6 @@ // Get the Tag from the global. unsigned Tag = DebugInfoDesc::TagFromGlobal(GV); - // Get the debug version if a compile unit. - if (Tag == DW_TAG_compile_unit) { - DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV); - } - // Create an empty instance of the correct sort. Slot = DebugInfoDesc::DescFactory(Tag); @@ -1366,16 +1372,6 @@ // Check for user defined descriptors. if (Tag == DW_TAG_invalid) return true; - // If a compile unit we need the debug version. - if (Tag == DW_TAG_compile_unit) { - DebugVersion = CompileUnitDesc::DebugVersionFromGlobal(GV); - // FIXME - In the short term, changes are too drastic to continue. - if (DebugVersion != LLVMDebugVersion) { - ValiditySlot = Invalid; - return false; - } - } - // Construct an empty DebugInfoDesc. DebugInfoDesc *DD = DebugInfoDesc::DescFactory(Tag); From evan.cheng at apple.com Wed Jun 14 13:17:52 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Jun 2006 13:17:52 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200606141817.NAA03436@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.228 -> 1.229 --- Log message: Add argument registers to the end of call operand list (partial fix). --- Diffs of the changes: (+15 -1) X86ISelLowering.cpp | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.228 llvm/lib/Target/X86/X86ISelLowering.cpp:1.229 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.228 Fri Jun 9 01:24:42 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Jun 14 13:17:40 2006 @@ -617,6 +617,13 @@ std::vector Ops; Ops.push_back(Chain); Ops.push_back(Callee); + + // Add argument registers to the end of the list so that they are known live + // into the call. + for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) + Ops.push_back(DAG.getRegister(RegsToPass[i].first, + RegsToPass[i].second.getValueType())); + if (InFlag.Val) Ops.push_back(InFlag); @@ -985,7 +992,7 @@ return DAG.getNode(ISD::MERGE_VALUES, RetVTs, ArgValues); } - SDOperand X86TargetLowering::LowerFastCCCallTo(SDOperand Op, SelectionDAG &DAG) { +SDOperand X86TargetLowering::LowerFastCCCallTo(SDOperand Op, SelectionDAG &DAG) { SDOperand Chain = Op.getOperand(0); unsigned CallingConv= cast(Op.getOperand(1))->getValue(); bool isVarArg = cast(Op.getOperand(2))->getValue() != 0; @@ -1139,6 +1146,13 @@ std::vector Ops; Ops.push_back(Chain); Ops.push_back(Callee); + + // Add argument registers to the end of the list so that they are known live + // into the call. + for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) + Ops.push_back(DAG.getRegister(RegsToPass[i].first, + RegsToPass[i].second.getValueType())); + if (InFlag.Val) Ops.push_back(InFlag); From evan.cheng at apple.com Wed Jun 14 14:28:03 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Jun 2006 14:28:03 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200606141928.OAA03878@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.209 -> 1.210 --- Log message: Fix support for optional input flag. --- Diffs of the changes: (+11 -17) DAGISelEmitter.cpp | 28 +++++++++++----------------- 1 files changed, 11 insertions(+), 17 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.209 llvm/utils/TableGen/DAGISelEmitter.cpp:1.210 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.209 Tue Jun 13 16:47:27 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Jun 14 14:27:50 2006 @@ -2515,8 +2515,10 @@ if (NodeHasInFlag || NodeHasOutFlag || NodeHasOptInFlag || HasImpInputs) emitDecl("InFlag"); - if (NodeHasOptInFlag) - emitCode("bool HasOptInFlag = false;"); + if (NodeHasOptInFlag) { + emitCode("bool HasOptInFlag = " + "N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag;"); + } // How many results is this pattern expected to produce? unsigned PatResults = 0; @@ -2576,8 +2578,12 @@ bool ChainEmitted = NodeHasChain; if (NodeHasChain) emitCode("Select(" + ChainName + ", " + ChainName + ");"); - if (NodeHasInFlag || NodeHasOptInFlag || HasImpInputs) + if (NodeHasInFlag || HasImpInputs) EmitInFlagSelectCode(Pattern, "N", ChainEmitted, true); + if (NodeHasOptInFlag) { + emitCode("if (HasOptInFlag)"); + emitCode(" Select(InFlag, N.getOperand(N.getNumOperands()-1));"); + } if (isRoot) { // The operands have been selected. Remove them from InFlightSet. @@ -2854,7 +2860,6 @@ unsigned OpNo = (unsigned) NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE); bool HasInFlag = NodeHasProperty(N, SDNodeInfo::SDNPInFlag, ISE); - bool HasOptInFlag = NodeHasProperty(N, SDNodeInfo::SDNPOptInFlag, ISE); for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i, ++OpNo) { TreePatternNode *Child = N->getChild(i); if (!Child->isLeaf()) { @@ -2894,20 +2899,9 @@ } } - if (HasInFlag || HasOptInFlag) { - std::string Code; - if (HasOptInFlag) { - emitCode("if (" + RootName + ".getNumOperands() == " + utostr(OpNo+1) + - ") {"); - Code = " "; - } - emitCode(Code + "Select(InFlag, " + RootName + + if (HasInFlag) + emitCode("Select(InFlag, " + RootName + ".getOperand(" + utostr(OpNo) + "));"); - if (HasOptInFlag) { - emitCode(" HasOptInFlag = true;"); - emitCode("}"); - } - } } /// EmitCopyFromRegs - Emit code to copy result to physical registers From alenhar2 at cs.uiuc.edu Wed Jun 14 16:17:47 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 14 Jun 2006 16:17:47 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp PoolAllocate.h Message-ID: <200606142117.QAA04366@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/lib/PoolAllocate: Heuristic.cpp updated: 1.13 -> 1.14 PoolAllocate.h updated: 1.48 -> 1.49 --- Log message: Fix compile problems --- Diffs of the changes: (+2 -2) Heuristic.cpp | 2 +- PoolAllocate.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) Index: llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp diff -u llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp:1.13 llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp:1.14 --- llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp:1.13 Wed May 18 14:56:28 2005 +++ llvm-poolalloc/lib/PoolAllocate/Heuristic.cpp Wed Jun 14 16:17:32 2006 @@ -31,7 +31,7 @@ SmartCoallesceNodes, CyclicNodes, AllButUnreachableFromMemory, - AllNodes, + AllNodes }; cl::opt TheHeuristic("poolalloc-heuristic", Index: llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h diff -u llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.48 llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.49 --- llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h:1.48 Thu Dec 22 10:32:21 2005 +++ llvm-poolalloc/lib/PoolAllocate/PoolAllocate.h Wed Jun 14 16:17:32 2006 @@ -107,7 +107,7 @@ } }; -}; // end PA namespace +} // end PA namespace From alenhar2 at cs.uiuc.edu Wed Jun 14 16:17:47 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 14 Jun 2006 16:17:47 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/Makefile Message-ID: <200606142117.QAA04360@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime: Makefile updated: 1.10 -> 1.11 --- Log message: Fix compile problems --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-poolalloc/runtime/Makefile diff -u llvm-poolalloc/runtime/Makefile:1.10 llvm-poolalloc/runtime/Makefile:1.11 --- llvm-poolalloc/runtime/Makefile:1.10 Thu Dec 22 12:04:25 2005 +++ llvm-poolalloc/runtime/Makefile Wed Jun 14 16:17:32 2006 @@ -6,6 +6,6 @@ # # List all of the subdirectories that we will compile. # -DIRS=PoolAllocator FreeListAllocator FL2Allocator +DIRS=FreeListAllocator FL2Allocator include $(LEVEL)/Makefile.common From alenhar2 at cs.uiuc.edu Wed Jun 14 16:17:47 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 14 Jun 2006 16:17:47 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.cpp PoolAllocator.h Message-ID: <200606142117.QAA04378@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/FL2Allocator: PoolAllocator.cpp updated: 1.52 -> 1.53 PoolAllocator.h updated: 1.26 -> 1.27 --- Log message: Fix compile problems --- Diffs of the changes: (+3 -3) PoolAllocator.cpp | 2 +- PoolAllocator.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) Index: llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.cpp diff -u llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.cpp:1.52 llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.cpp:1.53 --- llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.cpp:1.52 Thu Apr 27 10:50:02 2006 +++ llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.cpp Wed Jun 14 16:17:32 2006 @@ -542,7 +542,7 @@ DO_IF_TRACE(fprintf(stderr, "[%d] poolalloc%s(%d) -> ", getPoolNumber(Pool), PoolTraits::getSuffix(), NumBytesA)); - int NumBytes = NumBytesA; + unsigned NumBytes = NumBytesA; // If a null pool descriptor is passed in, this is not a pool allocated data // structure. Hand off to the system malloc. Index: llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.h diff -u llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.h:1.26 llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.h:1.27 --- llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.h:1.26 Thu Apr 27 10:50:02 2006 +++ llvm-poolalloc/runtime/FL2Allocator/PoolAllocator.h Wed Jun 14 16:17:32 2006 @@ -37,7 +37,7 @@ typedef unsigned long NodeHeaderType; enum { UseLargeArrayObjects = 1, - CanGrowPool = 1, + CanGrowPool = 1 }; // Pointers are just pointers. @@ -69,7 +69,7 @@ enum { UseLargeArrayObjects = 0, - CanGrowPool = 0, + CanGrowPool = 0 }; // Represent pointers with indexes from the pool base. From alenhar2 at cs.uiuc.edu Wed Jun 14 16:17:47 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 14 Jun 2006 16:17:47 -0500 Subject: [llvm-commits] CVS: llvm-poolalloc/runtime/FreeListAllocator/PoolAllocator.cpp PoolSlab.h Message-ID: <200606142117.QAA04372@zion.cs.uiuc.edu> Changes in directory llvm-poolalloc/runtime/FreeListAllocator: PoolAllocator.cpp updated: 1.34 -> 1.35 PoolSlab.h updated: 1.6 -> 1.7 --- Log message: Fix compile problems --- Diffs of the changes: (+4 -4) PoolAllocator.cpp | 5 ++--- PoolSlab.h | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) Index: llvm-poolalloc/runtime/FreeListAllocator/PoolAllocator.cpp diff -u llvm-poolalloc/runtime/FreeListAllocator/PoolAllocator.cpp:1.34 llvm-poolalloc/runtime/FreeListAllocator/PoolAllocator.cpp:1.35 --- llvm-poolalloc/runtime/FreeListAllocator/PoolAllocator.cpp:1.34 Wed May 18 14:56:31 2005 +++ llvm-poolalloc/runtime/FreeListAllocator/PoolAllocator.cpp Wed Jun 14 16:17:32 2006 @@ -99,7 +99,6 @@ NodesPerSlab = MaxNodesPerPage; } } - NewSlab->NodesPerSlab = NodesPerSlab; NewSlab->NextFreeData = NewSlab->LiveNodes = 0; NewSlab->Next = NULL; @@ -413,7 +412,7 @@ // // Find the data block that corresponds with this pointer. // - Data = (Slabp->Data + (Pool->NodeSize * (Pool->FreeList.Next - &(Slabp->BlockList[0])))); + Data = (Slabp->Data + (Pool->NodeSize * (Pool->FreeList.Next - &(BlockList(Slabp)[0])))); // // Unlink the first block. @@ -451,7 +450,7 @@ // Find the node pointer that corresponds to this data block. // NodePointer Node; - Node.Next = &(slabp->BlockList[((unsigned char *)Block - slabp->Data)/Pool->NodeSize]); + Node.Next = &(BlockList(slabp)[((unsigned char *)Block - slabp->Data)/Pool->NodeSize]); // // Add the node back to the free list. Index: llvm-poolalloc/runtime/FreeListAllocator/PoolSlab.h diff -u llvm-poolalloc/runtime/FreeListAllocator/PoolSlab.h:1.6 llvm-poolalloc/runtime/FreeListAllocator/PoolSlab.h:1.7 --- llvm-poolalloc/runtime/FreeListAllocator/PoolSlab.h:1.6 Wed May 18 14:56:32 2005 +++ llvm-poolalloc/runtime/FreeListAllocator/PoolSlab.h Wed Jun 14 16:17:33 2006 @@ -73,7 +73,8 @@ unsigned char * Data; // Pointer to the list of nodes - NodePointer BlockList []; + //NodePointer* BlockList; }; +#define BlockList(x) ((NodePointer*)((char*)x + sizeof(SlabHeader))) #endif /* _POOLSLAB_H */ From lattner at cs.uiuc.edu Wed Jun 14 16:25:09 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Jun 2006 16:25:09 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/X86/vec_ins_extract.ll Message-ID: <200606142125.QAA04461@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/X86: vec_ins_extract.ll added (r1.1) --- Log message: new testcase, not currently working. --- Diffs of the changes: (+52 -0) vec_ins_extract.ll | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 52 insertions(+) Index: llvm/test/Regression/CodeGen/X86/vec_ins_extract.ll diff -c /dev/null llvm/test/Regression/CodeGen/X86/vec_ins_extract.ll:1.1 *** /dev/null Wed Jun 14 16:25:07 2006 --- llvm/test/Regression/CodeGen/X86/vec_ins_extract.ll Wed Jun 14 16:24:57 2006 *************** *** 0 **** --- 1,52 ---- + ; RUN: llvm-as< %s | llc -march=x86 -mcpu=yonah && + ; RUN: llvm-as< %s | llc -march=x86 -mcpu=yonah | not grep sub.*esp + + ; This checks that various insert/extract idiom work without going to the + ; stack. + ; XFAIL: * + + void %test(<4 x float>* %F, float %f) { + entry: + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp3 = add <4 x float> %tmp, %tmp ; <<4 x float>> [#uses=1] + %tmp10 = insertelement <4 x float> %tmp3, float %f, uint 0 ; <<4 x float>> [#uses=2] + %tmp6 = add <4 x float> %tmp10, %tmp10 ; <<4 x float>> [#uses=1] + store <4 x float> %tmp6, <4 x float>* %F + ret void + } + + void %test2(<4 x float>* %F, float %f) { + entry: + %G = alloca <4 x float>, align 16 ; <<4 x float>*> [#uses=3] + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp3 = add <4 x float> %tmp, %tmp ; <<4 x float>> [#uses=1] + store <4 x float> %tmp3, <4 x float>* %G + %tmp = getelementptr <4 x float>* %G, int 0, int 2 ; [#uses=1] + store float %f, float* %tmp + %tmp4 = load <4 x float>* %G ; <<4 x float>> [#uses=2] + %tmp6 = add <4 x float> %tmp4, %tmp4 ; <<4 x float>> [#uses=1] + store <4 x float> %tmp6, <4 x float>* %F + ret void + } + + void %test3(<4 x float>* %F, float* %f) { + entry: + %G = alloca <4 x float>, align 16 ; <<4 x float>*> [#uses=2] + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp3 = add <4 x float> %tmp, %tmp ; <<4 x float>> [#uses=1] + store <4 x float> %tmp3, <4 x float>* %G + %tmp = getelementptr <4 x float>* %G, int 0, int 2 ; [#uses=1] + %tmp = load float* %tmp ; [#uses=1] + store float %tmp, float* %f + ret void + } + + void %test4(<4 x float>* %F, float* %f) { + entry: + %tmp = load <4 x float>* %F ; <<4 x float>> [#uses=2] + %tmp5.lhs = extractelement <4 x float> %tmp, uint 0 ; [#uses=1] + %tmp5.rhs = extractelement <4 x float> %tmp, uint 0 ; [#uses=1] + %tmp5 = add float %tmp5.lhs, %tmp5.rhs ; [#uses=1] + store float %tmp5, float* %f + ret void + } From lattner at cs.uiuc.edu Wed Jun 14 16:26:30 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 14 Jun 2006 16:26:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/README-SSE.txt Message-ID: <200606142126.QAA04506@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: README-SSE.txt updated: 1.2 -> 1.3 --- Log message: add a note --- Diffs of the changes: (+29 -0) README-SSE.txt | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+) Index: llvm/lib/Target/X86/README-SSE.txt diff -u llvm/lib/Target/X86/README-SSE.txt:1.2 llvm/lib/Target/X86/README-SSE.txt:1.3 --- llvm/lib/Target/X86/README-SSE.txt:1.2 Tue May 30 18:56:31 2006 +++ llvm/lib/Target/X86/README-SSE.txt Wed Jun 14 16:26:18 2006 @@ -664,3 +664,32 @@ //===---------------------------------------------------------------------===// Add hooks to commute some CMPP operations. + +//===---------------------------------------------------------------------===// + +Implement some missing insert/extract element operations without going through +the stack. Testcase here: +CodeGen/X86/vec_ins_extract.ll +corresponds to this C code: + +typedef float vectorfloat __attribute__((vector_size(16))); +void test(vectorfloat *F, float f) { + vectorfloat G = *F + *F; + *((float*)&G) = f; + *F = G + G; +} +void test2(vectorfloat *F, float f) { + vectorfloat G = *F + *F; + ((float*)&G)[2] = f; + *F = G + G; +} +void test3(vectorfloat *F, float *f) { + vectorfloat G = *F + *F; + *f = ((float*)&G)[2]; +} +void test4(vectorfloat *F, float *f) { + vectorfloat G = *F + *F; + *f = *((float*)&G); +} + +//===---------------------------------------------------------------------===// From evan.cheng at apple.com Wed Jun 14 17:22:33 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Jun 2006 17:22:33 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200606142222.RAA04925@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.210 -> 1.211 --- Log message: Added support for variable_ops. --- Diffs of the changes: (+78 -85) DAGISelEmitter.cpp | 163 +++++++++++++++++++++++++---------------------------- 1 files changed, 78 insertions(+), 85 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.210 llvm/utils/TableGen/DAGISelEmitter.cpp:1.211 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.210 Wed Jun 14 14:27:50 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Jun 14 17:22:20 2006 @@ -2500,6 +2500,7 @@ if (InstPatNode && InstPatNode->getOperator()->getName() == "set") { InstPatNode = InstPatNode->getChild(1); } + bool HasVarOps = isRoot && II.hasVariableNumberOfOperands; bool HasImpInputs = isRoot && Inst.getNumImpOperands() > 0; bool HasImpResults = isRoot && Inst.getNumImpResults() > 0; bool NodeHasOptInFlag = isRoot && @@ -2515,10 +2516,11 @@ if (NodeHasInFlag || NodeHasOutFlag || NodeHasOptInFlag || HasImpInputs) emitDecl("InFlag"); - if (NodeHasOptInFlag) { - emitCode("bool HasOptInFlag = " + if (NodeHasOptInFlag) + emitCode("bool HasInFlag = " "N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag;"); - } + if (HasVarOps) + emitCode("std::vector Ops;"); // How many results is this pattern expected to produce? unsigned PatResults = 0; @@ -2581,7 +2583,7 @@ if (NodeHasInFlag || HasImpInputs) EmitInFlagSelectCode(Pattern, "N", ChainEmitted, true); if (NodeHasOptInFlag) { - emitCode("if (HasOptInFlag)"); + emitCode("if (HasInFlag)"); emitCode(" Select(InFlag, N.getOperand(N.getNumOperands()-1));"); } @@ -2596,96 +2598,87 @@ unsigned ResNo = TmpNo++; if (!isRoot || InputHasChain || NodeHasChain || NodeHasOutFlag || NodeHasOptInFlag) { - if (NodeHasOptInFlag) { - unsigned FlagNo = (unsigned) NodeHasChain + Pattern->getNumChildren(); - emitDecl("ResNode", true); - emitCode("if (HasOptInFlag)"); - std::string Code = " ResNode = CurDAG->getTargetNode(" + - II.Namespace + "::" + II.TheDef->getName(); - - // Output order: results, chain, flags - // Result types. - if (PatResults > 0) { - if (N->getTypeNum(0) != MVT::isVoid) - Code += ", " + getEnumName(N->getTypeNum(0)); - } - if (NodeHasChain) - Code += ", MVT::Other"; - if (NodeHasOutFlag) - Code += ", MVT::Flag"; + std::string Code; + std::string Code2; + std::string NodeName; + if (!isRoot) { + NodeName = "Tmp" + utostr(ResNo); + emitDecl(NodeName); + Code2 = NodeName + " = SDOperand("; + } else { + NodeName = "ResNode"; + emitDecl(NodeName, true); + Code2 = NodeName + " = "; + } + Code = "CurDAG->getTargetNode(" + + II.Namespace + "::" + II.TheDef->getName(); - // Inputs. - for (unsigned i = 0, e = Ops.size(); i != e; ++i) - Code += ", Tmp" + utostr(Ops[i]); - if (NodeHasChain) Code += ", " + ChainName; - emitCode(Code + ", InFlag);"); + // Output order: results, chain, flags + // Result types. + if (NumResults > 0 && N->getTypeNum(0) != MVT::isVoid) + Code += ", " + getEnumName(N->getTypeNum(0)); + if (NodeHasChain) + Code += ", MVT::Other"; + if (NodeHasOutFlag) + Code += ", MVT::Flag"; - emitCode("else"); - Code = " ResNode = CurDAG->getTargetNode(" + II.Namespace + "::" + - II.TheDef->getName(); + // Inputs. + for (unsigned i = 0, e = Ops.size(); i != e; ++i) { + if (HasVarOps) + emitCode("Ops.push_back(Tmp" + utostr(Ops[i]) + ");"); + else + Code += ", Tmp" + utostr(Ops[i]); + } - // Output order: results, chain, flags - // Result types. - if (PatResults > 0 && N->getTypeNum(0) != MVT::isVoid) - Code += ", " + getEnumName(N->getTypeNum(0)); - if (NodeHasChain) - Code += ", MVT::Other"; - if (NodeHasOutFlag) - Code += ", MVT::Flag"; + if (HasVarOps) { + if (NodeHasInFlag || HasImpInputs) + emitCode("for (unsigned i = 2, e = N.getNumOperands()-1; " + "i != e; ++i) {"); + else if (NodeHasOptInFlag) + emitCode("for (unsigned i = 2, e = N.getNumOperands()-HasInFlag; " + "i != e; ++i) {"); + else + emitCode("for (unsigned i = 2, e = N.getNumOperands(); " + "i != e; ++i) {"); + emitCode(" SDOperand VarOp(0, 0);"); + emitCode(" Select(VarOp, N.getOperand(i));"); + emitCode(" Ops.push_back(VarOp);"); + emitCode("}"); + } - // Inputs. - for (unsigned i = 0, e = Ops.size(); i != e; ++i) - Code += ", Tmp" + utostr(Ops[i]); - if (NodeHasChain) Code += ", " + ChainName + ");"; - emitCode(Code); + if (NodeHasChain) { + if (HasVarOps) + emitCode("Ops.push_back(" + ChainName + ");"); + else + Code += ", " + ChainName; + } + if (NodeHasInFlag || HasImpInputs) { + if (HasVarOps) + emitCode("Ops.push_back(InFlag);"); + else + Code += ", InFlag"; + } else if (NodeHasOptInFlag && HasVarOps) { + emitCode("if (HasInFlag)"); + emitCode(" Ops.push_back(InFlag);"); + } - if (NodeHasChain) - // Remember which op produces the chain. - emitCode(ChainName + " = SDOperand(ResNode" + - ", " + utostr(PatResults) + ");"); - } else { - std::string Code; - std::string NodeName; - if (!isRoot) { - NodeName = "Tmp" + utostr(ResNo); - emitDecl(NodeName); - Code = NodeName + " = SDOperand("; - } else { - NodeName = "ResNode"; - emitDecl(NodeName, true); - Code = NodeName + " = "; - } - Code += "CurDAG->getTargetNode(" + - II.Namespace + "::" + II.TheDef->getName(); + if (HasVarOps) + Code += ", Ops"; + else if (NodeHasOptInFlag) + Code = "HasInFlag ? " + Code + ", InFlag) : " + Code; - // Output order: results, chain, flags - // Result types. - if (NumResults > 0 && N->getTypeNum(0) != MVT::isVoid) - Code += ", " + getEnumName(N->getTypeNum(0)); - if (NodeHasChain) - Code += ", MVT::Other"; - if (NodeHasOutFlag) - Code += ", MVT::Flag"; + if (!isRoot) + Code += "), 0"; + emitCode(Code2 + Code + ");"); - // Inputs. - for (unsigned i = 0, e = Ops.size(); i != e; ++i) - Code += ", Tmp" + utostr(Ops[i]); - if (NodeHasChain) Code += ", " + ChainName; - if (NodeHasInFlag || HasImpInputs) Code += ", InFlag"; + if (NodeHasChain) + // Remember which op produces the chain. if (!isRoot) - emitCode(Code + "), 0);"); + emitCode(ChainName + " = SDOperand(" + NodeName + + ".Val, " + utostr(PatResults) + ");"); else - emitCode(Code + ");"); - - if (NodeHasChain) - // Remember which op produces the chain. - if (!isRoot) - emitCode(ChainName + " = SDOperand(" + NodeName + - ".Val, " + utostr(PatResults) + ");"); - else - emitCode(ChainName + " = SDOperand(" + NodeName + - ", " + utostr(PatResults) + ");"); - } + emitCode(ChainName + " = SDOperand(" + NodeName + + ", " + utostr(PatResults) + ");"); if (!isRoot) return std::make_pair(1, ResNo); From evan.cheng at apple.com Wed Jun 14 17:25:08 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Jun 2006 17:25:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200606142225.RAA04951@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.275 -> 1.276 --- Log message: X86 call instructions can take variable number of operands. Parameters of vector types are passed via XMM registers. --- Diffs of the changes: (+6 -5) X86InstrInfo.td | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.275 llvm/lib/Target/X86/X86InstrInfo.td:1.276 --- llvm/lib/Target/X86/X86InstrInfo.td:1.275 Fri Jun 2 16:09:10 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Jun 14 17:24:55 2006 @@ -438,11 +438,12 @@ // All calls clobber the non-callee saved registers... let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7] in { - def CALLpcrel32 : I<0xE8, RawFrm, (ops i32imm:$dst), "call ${dst:call}", - []>; - def CALL32r : I<0xFF, MRM2r, (ops GR32:$dst), "call {*}$dst", - [(X86call GR32:$dst)]>; - def CALL32m : I<0xFF, MRM2m, (ops i32mem:$dst), "call {*}$dst", []>; + def CALLpcrel32 : I<0xE8, RawFrm, (ops i32imm:$dst, variable_ops), + "call ${dst:call}", []>; + def CALL32r : I<0xFF, MRM2r, (ops GR32:$dst, variable_ops), + "call {*}$dst", [(X86call GR32:$dst)]>; + def CALL32m : I<0xFF, MRM2m, (ops i32mem:$dst, variable_ops), + "call {*}$dst", []>; } // Tail call stuff. From evan.cheng at apple.com Wed Jun 14 19:16:49 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 14 Jun 2006 19:16:49 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/CodeGenTarget.cpp DAGISelEmitter.cpp RegisterInfoEmitter.cpp Message-ID: <200606150016.TAA05571@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: CodeGenTarget.cpp updated: 1.67 -> 1.68 DAGISelEmitter.cpp updated: 1.211 -> 1.212 RegisterInfoEmitter.cpp updated: 1.44 -> 1.45 --- Log message: Allow more use of iPTR in patterns. --- Diffs of the changes: (+24 -24) CodeGenTarget.cpp | 44 ++++++++++++++++++++++---------------------- DAGISelEmitter.cpp | 2 +- RegisterInfoEmitter.cpp | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) Index: llvm/utils/TableGen/CodeGenTarget.cpp diff -u llvm/utils/TableGen/CodeGenTarget.cpp:1.67 llvm/utils/TableGen/CodeGenTarget.cpp:1.68 --- llvm/utils/TableGen/CodeGenTarget.cpp:1.67 Wed May 17 19:08:46 2006 +++ llvm/utils/TableGen/CodeGenTarget.cpp Wed Jun 14 19:16:37 2006 @@ -36,28 +36,28 @@ std::string llvm::getName(MVT::ValueType T) { switch (T) { case MVT::Other: return "UNKNOWN"; - case MVT::i1: return "i1"; - case MVT::i8: return "i8"; - case MVT::i16: return "i16"; - case MVT::i32: return "i32"; - case MVT::i64: return "i64"; - case MVT::i128: return "i128"; - case MVT::f32: return "f32"; - case MVT::f64: return "f64"; - case MVT::f80: return "f80"; - case MVT::f128: return "f128"; - case MVT::Flag: return "Flag"; - case MVT::isVoid:return "void"; - case MVT::v8i8: return "v8i8"; - case MVT::v4i16: return "v4i16"; - case MVT::v2i32: return "v2i32"; - case MVT::v16i8: return "v16i8"; - case MVT::v8i16: return "v8i16"; - case MVT::v4i32: return "v4i32"; - case MVT::v2i64: return "v2i64"; - case MVT::v2f32: return "v2f32"; - case MVT::v4f32: return "v4f32"; - case MVT::v2f64: return "v2f64"; + case MVT::i1: return "MVT::i1"; + case MVT::i8: return "MVT::i8"; + case MVT::i16: return "MVT::i16"; + case MVT::i32: return "MVT::i32"; + case MVT::i64: return "MVT::i64"; + case MVT::i128: return "MVT::i128"; + case MVT::f32: return "MVT::f32"; + case MVT::f64: return "MVT::f64"; + case MVT::f80: return "MVT::f80"; + case MVT::f128: return "MVT::f128"; + case MVT::Flag: return "MVT::Flag"; + case MVT::isVoid:return "MVT::void"; + case MVT::v8i8: return "MVT::v8i8"; + case MVT::v4i16: return "MVT::v4i16"; + case MVT::v2i32: return "MVT::v2i32"; + case MVT::v16i8: return "MVT::v16i8"; + case MVT::v8i16: return "MVT::v8i16"; + case MVT::v4i32: return "MVT::v4i32"; + case MVT::v2i64: return "MVT::v2i64"; + case MVT::v2f32: return "MVT::v2f32"; + case MVT::v4f32: return "MVT::v4f32"; + case MVT::v2f64: return "MVT::v2f64"; case MVT::iPTR: return "TLI.getPointerTy()"; default: assert(0 && "ILLEGAL VALUE TYPE!"); return ""; } Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.211 llvm/utils/TableGen/DAGISelEmitter.cpp:1.212 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.211 Wed Jun 14 17:22:20 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Jun 14 19:16:37 2006 @@ -2830,7 +2830,7 @@ if (Pat->getExtTypes() != Other->getExtTypes()) { // Move a type over from 'other' to 'pat'. Pat->setTypes(Other->getExtTypes()); - emitCheck(Prefix + ".Val->getValueType(0) == MVT::" + + emitCheck(Prefix + ".Val->getValueType(0) == " + getName(Pat->getTypeNum(0))); return true; } Index: llvm/utils/TableGen/RegisterInfoEmitter.cpp diff -u llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.44 llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.45 --- llvm/utils/TableGen/RegisterInfoEmitter.cpp:1.44 Wed May 24 12:04:05 2006 +++ llvm/utils/TableGen/RegisterInfoEmitter.cpp Wed Jun 14 19:16:37 2006 @@ -151,7 +151,7 @@ << " Register Class Value Types...\n const MVT::ValueType " << Name << "[] = {\n "; for (unsigned i = 0, e = RC.VTs.size(); i != e; ++i) - OS << "MVT::" << RC.VTs[i] << ", "; + OS << RC.VTs[i] << ", "; OS << "MVT::Other\n };\n\n"; } OS << "} // end anonymous namespace\n\n"; From evan.cheng at apple.com Thu Jun 15 02:22:30 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 02:22:30 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Message-ID: <200606150722.CAA13191@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAG.cpp updated: 1.95 -> 1.96 --- Log message: Instructions with variable operands (variable_ops) can have a number required operands. e.g. def CALL32r : I<0xFF, MRM2r, (ops GR32:$dst, variable_ops), "call {*}$dst", [(X86call GR32:$dst)]>; TableGen should emit operand informations for the "required" operands. Added a target instruction info flag M_VARIABLE_OPS to indicate the target instruction may have more operands in addition to the minimum required operands. --- Diffs of the changes: (+2 -1) ScheduleDAG.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.95 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.96 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.95 Wed May 31 13:03:39 2006 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Thu Jun 15 02:22:16 2006 @@ -358,7 +358,8 @@ unsigned NodeOperands = CountOperands(Node); unsigned NumMIOperands = NodeOperands + NumResults; #ifndef NDEBUG - assert((unsigned(II.numOperands) == NumMIOperands || II.numOperands == -1)&& + assert((unsigned(II.numOperands) == NumMIOperands || + (II.Flags & M_VARIABLE_OPS)) && "#operands for dag node doesn't match .td file!"); #endif From evan.cheng at apple.com Thu Jun 15 02:22:31 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 02:22:31 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetInstrInfo.h Message-ID: <200606150722.CAA13200@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetInstrInfo.h updated: 1.87 -> 1.88 --- Log message: Instructions with variable operands (variable_ops) can have a number required operands. e.g. def CALL32r : I<0xFF, MRM2r, (ops GR32:$dst, variable_ops), "call {*}$dst", [(X86call GR32:$dst)]>; TableGen should emit operand informations for the "required" operands. Added a target instruction info flag M_VARIABLE_OPS to indicate the target instruction may have more operands in addition to the minimum required operands. --- Diffs of the changes: (+14 -1) TargetInstrInfo.h | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletion(-) Index: llvm/include/llvm/Target/TargetInstrInfo.h diff -u llvm/include/llvm/Target/TargetInstrInfo.h:1.87 llvm/include/llvm/Target/TargetInstrInfo.h:1.88 --- llvm/include/llvm/Target/TargetInstrInfo.h:1.87 Thu May 18 15:42:07 2006 +++ llvm/include/llvm/Target/TargetInstrInfo.h Thu Jun 15 02:22:16 2006 @@ -76,6 +76,10 @@ // block. const unsigned M_USES_CUSTOM_DAG_SCHED_INSERTION = 1 << 11; +// M_VARIABLE_OPS - Set if this instruction can have a variable number of extra +// operands in addition to the minimum number operands specified. +const unsigned M_VARIABLE_OPS = 1 << 12; + // Machine operand flags // M_LOOK_UP_PTR_REG_CLASS - Set if this operand is a pointer value and it // requires a callback to look up its register class. @@ -97,7 +101,7 @@ class TargetInstrDescriptor { public: const char * Name; // Assembly language mnemonic for the opcode. - int numOperands; // Number of args; -1 if variable #args + unsigned numOperands; // Num of args (may be more if variable_ops). InstrSchedClass schedClass; // enum identifying instr sched class unsigned Flags; // flags identifying machine instr class unsigned TSFlags; // Target Specific Flag values @@ -144,6 +148,11 @@ const TargetRegisterClass *getInstrOperandRegClass(const TargetInstrDescriptor *II, unsigned Op) const { + if (Op >= II->numOperands) { + if (II->Flags & M_VARIABLE_OPS) + return NULL; + assert(false && "Invalid operand # of instruction"); + } const TargetOperandInfo &toi = II->OpInfo[Op]; return (toi.Flags & M_LOOK_UP_PTR_REG_CLASS) ? getPointerRegClass() : toi.RegClass; @@ -212,6 +221,10 @@ return get(Opcode).Flags & M_USES_CUSTOM_DAG_SCHED_INSERTION; } + bool hasVariableOperands(MachineOpCode Opcode) const { + return get(Opcode).Flags & M_VARIABLE_OPS; + } + /// Return true if the instruction is a register to register move /// and leave the source and dest operands in the passed parameters. virtual bool isMoveInstr(const MachineInstr& MI, From evan.cheng at apple.com Thu Jun 15 02:22:31 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 02:22:31 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/InstrInfoEmitter.cpp Message-ID: <200606150722.CAA13204@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: InstrInfoEmitter.cpp updated: 1.42 -> 1.43 --- Log message: Instructions with variable operands (variable_ops) can have a number required operands. e.g. def CALL32r : I<0xFF, MRM2r, (ops GR32:$dst, variable_ops), "call {*}$dst", [(X86call GR32:$dst)]>; TableGen should emit operand informations for the "required" operands. Added a target instruction info flag M_VARIABLE_OPS to indicate the target instruction may have more operands in addition to the minimum required operands. --- Diffs of the changes: (+7 -10) InstrInfoEmitter.cpp | 17 +++++++---------- 1 files changed, 7 insertions(+), 10 deletions(-) Index: llvm/utils/TableGen/InstrInfoEmitter.cpp diff -u llvm/utils/TableGen/InstrInfoEmitter.cpp:1.42 llvm/utils/TableGen/InstrInfoEmitter.cpp:1.43 --- llvm/utils/TableGen/InstrInfoEmitter.cpp:1.42 Thu May 18 15:42:07 2006 +++ llvm/utils/TableGen/InstrInfoEmitter.cpp Thu Jun 15 02:22:16 2006 @@ -64,9 +64,6 @@ static std::vector GetOperandInfo(const CodeGenInstruction &Inst) { std::vector Result; - if (Inst.hasVariableNumberOfOperands) - return Result; // No info for variable operand instrs. - for (unsigned i = 0, e = Inst.OperandList.size(); i != e; ++i) { if (Inst.OperandList[i].Rec->isSubClassOf("RegisterClass")) { Result.push_back(Inst.OperandList[i].Rec); @@ -170,15 +167,13 @@ std::map, unsigned> &EmittedLists, std::map, unsigned> &OpInfo, std::ostream &OS) { - int NumOperands; - if (Inst.hasVariableNumberOfOperands) - NumOperands = -1; - else if (!Inst.OperandList.empty()) + int MinOperands; + if (!Inst.OperandList.empty()) // Each logical operand can be multiple MI operands. - NumOperands = Inst.OperandList.back().MIOperandNo + + MinOperands = Inst.OperandList.back().MIOperandNo + Inst.OperandList.back().MINumOperands; else - NumOperands = 0; + MinOperands = 0; OS << " { \""; if (Inst.Name.empty()) @@ -189,7 +184,7 @@ unsigned ItinClass = !IsItineraries ? 0 : ItinClassNumber(Inst.TheDef->getValueAsDef("Itinerary")->getName()); - OS << "\",\t" << NumOperands << ", " << ItinClass + OS << "\",\t" << MinOperands << ", " << ItinClass << ", 0"; // Try to determine (from the pattern), if the instruction is a store. @@ -224,6 +219,8 @@ if (Inst.isTerminator) OS << "|M_TERMINATOR_FLAG"; if (Inst.usesCustomDAGSchedInserter) OS << "|M_USES_CUSTOM_DAG_SCHED_INSERTION"; + if (Inst.hasVariableNumberOfOperands) + OS << "|M_VARIABLE_OPS"; OS << ", 0"; // Emit all of the target-specific flags... From evan.cheng at apple.com Thu Jun 15 02:22:31 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 02:22:31 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/MachineInstr.cpp Message-ID: <200606150722.CAA13195@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: MachineInstr.cpp updated: 1.123 -> 1.124 --- Log message: Instructions with variable operands (variable_ops) can have a number required operands. e.g. def CALL32r : I<0xFF, MRM2r, (ops GR32:$dst, variable_ops), "call {*}$dst", [(X86call GR32:$dst)]>; TableGen should emit operand informations for the "required" operands. Added a target instruction info flag M_VARIABLE_OPS to indicate the target instruction may have more operands in addition to the minimum required operands. --- Diffs of the changes: (+2 -1) MachineInstr.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/MachineInstr.cpp diff -u llvm/lib/CodeGen/MachineInstr.cpp:1.123 llvm/lib/CodeGen/MachineInstr.cpp:1.124 --- llvm/lib/CodeGen/MachineInstr.cpp:1.123 Fri May 26 03:00:14 2006 +++ llvm/lib/CodeGen/MachineInstr.cpp Thu Jun 15 02:22:16 2006 @@ -91,7 +91,8 @@ /// bool MachineInstr::OperandsComplete() const { int NumOperands = TargetInstrDescriptors[Opcode].numOperands; - if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) + if ((TargetInstrDescriptors[Opcode].Flags & M_VARIABLE_OPS) == 0 && + getNumOperands() >= (unsigned)NumOperands) return true; // Broken: we have all the operands of this instruction! return false; } From evan.cheng at apple.com Thu Jun 15 02:25:25 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 02:25:25 -0500 Subject: [llvm-commits] CVS: llvm-test/TimedExec.sh Message-ID: <200606150725.CAA14257@zion.cs.uiuc.edu> Changes in directory llvm-test: TimedExec.sh updated: 1.3 -> 1.4 --- Log message: Remove unnecessary flag. --- Diffs of the changes: (+1 -2) TimedExec.sh | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm-test/TimedExec.sh diff -u llvm-test/TimedExec.sh:1.3 llvm-test/TimedExec.sh:1.4 --- llvm-test/TimedExec.sh:1.3 Wed Jun 7 16:19:34 2006 +++ llvm-test/TimedExec.sh Thu Jun 15 02:25:13 2006 @@ -18,12 +18,11 @@ fi TIMEOUT=$1 -PROGRAM=$2 shift if [ -z "$PARENT" ]; then # Start a watchdog process - $0 -p $$ $TIMEOUT $PROGRAM $* & + $0 -p $$ $TIMEOUT $* & exec "$@" else # Sleep for a specified time then wake up to kill the parent process. From evan.cheng at apple.com Thu Jun 15 03:10:41 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 03:10:41 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetInstrInfo.h Message-ID: <200606150810.DAA05000@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetInstrInfo.h updated: 1.88 -> 1.89 --- Log message: Avoid undesirable behavior when assert is not enabled. --- Diffs of the changes: (+3 -3) TargetInstrInfo.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/include/llvm/Target/TargetInstrInfo.h diff -u llvm/include/llvm/Target/TargetInstrInfo.h:1.88 llvm/include/llvm/Target/TargetInstrInfo.h:1.89 --- llvm/include/llvm/Target/TargetInstrInfo.h:1.88 Thu Jun 15 02:22:16 2006 +++ llvm/include/llvm/Target/TargetInstrInfo.h Thu Jun 15 03:10:27 2006 @@ -149,9 +149,9 @@ const TargetRegisterClass *getInstrOperandRegClass(const TargetInstrDescriptor *II, unsigned Op) const { if (Op >= II->numOperands) { - if (II->Flags & M_VARIABLE_OPS) - return NULL; - assert(false && "Invalid operand # of instruction"); + if (!(II->Flags & M_VARIABLE_OPS)) + assert(false && "Invalid operand # of instruction"); + return NULL; } const TargetOperandInfo &toi = II->OpInfo[Op]; return (toi.Flags & M_LOOK_UP_PTR_REG_CLASS) From evan.cheng at apple.com Thu Jun 15 03:11:09 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 03:11:09 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp Message-ID: <200606150811.DAA05103@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: AsmPrinter.cpp updated: 1.79 -> 1.80 --- Log message: Assert. Rather than silently stop printing. --- Diffs of the changes: (+2 -0) AsmPrinter.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.79 llvm/lib/CodeGen/AsmPrinter.cpp:1.80 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.79 Thu Jun 8 13:00:47 2006 +++ llvm/lib/CodeGen/AsmPrinter.cpp Thu Jun 15 03:10:56 2006 @@ -536,6 +536,8 @@ break; case Type::PointerTyID: if (TD->getPointerSize() == 8) { + assert(Data64bitsDirective && + "Target cannot handle 64-bit pointer exprs!"); O << Data64bitsDirective; break; } From evan.cheng at apple.com Thu Jun 15 03:12:07 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 03:12:07 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200606150812.DAA06193@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.256 -> 1.257 --- Log message: Consistency. EXTRACT_ELEMENT index operand should have ptr type. --- Diffs of the changes: (+13 -10) SelectionDAGISel.cpp | 23 +++++++++++++---------- 1 files changed, 13 insertions(+), 10 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.256 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.257 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.256 Mon Jun 12 13:25:29 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jun 15 03:11:54 2006 @@ -136,7 +136,8 @@ /// specified value into the registers specified by this object. This uses /// Chain/Flag as the input and updates them for the output Chain/Flag. void getCopyToRegs(SDOperand Val, SelectionDAG &DAG, - SDOperand &Chain, SDOperand &Flag) const; + SDOperand &Chain, SDOperand &Flag, + MVT::ValueType PtrVT) const; /// AddInlineAsmOperands - Add this value to the specified inlineasm node /// operand list. This adds the code marker and includes the number of @@ -1800,7 +1801,8 @@ /// specified value into the registers specified by this object. This uses /// Chain/Flag as the input and updates them for the output Chain/Flag. void RegsForValue::getCopyToRegs(SDOperand Val, SelectionDAG &DAG, - SDOperand &Chain, SDOperand &Flag) const { + SDOperand &Chain, SDOperand &Flag, + MVT::ValueType PtrVT) const { if (Regs.size() == 1) { // If there is a single register and the types differ, this must be // a promotion. @@ -1822,7 +1824,7 @@ for (unsigned i = 0, e = R.size(); i != e; ++i) { SDOperand Part = DAG.getNode(ISD::EXTRACT_ELEMENT, RegVT, Val, - DAG.getConstant(i, MVT::i32)); + DAG.getConstant(i, PtrVT)); Chain = DAG.getCopyToReg(Chain, R[i], Part, Flag); Flag = Chain.getValue(1); } @@ -2184,7 +2186,8 @@ } // Use the produced MatchedRegs object to - MatchedRegs.getCopyToRegs(InOperandVal, DAG, Chain, Flag); + MatchedRegs.getCopyToRegs(InOperandVal, DAG, Chain, Flag, + TLI.getPointerTy()); MatchedRegs.AddInlineAsmOperands(1 /*REGUSE*/, DAG, AsmNodeOperands); break; } @@ -2232,7 +2235,7 @@ // FIXME: should be match fail. assert(!InRegs.Regs.empty() && "Couldn't allocate input reg!"); - InRegs.getCopyToRegs(InOperandVal, DAG, Chain, Flag); + InRegs.getCopyToRegs(InOperandVal, DAG, Chain, Flag, TLI.getPointerTy()); InRegs.AddInlineAsmOperands(1/*REGUSE*/, DAG, AsmNodeOperands); break; @@ -3300,7 +3303,7 @@ SDOperand Root = SDL.getRoot(); for (unsigned i = 0; i != NE; ++i) { SDOperand Elt = DAG.getNode(ISD::VEXTRACT_VECTOR_ELT, PTyElementVT, - Op, DAG.getConstant(i, MVT::i32)); + Op, DAG.getConstant(i, TLI.getPointerTy())); if (PTyElementVT == PTyLegalElementVT) { // Elements are legal. OutChains.push_back(DAG.getCopyToReg(Root, Reg++, Elt)); @@ -3315,9 +3318,9 @@ // Elements are expanded. // The src value is expanded into multiple registers. SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, PTyLegalElementVT, - Elt, DAG.getConstant(0, MVT::i32)); + Elt, DAG.getConstant(0, TLI.getPointerTy())); SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, PTyLegalElementVT, - Elt, DAG.getConstant(1, MVT::i32)); + Elt, DAG.getConstant(1, TLI.getPointerTy())); OutChains.push_back(DAG.getCopyToReg(Root, Reg++, Lo)); OutChains.push_back(DAG.getCopyToReg(Root, Reg++, Hi)); } @@ -3333,9 +3336,9 @@ } else { // The src value is expanded into multiple registers. SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, DestVT, - Op, DAG.getConstant(0, MVT::i32)); + Op, DAG.getConstant(0, TLI.getPointerTy())); SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, DestVT, - Op, DAG.getConstant(1, MVT::i32)); + Op, DAG.getConstant(1, TLI.getPointerTy())); Op = DAG.getCopyToReg(SDL.getRoot(), Reg, Lo); return DAG.getCopyToReg(Op, Reg+1, Hi); } From evan.cheng at apple.com Thu Jun 15 03:15:07 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 03:15:07 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86InstrSSE.td Message-ID: <200606150815.DAA16846@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.229 -> 1.230 X86InstrSSE.td updated: 1.122 -> 1.123 --- Log message: Type of vector extract / insert index operand should be iPTR. --- Diffs of the changes: (+18 -18) X86ISelLowering.cpp | 10 +++++----- X86InstrSSE.td | 26 +++++++++++++------------- 2 files changed, 18 insertions(+), 18 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.229 llvm/lib/Target/X86/X86ISelLowering.cpp:1.230 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.229 Wed Jun 14 13:17:40 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Thu Jun 15 03:14:54 2006 @@ -2784,7 +2784,7 @@ Vec = DAG.getNode(ISD::VECTOR_SHUFFLE, Vec.getValueType(), Vec, Vec, Mask); return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, VT, Vec, - DAG.getConstant(0, MVT::i32)); + DAG.getConstant(0, getPointerTy())); } else if (MVT::getSizeInBits(VT) == 64) { SDOperand Vec = Op.getOperand(0); unsigned Idx = cast(Op.getOperand(1))->getValue(); @@ -2802,7 +2802,7 @@ Vec = DAG.getNode(ISD::VECTOR_SHUFFLE, Vec.getValueType(), Vec, DAG.getNode(ISD::UNDEF, Vec.getValueType()), Mask); return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, VT, Vec, - DAG.getConstant(0, MVT::i32)); + DAG.getConstant(0, getPointerTy())); } return SDOperand(); @@ -2848,15 +2848,15 @@ N1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, MVT::v4f32, N1); N1 = DAG.getNode(ISD::BIT_CONVERT, MVT::v4i32, N1); N1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, MVT::i32, N1, - DAG.getConstant(0, MVT::i32)); + DAG.getConstant(0, getPointerTy())); } } N0 = DAG.getNode(ISD::BIT_CONVERT, MVT::v8i16, N0); N0 = DAG.getNode(X86ISD::PINSRW, MVT::v8i16, N0, N1, - DAG.getConstant(Idx, MVT::i32)); + DAG.getConstant(Idx, getPointerTy())); N1 = DAG.getNode(ISD::SRL, MVT::i32, N1, DAG.getConstant(16, MVT::i8)); N0 = DAG.getNode(X86ISD::PINSRW, MVT::v8i16, N0, N1, - DAG.getConstant(Idx+1, MVT::i32)); + DAG.getConstant(Idx+1, getPointerTy())); return DAG.getNode(ISD::BIT_CONVERT, VT, N0); } } Index: llvm/lib/Target/X86/X86InstrSSE.td diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.122 llvm/lib/Target/X86/X86InstrSSE.td:1.123 --- llvm/lib/Target/X86/X86InstrSSE.td:1.122 Wed May 31 14:00:07 2006 +++ llvm/lib/Target/X86/X86InstrSSE.td Thu Jun 15 03:14:54 2006 @@ -811,11 +811,11 @@ def MOVLPSmr : PSI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src), "movlps {$src, $dst|$dst, $src}", [(store (f64 (vector_extract (bc_v2f64 (v4f32 VR128:$src)), - (i32 0))), addr:$dst)]>; + (iPTR 0))), addr:$dst)]>; def MOVLPDmr : PDI<0x13, MRMDestMem, (ops f64mem:$dst, VR128:$src), "movlpd {$src, $dst|$dst, $src}", [(store (f64 (vector_extract (v2f64 VR128:$src), - (i32 0))), addr:$dst)]>; + (iPTR 0))), addr:$dst)]>; // v2f64 extract element 1 is always custom lowered to unpack high to low // and extract element 0 so the non-store version isn't too horrible. @@ -824,13 +824,13 @@ [(store (f64 (vector_extract (v2f64 (vector_shuffle (bc_v2f64 (v4f32 VR128:$src)), (undef), - UNPCKH_shuffle_mask)), (i32 0))), + UNPCKH_shuffle_mask)), (iPTR 0))), addr:$dst)]>; def MOVHPDmr : PDI<0x17, MRMDestMem, (ops f64mem:$dst, VR128:$src), "movhpd {$src, $dst|$dst, $src}", [(store (f64 (vector_extract (v2f64 (vector_shuffle VR128:$src, (undef), - UNPCKH_shuffle_mask)), (i32 0))), + UNPCKH_shuffle_mask)), (iPTR 0))), addr:$dst)]>; let isTwoAddress = 1 in { @@ -2020,14 +2020,14 @@ (ops VR128:$dst, VR128:$src1, GR32:$src2, i32i8imm:$src3), "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}", [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1), - GR32:$src2, (i32 imm:$src3))))]>; + GR32:$src2, (iPTR imm:$src3))))]>; def PINSRWrmi : PDIi8<0xC4, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i16mem:$src2, i32i8imm:$src3), "pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}", [(set VR128:$dst, (v8i16 (X86pinsrw (v8i16 VR128:$src1), (i32 (anyext (loadi16 addr:$src2))), - (i32 imm:$src3))))]>; + (iPTR imm:$src3))))]>; } //===----------------------------------------------------------------------===// @@ -2166,32 +2166,32 @@ // FIXME: may not be able to eliminate this movss with coalescing the src and // dest register classes are different. We really want to write this pattern // like this: -// def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (i32 0))), +// def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (iPTR 0))), // (f32 FR32:$src)>; def MOVPS2SSrr : SSI<0x10, MRMSrcReg, (ops FR32:$dst, VR128:$src), "movss {$src, $dst|$dst, $src}", [(set FR32:$dst, (vector_extract (v4f32 VR128:$src), - (i32 0)))]>; + (iPTR 0)))]>; def MOVPS2SSmr : SSI<0x11, MRMDestMem, (ops f32mem:$dst, VR128:$src), "movss {$src, $dst|$dst, $src}", [(store (f32 (vector_extract (v4f32 VR128:$src), - (i32 0))), addr:$dst)]>; + (iPTR 0))), addr:$dst)]>; def MOVPD2SDrr : SDI<0x10, MRMSrcReg, (ops FR64:$dst, VR128:$src), "movsd {$src, $dst|$dst, $src}", [(set FR64:$dst, (vector_extract (v2f64 VR128:$src), - (i32 0)))]>; + (iPTR 0)))]>; def MOVPD2SDmr : SDI<0x11, MRMDestMem, (ops f64mem:$dst, VR128:$src), "movsd {$src, $dst|$dst, $src}", [(store (f64 (vector_extract (v2f64 VR128:$src), - (i32 0))), addr:$dst)]>; + (iPTR 0))), addr:$dst)]>; def MOVPDI2DIrr : PDI<0x7E, MRMDestReg, (ops GR32:$dst, VR128:$src), "movd {$src, $dst|$dst, $src}", [(set GR32:$dst, (vector_extract (v4i32 VR128:$src), - (i32 0)))]>; + (iPTR 0)))]>; def MOVPDI2DImr : PDI<0x7E, MRMDestMem, (ops i32mem:$dst, VR128:$src), "movd {$src, $dst|$dst, $src}", [(store (i32 (vector_extract (v4i32 VR128:$src), - (i32 0))), addr:$dst)]>; + (iPTR 0))), addr:$dst)]>; // Move to lower bits of a VR128, leaving upper bits alone. // Three operand (but two address) aliases. From evan.cheng at apple.com Thu Jun 15 03:17:19 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 03:17:19 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp Message-ID: <200606150817.DAA30913@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.cpp updated: 1.187 -> 1.188 --- Log message: Type of extract_element index operand should be iPTR. --- Diffs of the changes: (+15 -12) PPCISelLowering.cpp | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.187 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.188 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.187 Fri Jun 9 20:14:28 2006 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Thu Jun 15 03:17:07 2006 @@ -1334,7 +1334,8 @@ return FP; } -static SDOperand LowerSHL(SDOperand Op, SelectionDAG &DAG) { +static SDOperand LowerSHL(SDOperand Op, SelectionDAG &DAG, + MVT::ValueType PtrVT) { assert(Op.getValueType() == MVT::i64 && Op.getOperand(1).getValueType() == MVT::i32 && "Unexpected SHL!"); // The generic code does a fine job expanding shift by a constant. @@ -1343,9 +1344,9 @@ // Otherwise, expand into a bunch of logical ops. Note that these ops // depend on the PPC behavior for oversized shift amounts. SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op.getOperand(0), - DAG.getConstant(0, MVT::i32)); + DAG.getConstant(0, PtrVT)); SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op.getOperand(0), - DAG.getConstant(1, MVT::i32)); + DAG.getConstant(1, PtrVT)); SDOperand Amt = Op.getOperand(1); SDOperand Tmp1 = DAG.getNode(ISD::SUB, MVT::i32, @@ -1361,7 +1362,8 @@ return DAG.getNode(ISD::BUILD_PAIR, MVT::i64, OutLo, OutHi); } -static SDOperand LowerSRL(SDOperand Op, SelectionDAG &DAG) { +static SDOperand LowerSRL(SDOperand Op, SelectionDAG &DAG, + MVT::ValueType PtrVT) { assert(Op.getValueType() == MVT::i64 && Op.getOperand(1).getValueType() == MVT::i32 && "Unexpected SHL!"); // The generic code does a fine job expanding shift by a constant. @@ -1370,9 +1372,9 @@ // Otherwise, expand into a bunch of logical ops. Note that these ops // depend on the PPC behavior for oversized shift amounts. SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op.getOperand(0), - DAG.getConstant(0, MVT::i32)); + DAG.getConstant(0, PtrVT)); SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op.getOperand(0), - DAG.getConstant(1, MVT::i32)); + DAG.getConstant(1, PtrVT)); SDOperand Amt = Op.getOperand(1); SDOperand Tmp1 = DAG.getNode(ISD::SUB, MVT::i32, @@ -1388,7 +1390,8 @@ return DAG.getNode(ISD::BUILD_PAIR, MVT::i64, OutLo, OutHi); } -static SDOperand LowerSRA(SDOperand Op, SelectionDAG &DAG) { +static SDOperand LowerSRA(SDOperand Op, SelectionDAG &DAG, + MVT::ValueType PtrVT) { assert(Op.getValueType() == MVT::i64 && Op.getOperand(1).getValueType() == MVT::i32 && "Unexpected SRA!"); // The generic code does a fine job expanding shift by a constant. @@ -1396,9 +1399,9 @@ // Otherwise, expand into a bunch of logical ops, followed by a select_cc. SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op.getOperand(0), - DAG.getConstant(0, MVT::i32)); + DAG.getConstant(0, PtrVT)); SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op.getOperand(0), - DAG.getConstant(1, MVT::i32)); + DAG.getConstant(1, PtrVT)); SDOperand Amt = Op.getOperand(1); SDOperand Tmp1 = DAG.getNode(ISD::SUB, MVT::i32, @@ -2132,9 +2135,9 @@ case ISD::SINT_TO_FP: return LowerSINT_TO_FP(Op, DAG); // Lower 64-bit shifts. - case ISD::SHL: return LowerSHL(Op, DAG); - case ISD::SRL: return LowerSRL(Op, DAG); - case ISD::SRA: return LowerSRA(Op, DAG); + case ISD::SHL: return LowerSHL(Op, DAG, getPointerTy()); + case ISD::SRL: return LowerSRL(Op, DAG, getPointerTy()); + case ISD::SRA: return LowerSRA(Op, DAG, getPointerTy()); // Vector-related lowering. case ISD::BUILD_VECTOR: return LowerBUILD_VECTOR(Op, DAG); From evan.cheng at apple.com Thu Jun 15 03:18:19 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 03:18:19 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp Message-ID: <200606150818.DAA31768@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Sparc: SparcISelDAGToDAG.cpp updated: 1.98 -> 1.99 --- Log message: Type of extract_element index operand should be iPTR. --- Diffs of the changes: (+2 -2) SparcISelDAGToDAG.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp diff -u llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp:1.98 llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp:1.99 --- llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp:1.98 Fri May 26 18:10:12 2006 +++ llvm/lib/Target/Sparc/SparcISelDAGToDAG.cpp Thu Jun 15 03:18:06 2006 @@ -564,9 +564,9 @@ } // Split the value into top and bottom part. Top part goes in a reg. - SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Val, + SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, getPointerTy(), Val, DAG.getConstant(1, MVT::i32)); - SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Val, + SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, getPointerTy(), Val, DAG.getConstant(0, MVT::i32)); RegValuesToPass.push_back(Hi); From evan.cheng at apple.com Thu Jun 15 03:19:17 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 03:19:17 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetSelectionDAG.td Message-ID: <200606150819.DAA04254@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetSelectionDAG.td updated: 1.67 -> 1.68 --- Log message: Vector extract / insert index operand should have ptr type. --- Diffs of the changes: (+2 -2) TargetSelectionDAG.td | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/TargetSelectionDAG.td diff -u llvm/lib/Target/TargetSelectionDAG.td:1.67 llvm/lib/Target/TargetSelectionDAG.td:1.68 --- llvm/lib/Target/TargetSelectionDAG.td:1.67 Sat Apr 22 13:53:45 2006 +++ llvm/lib/Target/TargetSelectionDAG.td Thu Jun 15 03:19:05 2006 @@ -320,9 +320,9 @@ def scalar_to_vector : SDNode<"ISD::SCALAR_TO_VECTOR", SDTypeProfile<1, 1, []>, []>; def vector_extract : SDNode<"ISD::EXTRACT_VECTOR_ELT", - SDTypeProfile<1, 2, []>, []>; + SDTypeProfile<1, 2, [SDTCisPtrTy<2>]>, []>; def vector_insert : SDNode<"ISD::INSERT_VECTOR_ELT", - SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>]>, []>; + SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisPtrTy<3>]>, []>; // Nodes for intrinsics, you should use the intrinsic itself and let tblgen use // these internally. Don't reference these directly. From jlaskey at apple.com Thu Jun 15 08:11:25 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 08:11:25 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp Message-ID: <200606151311.IAA19882@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: AsmPrinter.cpp updated: 1.80 -> 1.81 --- Log message: Alignment of globals has not been quite right. Needed to drop the pointer type to get the alignment of the element type. --- Diffs of the changes: (+3 -5) AsmPrinter.cpp | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.80 llvm/lib/CodeGen/AsmPrinter.cpp:1.81 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.80 Thu Jun 15 03:10:56 2006 +++ llvm/lib/CodeGen/AsmPrinter.cpp Thu Jun 15 08:10:58 2006 @@ -244,18 +244,16 @@ /// specified global, returned in log form. This includes an explicitly /// requested alignment (if the global has one). unsigned AsmPrinter::getPreferredAlignmentLog(const GlobalVariable *GV) const { - unsigned Alignment = TM.getTargetData()->getTypeAlignmentShift(GV->getType()); + const Type *ElemType = GV->getType()->getElementType(); + unsigned Alignment = TM.getTargetData()->getTypeAlignmentShift(ElemType); if (GV->getAlignment() > (1U << Alignment)) Alignment = Log2_32(GV->getAlignment()); if (GV->hasInitializer()) { - // Always round up alignment of global doubles to 8 bytes. - if (GV->getType()->getElementType() == Type::DoubleTy && Alignment < 3) - Alignment = 3; if (Alignment < 4) { // If the global is not external, see if it is large. If so, give it a // larger alignment. - if (TM.getTargetData()->getTypeSize(GV->getType()->getElementType()) > 128) + if (TM.getTargetData()->getTypeSize(ElemType) > 128) Alignment = 4; // 16-byte alignment. } } From reid at x10sys.com Thu Jun 15 11:10:24 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 15 Jun 2006 11:10:24 -0500 Subject: [llvm-commits] CVS: llvm/tools/llvm2cpp/CppWriter.cpp Message-ID: <200606151610.LAA22063@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm2cpp: CppWriter.cpp updated: 1.12 -> 1.13 --- Log message: Actually add instructions to the list of defined values so it gets recognized as such! This prevents the CppWriter from treating every operand as a forward reference and making a mess of the output. --- Diffs of the changes: (+1 -0) CppWriter.cpp | 1 + 1 files changed, 1 insertion(+) Index: llvm/tools/llvm2cpp/CppWriter.cpp diff -u llvm/tools/llvm2cpp/CppWriter.cpp:1.12 llvm/tools/llvm2cpp/CppWriter.cpp:1.13 --- llvm/tools/llvm2cpp/CppWriter.cpp:1.12 Thu Jun 1 18:43:47 2006 +++ llvm/tools/llvm2cpp/CppWriter.cpp Thu Jun 15 11:09:59 2006 @@ -1193,6 +1193,7 @@ break; } } + DefinedValues.insert(I); Out << "\n"; delete [] opNames; } From lattner at cs.uiuc.edu Thu Jun 15 12:31:34 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 12:31:34 -0500 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200606151731.MAA22379@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.378 -> 1.379 --- Log message: Fix building on case-sensitive file systems, grr :) --- Diffs of the changes: (+2 -2) Makefile.rules | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.378 llvm/Makefile.rules:1.379 --- llvm/Makefile.rules:1.378 Thu Jun 1 19:27:42 2006 +++ llvm/Makefile.rules Thu Jun 15 12:31:22 2006 @@ -373,10 +373,10 @@ # apps. ifdef UNIVERSAL CompileCommonOpts += \ - -arch i386 -arch ppc -isysroot /Developer/SDKs/MACOSX10.4u.sdk/ + -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk/ Relink.Flags := -XCClinker -arch -XCClinker i386 -XCClinker -arch \ -XCClinker ppc -XCClinker \ - -isysroot -XCClinker /Developer/SDKs/MACOSX10.4u.sdk/ + -isysroot -XCClinker /Developer/SDKs/MacOSX10.4u.sdk/ DISABLE_AUTO_DEPENDENCIES=1 endif From lattner at cs.uiuc.edu Thu Jun 15 14:06:55 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 14:06:55 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/InstCombine/bswap.ll Message-ID: <200606151906.OAA23075@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/InstCombine: bswap.ll added (r1.1) --- Log message: new testcase, instcombine should turn these into llvm.bswap intrinsics. --- Diffs of the changes: (+28 -0) bswap.ll | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+) Index: llvm/test/Regression/Transforms/InstCombine/bswap.ll diff -c /dev/null llvm/test/Regression/Transforms/InstCombine/bswap.ll:1.1 *** /dev/null Thu Jun 15 14:06:52 2006 --- llvm/test/Regression/Transforms/InstCombine/bswap.ll Thu Jun 15 14:06:42 2006 *************** *** 0 **** --- 1,28 ---- + ; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep 'call.*llvm.bswap' | wc -l | grep 2 + + uint %test1(uint %i) { + %tmp1 = shr uint %i, ubyte 24 ; [#uses=1] + %tmp3 = shr uint %i, ubyte 8 ; [#uses=1] + %tmp4 = and uint %tmp3, 65280 ; [#uses=1] + %tmp5 = or uint %tmp1, %tmp4 ; [#uses=1] + %tmp7 = shl uint %i, ubyte 8 ; [#uses=1] + %tmp8 = and uint %tmp7, 16711680 ; [#uses=1] + %tmp9 = or uint %tmp5, %tmp8 ; [#uses=1] + %tmp11 = shl uint %i, ubyte 24 ; [#uses=1] + %tmp12 = or uint %tmp9, %tmp11 ; [#uses=1] + ret uint %tmp12 + } + + uint %test2(uint %arg) { + %tmp2 = shl uint %arg, ubyte 24 ; [#uses=1] + %tmp4 = shl uint %arg, ubyte 8 ; [#uses=1] + %tmp5 = and uint %tmp4, 16711680 ; [#uses=1] + %tmp6 = or uint %tmp2, %tmp5 ; [#uses=1] + %tmp8 = shr uint %arg, ubyte 8 ; [#uses=1] + %tmp9 = and uint %tmp8, 65280 ; [#uses=1] + %tmp10 = or uint %tmp6, %tmp9 ; [#uses=1] + %tmp12 = shr uint %arg, ubyte 24 ; [#uses=1] + %tmp14 = or uint %tmp10, %tmp12 ; [#uses=1] + ret uint %tmp14 + } + From lattner at cs.uiuc.edu Thu Jun 15 14:07:39 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 14:07:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200606151907.OAA23108@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.490 -> 1.491 --- Log message: Implement Transforms/InstCombine/bswap.ll, turning common shift/and/or bswap idioms into bswap intrinsics. --- Diffs of the changes: (+131 -1) InstructionCombining.cpp | 132 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 131 insertions(+), 1 deletion(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.490 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.491 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.490 Tue Jun 6 17:26:02 2006 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Thu Jun 15 14:07:26 2006 @@ -256,7 +256,8 @@ Instruction *InsertRangeTest(Value *V, Constant *Lo, Constant *Hi, bool Inside, Instruction &IB); Instruction *PromoteCastOfAllocation(CastInst &CI, AllocationInst &AI); - + Instruction *MatchBSwap(BinaryOperator &I); + Value *EvaluateInDifferentType(Value *V, const Type *Ty); }; @@ -2791,6 +2792,128 @@ return Changed ? &I : 0; } +/// CollectBSwapParts - Look to see if the specified value defines a single byte +/// in the result. If it does, and if the specified byte hasn't been filled in +/// yet, fill it in and return false. +static bool CollectBSwapParts(Value *V, std::vector &ByteValues) { + Instruction *I = dyn_cast(V); + if (I == 0) return true; + + // If this is an or instruction, it is an inner node of the bswap. + if (I->getOpcode() == Instruction::Or) + return CollectBSwapParts(I->getOperand(0), ByteValues) || + CollectBSwapParts(I->getOperand(1), ByteValues); + + // If this is a shift by a constant int, and it is "24", then its operand + // defines a byte. We only handle unsigned types here. + if (isa(I) && isa(I->getOperand(1))) { + // Not shifting the entire input by N-1 bytes? + if (cast(I->getOperand(1))->getRawValue() != + 8*(ByteValues.size()-1)) + return true; + + unsigned DestNo; + if (I->getOpcode() == Instruction::Shl) { + // X << 24 defines the top byte with the lowest of the input bytes. + DestNo = ByteValues.size()-1; + } else { + // X >>u 24 defines the low byte with the highest of the input bytes. + DestNo = 0; + } + + // If the destination byte value is already defined, the values are or'd + // together, which isn't a bswap (unless it's an or of the same bits). + if (ByteValues[DestNo] && ByteValues[DestNo] != I->getOperand(0)) + return true; + ByteValues[DestNo] = I->getOperand(0); + return false; + } + + // Otherwise, we can only handle and(shift X, imm), imm). Bail out of if we + // don't have this. + Value *Shift = 0, *ShiftLHS = 0; + ConstantInt *AndAmt = 0, *ShiftAmt = 0; + if (!match(I, m_And(m_Value(Shift), m_ConstantInt(AndAmt))) || + !match(Shift, m_Shift(m_Value(ShiftLHS), m_ConstantInt(ShiftAmt)))) + return true; + Instruction *SI = cast(Shift); + + // Make sure that the shift amount is by a multiple of 8 and isn't too big. + if (ShiftAmt->getRawValue() & 7 || + ShiftAmt->getRawValue() > 8*ByteValues.size()) + return true; + + // Turn 0xFF -> 0, 0xFF00 -> 1, 0xFF0000 -> 2, etc. + unsigned DestByte; + for (DestByte = 0; DestByte != ByteValues.size(); ++DestByte) + if (AndAmt->getRawValue() == uint64_t(0xFF) << 8*DestByte) + break; + // Unknown mask for bswap. + if (DestByte == ByteValues.size()) return true; + + unsigned ShiftBytes = ShiftAmt->getRawValue()/8; + unsigned SrcByte; + if (SI->getOpcode() == Instruction::Shl) + SrcByte = DestByte - ShiftBytes; + else + SrcByte = DestByte + ShiftBytes; + + // If the SrcByte isn't a bswapped value from the DestByte, reject it. + if (SrcByte != ByteValues.size()-DestByte-1) + return true; + + // If the destination byte value is already defined, the values are or'd + // together, which isn't a bswap (unless it's an or of the same bits). + if (ByteValues[DestByte] && ByteValues[DestByte] != SI->getOperand(0)) + return true; + ByteValues[DestByte] = SI->getOperand(0); + return false; +} + +/// MatchBSwap - Given an OR instruction, check to see if this is a bswap idiom. +/// If so, insert the new bswap intrinsic and return it. +Instruction *InstCombiner::MatchBSwap(BinaryOperator &I) { + // We can only handle bswap of unsigned integers, and cannot bswap one byte. + if (!I.getType()->isUnsigned() || I.getType() == Type::UByteTy) + return 0; + + /// ByteValues - For each byte of the result, we keep track of which value + /// defines each byte. + std::vector ByteValues; + ByteValues.resize(I.getType()->getPrimitiveSize()); + + // Try to find all the pieces corresponding to the bswap. + if (CollectBSwapParts(I.getOperand(0), ByteValues) || + CollectBSwapParts(I.getOperand(1), ByteValues)) + return 0; + + // Check to see if all of the bytes come from the same value. + Value *V = ByteValues[0]; + if (V == 0) return 0; // Didn't find a byte? Must be zero. + + // Check to make sure that all of the bytes come from the same value. + for (unsigned i = 1, e = ByteValues.size(); i != e; ++i) + if (ByteValues[i] != V) + return 0; + + // If they do then *success* we can turn this into a bswap. Figure out what + // bswap to make it into. + Module *M = I.getParent()->getParent()->getParent(); + const char *FnName; + if (I.getType() == Type::UShortTy) + FnName = "llvm.bswap.i16"; + else if (I.getType() == Type::UIntTy) + FnName = "llvm.bswap.i32"; + else if (I.getType() == Type::ULongTy) + FnName = "llvm.bswap.i64"; + else + assert(0 && "Unknown integer type!"); + Function *F = M->getOrInsertFunction(FnName, I.getType(), I.getType(), NULL); + + return new CallInst(F, V); +} + + Instruction *InstCombiner::visitOr(BinaryOperator &I) { bool Changed = SimplifyCommutative(I); Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1); @@ -2850,6 +2973,13 @@ if (A == Op0 || B == Op0) // A | (A & ?) --> A return ReplaceInstUsesWith(I, Op0); + // (A | B) | C and A | (B | C) -> bswap if possible. + if (match(Op0, m_Or(m_Value(), m_Value())) || + match(Op1, m_Or(m_Value(), m_Value()))) { + if (Instruction *BSwap = MatchBSwap(I)) + return BSwap; + } + // (X^C)|Y -> (X|Y)^C iff Y&C == 0 if (Op0->hasOneUse() && match(Op0, m_Xor(m_Value(A), m_ConstantInt(C1))) && MaskedValueIsZero(Op1, C1->getZExtValue())) { From lattner at cs.uiuc.edu Thu Jun 15 14:25:40 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 14:25:40 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/PatternMatch.h Message-ID: <200606151925.OAA23237@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: PatternMatch.h updated: 1.7 -> 1.8 --- Log message: Add some more matcher classes for shifts. --- Diffs of the changes: (+21 -6) PatternMatch.h | 27 +++++++++++++++++++++------ 1 files changed, 21 insertions(+), 6 deletions(-) Index: llvm/include/llvm/Support/PatternMatch.h diff -u llvm/include/llvm/Support/PatternMatch.h:1.7 llvm/include/llvm/Support/PatternMatch.h:1.8 --- llvm/include/llvm/Support/PatternMatch.h:1.7 Mon Feb 13 17:06:39 2006 +++ llvm/include/llvm/Support/PatternMatch.h Thu Jun 15 14:25:28 2006 @@ -68,7 +68,7 @@ inline bind_ty m_ConstantInt(ConstantInt *&CI) { return CI; } //===----------------------------------------------------------------------===// -// Matchers for specific binary operators +// Matchers for specific binary operators. // template +template struct BinaryOpClass_match { - Instruction::BinaryOps &Opcode; + OpcType &Opcode; LHS_t L; RHS_t R; - BinaryOpClass_match(Instruction::BinaryOps &Op, const LHS_t &LHS, + BinaryOpClass_match(OpcType &Op, const LHS_t &LHS, const RHS_t &RHS) : Opcode(Op), L(LHS), R(RHS) {} @@ -184,11 +184,26 @@ }; template -inline BinaryOpClass_match +inline BinaryOpClass_match m_SetCond(Instruction::BinaryOps &Op, const LHS &L, const RHS &R) { - return BinaryOpClass_match(Op, L, R); + return BinaryOpClass_match(Op, L, R); } +template +inline BinaryOpClass_match +m_Shift(Instruction::OtherOps &Op, const LHS &L, const RHS &R) { + return BinaryOpClass_match(Op, L, R); +} + +template +inline BinaryOpClass_match +m_Shift(const LHS &L, const RHS &R) { + Instruction::OtherOps Op; + return BinaryOpClass_match(Op, L, R); +} //===----------------------------------------------------------------------===// // Matchers for unary operators From jlaskey at apple.com Thu Jun 15 14:35:19 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 14:35:19 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/align.ll Message-ID: <200606151935.OAA23301@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: align.ll added (r1.1) --- Log message: Make sure global doubles and vectors are aligned properly. --- Diffs of the changes: (+9 -0) align.ll | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/test/Regression/CodeGen/PowerPC/align.ll diff -c /dev/null llvm/test/Regression/CodeGen/PowerPC/align.ll:1.1 *** /dev/null Thu Jun 15 14:35:17 2006 --- llvm/test/Regression/CodeGen/PowerPC/align.ll Thu Jun 15 14:35:07 2006 *************** *** 0 **** --- 1,9 ---- + ; RUN: llvm-as < %s | llc -march=ppc32 | grep "align.4" | wc -l | grep 1 && + ; RUN: llvm-as < %s | llc -march=ppc32 | grep "align.2" | wc -l | grep 1 && + ; RUN: llvm-as < %s | llc -march=ppc32 | grep "align.3" | wc -l | grep 1 + + + %A = global <4 x uint> < uint 10, uint 20, uint 30, uint 40 > + %B = global float 1.000000e+02 + %C = global double 2.000000e+03 + From jlaskey at apple.com Thu Jun 15 14:37:26 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 14:37:26 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp Message-ID: <200606151937.OAA23335@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: AsmPrinter.cpp updated: 1.81 -> 1.82 --- Log message: Was pointed out that structure alignment and type alignment are not the same thing. Doubles still need to be special cased. --- Diffs of the changes: (+3 -0) AsmPrinter.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/CodeGen/AsmPrinter.cpp diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.81 llvm/lib/CodeGen/AsmPrinter.cpp:1.82 --- llvm/lib/CodeGen/AsmPrinter.cpp:1.81 Thu Jun 15 08:10:58 2006 +++ llvm/lib/CodeGen/AsmPrinter.cpp Thu Jun 15 14:37:14 2006 @@ -250,6 +250,9 @@ Alignment = Log2_32(GV->getAlignment()); if (GV->hasInitializer()) { + // Always round up alignment of global doubles to 8 bytes. + if (GV->getType()->getElementType() == Type::DoubleTy && Alignment < 3) + Alignment = 3; if (Alignment < 4) { // If the global is not external, see if it is large. If so, give it a // larger alignment. From jlaskey at apple.com Thu Jun 15 15:51:59 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 15:51:59 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/Dwarf.h Message-ID: <200606152051.PAA24151@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: Dwarf.h updated: 1.6 -> 1.7 --- Log message: 1. Support standard dwarf format (was bootstrapping in Apple format.) 2. Add vector support. --- Diffs of the changes: (+10 -3) Dwarf.h | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) Index: llvm/include/llvm/Support/Dwarf.h diff -u llvm/include/llvm/Support/Dwarf.h:1.6 llvm/include/llvm/Support/Dwarf.h:1.7 --- llvm/include/llvm/Support/Dwarf.h:1.6 Thu Mar 23 12:07:55 2006 +++ llvm/include/llvm/Support/Dwarf.h Thu Jun 15 15:51:43 2006 @@ -37,10 +37,10 @@ DW_TAG_arg_variable = 0x101, // Tag for argument variables. DW_TAG_return_variable = 0x102, // Tag for return variables. - DW_TAG_user_base = 0x1000, // Recommended base for user tags. + DW_TAG_user_base = 0x1000, // Recommended base for user tags. - DW_CIE_VERSION = 1, // Common frame information version. - DW_CIE_ID = 0xffffffff // Common frame information mark. + DW_CIE_VERSION = 1, // Common frame information version. + DW_CIE_ID = 0xffffffff // Common frame information mark. }; enum dwarf_constants { @@ -198,6 +198,13 @@ DW_AT_elemental = 0x66, DW_AT_pure = 0x67, DW_AT_recursive = 0x68, + DW_AT_sf_names = 0x2101, + DW_AT_src_info = 0x2102, + DW_AT_mac_info = 0x2103, + DW_AT_src_coords = 0x2104, + DW_AT_body_begin = 0x2105, + DW_AT_body_end = 0x2106, + DW_AT_GNU_vector = 0x2107, DW_AT_lo_user = 0x2000, DW_AT_hi_user = 0x3fff, From jlaskey at apple.com Thu Jun 15 15:51:59 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 15:51:59 -0500 Subject: [llvm-commits] CVS: llvm/docs/SourceLevelDebugging.html Message-ID: <200606152051.PAA24155@zion.cs.uiuc.edu> Changes in directory llvm/docs: SourceLevelDebugging.html updated: 1.18 -> 1.19 --- Log message: 1. Support standard dwarf format (was bootstrapping in Apple format.) 2. Add vector support. --- Diffs of the changes: (+7 -2) SourceLevelDebugging.html | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/docs/SourceLevelDebugging.html diff -u llvm/docs/SourceLevelDebugging.html:1.18 llvm/docs/SourceLevelDebugging.html:1.19 --- llvm/docs/SourceLevelDebugging.html:1.18 Fri Mar 24 03:20:27 2006 +++ llvm/docs/SourceLevelDebugging.html Thu Jun 15 15:51:43 2006 @@ -575,6 +575,7 @@ uint, ;; Size in bits uint, ;; Alignment in bits uint, ;; Offset in bits + bool, ;; Is vector flag { }* ;; Reference to array of member descriptors } @@ -590,6 +591,8 @@ DW_TAG_union_type = 23 +

    The vector flag indicates that an array type is a native packed vector.

    +

    The members of array types (tag = DW_TAG_array_type) are subrange descriptors, each representing the range of subscripts at that level of indexing.

    @@ -1600,7 +1603,8 @@ uint 96, uint 32, uint 0, - { }* null, + { }* null, + bool false, { }* cast ([3 x { }*]* %llvm.dbg.array to { }*) }, section "llvm.metadata" %str2 = internal constant [6 x sbyte] c"Color\00", section "llvm.metadata" @@ -1693,6 +1697,7 @@ uint 32, uint 0, { }* null, + bool false, { }* cast ([3 x { }*]* %llvm.dbg.array to { }*) }, section "llvm.metadata" %str1 = internal constant [6 x sbyte] c"Trees\00", section "llvm.metadata" @@ -1745,7 +1750,7 @@ Chris Lattner
    LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/03/24 09:20:27 $ + Last modified: $Date: 2006/06/15 20:51:43 $ From jlaskey at apple.com Thu Jun 15 15:51:58 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 15:51:58 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/MachineDebugInfo.h Message-ID: <200606152051.PAA24147@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: MachineDebugInfo.h updated: 1.34 -> 1.35 --- Log message: 1. Support standard dwarf format (was bootstrapping in Apple format.) 2. Add vector support. --- Diffs of the changes: (+4 -1) MachineDebugInfo.h | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/MachineDebugInfo.h diff -u llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.34 llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.35 --- llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.34 Wed Jun 14 09:45:39 2006 +++ llvm/include/llvm/CodeGen/MachineDebugInfo.h Thu Jun 15 15:51:43 2006 @@ -57,7 +57,7 @@ // Debug info constants. enum { - LLVMDebugVersion = 3 // Current version of debug information. + LLVMDebugVersion = 4 // Current version of debug information. }; //===----------------------------------------------------------------------===// @@ -400,13 +400,16 @@ /// array/struct types (eg., arrays, struct, union, enums.) class CompositeTypeDesc : public DerivedTypeDesc { private: + bool IsVector; // packed/vector array std::vector Elements;// Information used to compose type. public: CompositeTypeDesc(unsigned T); // Accessors + bool isVector() const { return IsVector; } std::vector &getElements() { return Elements; } + void setIsVector() { IsVector = true; } // Implement isa/cast/dyncast. static bool classof(const CompositeTypeDesc *) { return true; } From jlaskey at apple.com Thu Jun 15 15:52:00 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 15:52:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/Support/Dwarf.cpp Message-ID: <200606152052.PAA24169@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: Dwarf.cpp updated: 1.2 -> 1.3 --- Log message: 1. Support standard dwarf format (was bootstrapping in Apple format.) 2. Add vector support. --- Diffs of the changes: (+7 -0) Dwarf.cpp | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/lib/Support/Dwarf.cpp diff -u llvm/lib/Support/Dwarf.cpp:1.2 llvm/lib/Support/Dwarf.cpp:1.3 --- llvm/lib/Support/Dwarf.cpp:1.2 Mon Feb 27 16:37:23 2006 +++ llvm/lib/Support/Dwarf.cpp Thu Jun 15 15:51:43 2006 @@ -188,6 +188,13 @@ case DW_AT_elemental: return "AT_elemental"; case DW_AT_pure: return "AT_pure"; case DW_AT_recursive: return "AT_recursive"; + case DW_AT_sf_names: return "AT_sf_names"; + case DW_AT_src_info: return "AT_src_info"; + case DW_AT_mac_info: return "AT_mac_info"; + case DW_AT_src_coords: return "AT_src_coords"; + case DW_AT_body_begin: return "AT_body_begin"; + case DW_AT_body_end: return "AT_body_end"; + case DW_AT_GNU_vector: return "AT_GNU_vector"; case DW_AT_lo_user: return "AT_lo_user"; case DW_AT_hi_user: return "AT_hi_user"; } From jlaskey at apple.com Thu Jun 15 15:51:59 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 15:51:59 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineDebugInfo.cpp Message-ID: <200606152051.PAA24165@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.61 -> 1.62 MachineDebugInfo.cpp updated: 1.40 -> 1.41 --- Log message: 1. Support standard dwarf format (was bootstrapping in Apple format.) 2. Add vector support. --- Diffs of the changes: (+14 -4) DwarfWriter.cpp | 16 ++++++++++++---- MachineDebugInfo.cpp | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.61 llvm/lib/CodeGen/DwarfWriter.cpp:1.62 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.61 Wed Jun 14 06:35:03 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Thu Jun 15 15:51:43 2006 @@ -1265,7 +1265,7 @@ // Fundamental types like int, float, bool Slot = Ty = new DIE(DW_TAG_base_type); unsigned Encoding = BasicTy->getEncoding(); - Ty->AddUInt (DW_AT_encoding, DW_FORM_data1, Encoding); + Ty->AddUInt(DW_AT_encoding, DW_FORM_data1, Encoding); } else if (DerivedTypeDesc *DerivedTy = dyn_cast(TyDesc)) { // Create specific DIE. Slot = Ty = new DIE(DerivedTy->getTag()); @@ -1287,6 +1287,12 @@ Ty->AddDIEntry(DW_AT_type, DW_FORM_ref4, NewType(Context, FromTy, Unit)); } + + // check for vector type + if (CompTy->isVector()) { + Ty->AddUInt(DW_AT_GNU_vector, DW_FORM_flag, 1); + } + // Don't emit size attribute. Size = 0; @@ -1419,7 +1425,8 @@ unsigned ID) { // Construct debug information entry. DIE *Die = new DIE(DW_TAG_compile_unit); - Die->AddLabel (DW_AT_stmt_list, DW_FORM_data4, DWLabel("line", 0)); + Die->AddDelta (DW_AT_stmt_list, DW_FORM_data4, DWLabel("line", 0), + DWLabel("section_line", 0)); Die->AddLabel (DW_AT_high_pc, DW_FORM_addr, DWLabel("text_end", 0)); Die->AddLabel (DW_AT_low_pc, DW_FORM_addr, DWLabel("text_begin", 0)); Die->AddString(DW_AT_producer, DW_FORM_string, UnitDesc->getProducer()); @@ -1842,7 +1849,7 @@ int stackGrowth = Asm->TM.getFrameInfo()->getStackGrowthDirection() == TargetFrameInfo::StackGrowsUp ? - AddressSize : -AddressSize; + AddressSize : -AddressSize; EmitULEB128Bytes(Src.getOffset() / stackGrowth); EOL("Offset"); @@ -1875,7 +1882,8 @@ EmitInt32(ContentSize); EOL("Length of Compilation Unit Info"); EmitInt16(DWARF_VERSION); EOL("DWARF version number"); - EmitReference("abbrev_begin", 0); EOL("Offset Into Abbrev. Section"); + EmitDifference("abbrev_begin", 0, "section_abbrev", 0); + EOL("Offset Into Abbrev. Section"); EmitInt8(AddressSize); EOL("Address Size (in bytes)"); EmitDIE(Die); Index: llvm/lib/CodeGen/MachineDebugInfo.cpp diff -u llvm/lib/CodeGen/MachineDebugInfo.cpp:1.40 llvm/lib/CodeGen/MachineDebugInfo.cpp:1.41 --- llvm/lib/CodeGen/MachineDebugInfo.cpp:1.40 Wed Jun 14 09:45:39 2006 +++ llvm/lib/CodeGen/MachineDebugInfo.cpp Thu Jun 15 15:51:43 2006 @@ -817,6 +817,7 @@ CompositeTypeDesc::CompositeTypeDesc(unsigned T) : DerivedTypeDesc(T) +, IsVector(false) , Elements() {} @@ -839,6 +840,7 @@ void CompositeTypeDesc::ApplyToFields(DIVisitor *Visitor) { DerivedTypeDesc::ApplyToFields(Visitor); + Visitor->Apply(IsVector); Visitor->Apply(Elements); } From jlaskey at apple.com Thu Jun 15 15:51:59 2006 From: jlaskey at apple.com (Jim Laskey) Date: Thu, 15 Jun 2006 15:51:59 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200606152051.PAA24159@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.177 -> 1.178 --- Log message: 1. Support standard dwarf format (was bootstrapping in Apple format.) 2. Add vector support. --- Diffs of the changes: (+11 -11) PPCAsmPrinter.cpp | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.177 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.178 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.177 Wed Jun 14 06:35:03 2006 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Thu Jun 15 15:51:43 2006 @@ -246,17 +246,17 @@ : DwarfWriter(o, ap) { needsSet = true; - DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev"; - DwarfInfoSection = ".section __DWARFA,__debug_info"; - DwarfLineSection = ".section __DWARFA,__debug_line"; - DwarfFrameSection = ".section __DWARFA,__debug_frame"; - DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames"; - DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes"; - DwarfStrSection = ".section __DWARFA,__debug_str"; - DwarfLocSection = ".section __DWARFA,__debug_loc"; - DwarfARangesSection = ".section __DWARFA,__debug_aranges"; - DwarfRangesSection = ".section __DWARFA,__debug_ranges"; - DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo"; + DwarfAbbrevSection = ".section __DWARF,__debug_abbrev"; + DwarfInfoSection = ".section __DWARF,__debug_info"; + DwarfLineSection = ".section __DWARF,__debug_line"; + DwarfFrameSection = ".section __DWARF,__debug_frame"; + DwarfPubNamesSection = ".section __DWARF,__debug_pubnames"; + DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes"; + DwarfStrSection = ".section __DWARF,__debug_str"; + DwarfLocSection = ".section __DWARF,__debug_loc"; + DwarfARangesSection = ".section __DWARF,__debug_aranges"; + DwarfRangesSection = ".section __DWARF,__debug_ranges"; + DwarfMacInfoSection = ".section __DWARF,__debug_macinfo"; TextSection = ".text"; DataSection = ".data"; } From lattner at cs.uiuc.edu Thu Jun 15 16:33:43 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 16:33:43 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/README.txt Message-ID: <200606152133.QAA24428@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: README.txt updated: 1.116 -> 1.117 --- Log message: Add a note that Nate noticed. --- Diffs of the changes: (+34 -0) README.txt | 34 ++++++++++++++++++++++++++++++++++ 1 files changed, 34 insertions(+) Index: llvm/lib/Target/X86/README.txt diff -u llvm/lib/Target/X86/README.txt:1.116 llvm/lib/Target/X86/README.txt:1.117 --- llvm/lib/Target/X86/README.txt:1.116 Sun Jun 4 04:08:00 2006 +++ llvm/lib/Target/X86/README.txt Thu Jun 15 16:33:31 2006 @@ -668,3 +668,37 @@ //===---------------------------------------------------------------------===// We should handle __attribute__ ((__visibility__ ("hidden"))). + +//===---------------------------------------------------------------------===// + +Consider: +int foo(int *a, int t) { +int x; +for (x=0; x<40; ++x) + t = t + a[x] + x; +return t; +} + +We generate: +LBB1_1: #cond_true + movl %ecx, %esi + movl (%edx,%eax,4), %edi + movl %esi, %ecx + addl %edi, %ecx + addl %eax, %ecx + incl %eax + cmpl $40, %eax + jne LBB1_1 #cond_true + +GCC generates: + +L2: + addl (%ecx,%edx,4), %eax + addl %edx, %eax + addl $1, %edx + cmpl $40, %edx + jne L2 + +Smells like a register coallescing/reassociation issue. + +//===---------------------------------------------------------------------===// From lattner at cs.uiuc.edu Thu Jun 15 17:22:05 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 17:22:05 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/RegAllocLocal.cpp Message-ID: <200606152222.RAA24730@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: RegAllocLocal.cpp updated: 1.78 -> 1.79 --- Log message: Teach the local allocator to know that live-in values (e.g. arguments) are live at function entry. This prevents it from using arg registers for other purposes before the arguments are used. --- Diffs of the changes: (+20 -0) RegAllocLocal.cpp | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+) Index: llvm/lib/CodeGen/RegAllocLocal.cpp diff -u llvm/lib/CodeGen/RegAllocLocal.cpp:1.78 llvm/lib/CodeGen/RegAllocLocal.cpp:1.79 --- llvm/lib/CodeGen/RegAllocLocal.cpp:1.78 Thu May 4 12:52:23 2006 +++ llvm/lib/CodeGen/RegAllocLocal.cpp Thu Jun 15 17:21:53 2006 @@ -491,6 +491,26 @@ // loop over each instruction MachineBasicBlock::iterator MII = MBB.begin(); const TargetInstrInfo &TII = *TM->getInstrInfo(); + + // If this is the first basic block in the machine function, add live-in + // registers as active. + if (&MBB == &*MF->begin()) { + for (MachineFunction::livein_iterator I = MF->livein_begin(), + E = MF->livein_end(); I != E; ++I) { + unsigned Reg = I->first; + PhysRegsEverUsed[Reg] = true; + PhysRegsUsed[Reg] = 0; // It is free and reserved now + PhysRegsUseOrder.push_back(Reg); + for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg); + *AliasSet; ++AliasSet) { + PhysRegsUseOrder.push_back(*AliasSet); + PhysRegsUsed[*AliasSet] = 0; // It is free and reserved now + PhysRegsEverUsed[*AliasSet] = true; + } + } + } + + // Otherwise, sequentially allocate each instruction in the MBB. while (MII != MBB.end()) { MachineInstr *MI = MII++; const TargetInstrDescriptor &TID = TII.get(MI->getOpcode()); From reid at x10sys.com Thu Jun 15 19:01:10 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 15 Jun 2006 19:01:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/System/Unix/Signals.inc Message-ID: <200606160001.TAA25235@zion.cs.uiuc.edu> Changes in directory llvm/lib/System/Unix: Signals.inc updated: 1.10 -> 1.11 --- Log message: Only print the stack trace if it was requested. Previously, any call into the Signals module that registered the handlers would cause the stack trace to be generated. Now, you must explicitly call PrintStackTraceOnErrorSignal in order for that to happen. --- Diffs of the changes: (+5 -1) Signals.inc | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/lib/System/Unix/Signals.inc diff -u llvm/lib/System/Unix/Signals.inc:1.10 llvm/lib/System/Unix/Signals.inc:1.11 --- llvm/lib/System/Unix/Signals.inc:1.10 Mon Aug 1 21:14:22 2005 +++ llvm/lib/System/Unix/Signals.inc Thu Jun 15 19:00:57 2006 @@ -24,6 +24,8 @@ namespace { +bool StackTraceRequested = false; + /// InterruptFunction - The function to call if ctrl-c is pressed. void (*InterruptFunction)() = 0; @@ -132,7 +134,8 @@ // Otherwise if it is a fault (like SEGV) output the stacktrace to // STDERR (if we can) and reissue the signal to die... - PrintStackTrace(); + if (StackTraceRequested) + PrintStackTrace(); signal(Sig, SIG_DFL); } @@ -178,6 +181,7 @@ /// PrintStackTraceOnErrorSignal - When an error signal (such as SIBABRT or /// SIGSEGV) is delivered to the process, print a stack trace and then exit. void sys::PrintStackTraceOnErrorSignal() { + StackTraceRequested = true; std::for_each(KillSigs, KillSigsEnd, RegisterHandler); } From lattner at cs.uiuc.edu Thu Jun 15 20:21:10 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 20:21:10 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Linker/2006-06-15-GlobalVarAlignment.ll Message-ID: <200606160121.UAA25731@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Linker: 2006-06-15-GlobalVarAlignment.ll added (r1.1) --- Log message: New testcase, the linker is not merging alignments right. --- Diffs of the changes: (+7 -0) 2006-06-15-GlobalVarAlignment.ll | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/test/Regression/Linker/2006-06-15-GlobalVarAlignment.ll diff -c /dev/null llvm/test/Regression/Linker/2006-06-15-GlobalVarAlignment.ll:1.1 *** /dev/null Thu Jun 15 20:21:08 2006 --- llvm/test/Regression/Linker/2006-06-15-GlobalVarAlignment.ll Thu Jun 15 20:20:58 2006 *************** *** 0 **** --- 1,7 ---- + ; The linker should choose the largest alignment when linking. + + ; RUN: echo "%X = global int 7, align 8" | llvm-as > %t.2.bc + ; RUN: llvm-as < %s > %t.1.bc + ; RUN: llvm-link %t.[12].bc | llvm-dis | grep 'align 8' + + %X = weak global int 7, align 4 From lattner at cs.uiuc.edu Thu Jun 15 20:24:16 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 20:24:16 -0500 Subject: [llvm-commits] CVS: llvm/lib/Linker/LinkModules.cpp Message-ID: <200606160124.UAA25805@zion.cs.uiuc.edu> Changes in directory llvm/lib/Linker: LinkModules.cpp updated: 1.114 -> 1.115 --- Log message: Fix Regression/Linker/2006-06-15-GlobalVarAnment.ll --- Diffs of the changes: (+18 -5) LinkModules.cpp | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-) Index: llvm/lib/Linker/LinkModules.cpp diff -u llvm/lib/Linker/LinkModules.cpp:1.114 llvm/lib/Linker/LinkModules.cpp:1.115 --- llvm/lib/Linker/LinkModules.cpp:1.114 Thu Jun 1 14:14:22 2006 +++ llvm/lib/Linker/LinkModules.cpp Thu Jun 15 20:24:04 2006 @@ -452,7 +452,8 @@ SymbolTable *ST = (SymbolTable*)&Dest->getSymbolTable(); // Loop over all of the globals in the src module, mapping them over as we go - for (Module::global_iterator I = Src->global_begin(), E = Src->global_end(); I != E; ++I) { + for (Module::global_iterator I = Src->global_begin(), E = Src->global_end(); + I != E; ++I) { GlobalVariable *SGV = I; GlobalVariable *DGV = 0; // Check to see if may have to link the global. @@ -487,7 +488,9 @@ new GlobalVariable(SGV->getType()->getElementType(), SGV->isConstant(), SGV->getLinkage(), /*init*/0, SGV->getName(), Dest); - + // Propagate alignment info. + NewDGV->setAlignment(SGV->getAlignment()); + // If the LLVM runtime renamed the global, but it is an externally visible // symbol, DGV must be an existing global with internal linkage. Rename // it. @@ -509,12 +512,18 @@ SGV->isConstant(), SGV->getLinkage(), /*init*/0, "", Dest); + // Propagate alignment info. + NewDGV->setAlignment(std::max(DGV->getAlignment(), SGV->getAlignment())); + // Make sure to remember this mapping... ValueMap.insert(std::make_pair(SGV, NewDGV)); // Keep track that this is an appending variable... AppendingVars.insert(std::make_pair(SGV->getName(), NewDGV)); } else { + // Propagate alignment info. + DGV->setAlignment(std::max(DGV->getAlignment(), SGV->getAlignment())); + // Otherwise, perform the mapping as instructed by GetLinkageResult. If // the types don't match, and if we are to link from the source, nuke DGV // and create a new one of the appropriate type. @@ -522,6 +531,7 @@ GlobalVariable *NewDGV = new GlobalVariable(SGV->getType()->getElementType(), DGV->isConstant(), DGV->getLinkage()); + NewDGV->setAlignment(DGV->getAlignment()); Dest->getGlobalList().insert(DGV, NewDGV); DGV->replaceAllUsesWith(ConstantExpr::getCast(NewDGV, DGV->getType())); DGV->eraseFromParent(); @@ -560,7 +570,8 @@ std::string *Err) { // Loop over all of the globals in the src module, mapping them over as we go - for (Module::const_global_iterator I = Src->global_begin(), E = Src->global_end(); I != E; ++I){ + for (Module::const_global_iterator I = Src->global_begin(), + E = Src->global_end(); I != E; ++I) { const GlobalVariable *SGV = I; if (SGV->hasInitializer()) { // Only process initialized GV's @@ -709,7 +720,8 @@ *OI = RemapOperand(*OI, GlobalMap); // There is no need to map the arguments anymore. - for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end(); I != E; ++I) + for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end(); + I != E; ++I) GlobalMap.erase(I); return false; @@ -892,7 +904,8 @@ // it's functionality here. std::map GlobalsByName; - for (Module::global_iterator I = Dest->global_begin(), E = Dest->global_end(); I != E; ++I) { + for (Module::global_iterator I = Dest->global_begin(), E = Dest->global_end(); + I != E; ++I) { // Add all of the appending globals already in the Dest module to // AppendingVars. if (I->hasAppendingLinkage()) From lattner at cs.uiuc.edu Thu Jun 15 20:37:39 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 15 Jun 2006 20:37:39 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCSubtarget.cpp PPCSubtarget.h PPCTargetMachine.cpp PPCTargetMachine.h Message-ID: <200606160137.UAA25960@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCSubtarget.cpp updated: 1.19 -> 1.20 PPCSubtarget.h updated: 1.13 -> 1.14 PPCTargetMachine.cpp updated: 1.91 -> 1.92 PPCTargetMachine.h updated: 1.21 -> 1.22 --- Log message: First baby step towards ppc64 support. This adds a new -march=ppc64 backend that is currently just like ppc32 :) --- Diffs of the changes: (+88 -26) PPCSubtarget.cpp | 2 - PPCSubtarget.h | 6 ++++- PPCTargetMachine.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++--------- PPCTargetMachine.h | 47 ++++++++++++++++++++++++++++------------ 4 files changed, 88 insertions(+), 26 deletions(-) Index: llvm/lib/Target/PowerPC/PPCSubtarget.cpp diff -u llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.19 llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.20 --- llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.19 Tue Feb 28 23:50:56 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.cpp Thu Jun 15 20:37:27 2006 @@ -69,7 +69,7 @@ #endif -PPCSubtarget::PPCSubtarget(const Module &M, const std::string &FS) +PPCSubtarget::PPCSubtarget(const Module &M, const std::string &FS, bool is64Bit) : StackAlignment(16) , InstrItins() , IsGigaProcessor(false) Index: llvm/lib/Target/PowerPC/PPCSubtarget.h diff -u llvm/lib/Target/PowerPC/PPCSubtarget.h:1.13 llvm/lib/Target/PowerPC/PPCSubtarget.h:1.14 --- llvm/lib/Target/PowerPC/PPCSubtarget.h:1.13 Tue Feb 28 01:08:22 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.h Thu Jun 15 20:37:27 2006 @@ -44,7 +44,7 @@ /// This constructor initializes the data members to match that /// of the specified module. /// - PPCSubtarget(const Module &M, const std::string &FS); + PPCSubtarget(const Module &M, const std::string &FS, bool is64Bit); /// ParseSubtargetFeatures - Parses features string setting specified /// subtarget options. Definition of function is auto generated by tblgen. @@ -59,6 +59,10 @@ /// selection. const InstrItineraryData getInstrItineraryData() const { return InstrItins; } + const char *getTargetDataString() const { + // FIXME: Make is64Bit be for the processor, not the target. + return true ? "E-p:32:32-d:32-l:32" : "E-p:64:64-d:32-l:32"; + } bool hasFSQRT() const { return HasFSQRT; } bool hasSTFIWX() const { return HasSTFIWX; } Index: llvm/lib/Target/PowerPC/PPCTargetMachine.cpp diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.91 llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.92 --- llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.91 Sat May 20 18:28:54 2006 +++ llvm/lib/Target/PowerPC/PPCTargetMachine.cpp Thu Jun 15 20:37:27 2006 @@ -29,19 +29,29 @@ namespace { // Register the targets - RegisterTarget - X("ppc32", " PowerPC"); + RegisterTarget + X("ppc32", " PowerPC 32"); + RegisterTarget + Y("ppc64", " PowerPC 64"); } -unsigned PPCTargetMachine::getJITMatchQuality() { +unsigned PPC32TargetMachine::getJITMatchQuality() { #if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) - return 10; + if (sizeof(void*) == 4) + return 10; #else return 0; #endif } +unsigned PPC64TargetMachine::getJITMatchQuality() { +#if defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) + if (sizeof(void*) == 8) + return 10 * 0/*FIXME: not PPC64-JIT support yet! */; +#endif + return 0; +} -unsigned PPCTargetMachine::getModuleMatchQuality(const Module &M) { +unsigned PPC32TargetMachine::getModuleMatchQuality(const Module &M) { // We strongly match "powerpc-*". std::string TT = M.getTargetTriple(); if (TT.size() >= 8 && std::string(TT.begin(), TT.begin()+8) == "powerpc-") @@ -57,11 +67,31 @@ return getJITMatchQuality()/2; } -PPCTargetMachine::PPCTargetMachine(const Module &M, const std::string &FS) -: TargetMachine("PowerPC"), - DataLayout(std::string("PowerPC"), std::string("E-p:32:32-d:32-l:32")), - Subtarget(M, FS), FrameInfo(*this, false), JITInfo(*this), - TLInfo(*this), InstrItins(Subtarget.getInstrItineraryData()) { +unsigned PPC64TargetMachine::getModuleMatchQuality(const Module &M) { + // We strongly match "powerpc64-*". + std::string TT = M.getTargetTriple(); + if (TT.size() >= 10 && std::string(TT.begin(), TT.begin()+10) == "powerpc64-") + return 20; + + if (M.getEndianness() == Module::BigEndian && + M.getPointerSize() == Module::Pointer64) + return 10; // Weak match + else if (M.getEndianness() != Module::AnyEndianness || + M.getPointerSize() != Module::AnyPointerSize) + return 0; // Match for some other target + + return getJITMatchQuality()/2; +} + + +PPCTargetMachine::PPCTargetMachine(const Module &M, const std::string &FS, + bool is64Bit) + : TargetMachine("PowerPC"), Subtarget(M, FS, is64Bit), + DataLayout(std::string("PowerPC"), + std::string(Subtarget.getTargetDataString())), + FrameInfo(*this, false), JITInfo(*this), TLInfo(*this), + InstrItins(Subtarget.getInstrItineraryData()) { + if (TargetDefault == PPCTarget) { if (Subtarget.isAIX()) PPCTarget = TargetAIX; if (Subtarget.isDarwin()) PPCTarget = TargetDarwin; @@ -73,6 +103,15 @@ setRelocationModel(Reloc::PIC); } +PPC32TargetMachine::PPC32TargetMachine(const Module &M, const std::string &FS) + : PPCTargetMachine(M, FS, false) { +} + + +PPC64TargetMachine::PPC64TargetMachine(const Module &M, const std::string &FS) + : PPCTargetMachine(M, FS, true) { +} + /// addPassesToEmitFile - Add passes to the specified pass manager to implement /// a static compiler for this target. /// Index: llvm/lib/Target/PowerPC/PPCTargetMachine.h diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.h:1.21 llvm/lib/Target/PowerPC/PPCTargetMachine.h:1.22 --- llvm/lib/Target/PowerPC/PPCTargetMachine.h:1.21 Fri May 12 16:09:57 2006 +++ llvm/lib/Target/PowerPC/PPCTargetMachine.h Thu Jun 15 20:37:27 2006 @@ -26,44 +26,63 @@ class PassManager; class GlobalValue; +/// PPCTargetMachine - Common code between 32-bit and 64-bit PowerPC targets. +/// class PPCTargetMachine : public TargetMachine { - const TargetData DataLayout; // Calculates type size & alignment - PPCInstrInfo InstrInfo; - PPCSubtarget Subtarget; - PPCFrameInfo FrameInfo; - PPCJITInfo JITInfo; - PPCTargetLowering TLInfo; - InstrItineraryData InstrItins; + PPCSubtarget Subtarget; + const TargetData DataLayout; // Calculates type size & alignment + PPCInstrInfo InstrInfo; + PPCFrameInfo FrameInfo; + PPCJITInfo JITInfo; + PPCTargetLowering TLInfo; + InstrItineraryData InstrItins; public: - PPCTargetMachine(const Module &M, const std::string &FS); + PPCTargetMachine(const Module &M, const std::string &FS, bool is64Bit); virtual const PPCInstrInfo *getInstrInfo() const { return &InstrInfo; } virtual const TargetFrameInfo *getFrameInfo() const { return &FrameInfo; } virtual TargetJITInfo *getJITInfo() { return &JITInfo; } - virtual const TargetSubtarget *getSubtargetImpl() const{ return &Subtarget; } virtual PPCTargetLowering *getTargetLowering() const { return const_cast(&TLInfo); } virtual const MRegisterInfo *getRegisterInfo() const { return &InstrInfo.getRegisterInfo(); } - virtual const TargetData *getTargetData() const { return &DataLayout; } + + virtual const TargetData *getTargetData() const { return &DataLayout; } + virtual const PPCSubtarget *getSubtargetImpl() const { return &Subtarget; } virtual const InstrItineraryData getInstrItineraryData() const { return InstrItins; } - static unsigned getJITMatchQuality(); - - static unsigned getModuleMatchQuality(const Module &M); - virtual bool addPassesToEmitFile(PassManager &PM, std::ostream &Out, CodeGenFileType FileType, bool Fast); bool addPassesToEmitMachineCode(FunctionPassManager &PM, MachineCodeEmitter &MCE); }; + +/// PPC32TargetMachine - PowerPC 32-bit target machine. +/// +class PPC32TargetMachine : public PPCTargetMachine { +public: + PPC32TargetMachine(const Module &M, const std::string &FS); + static unsigned getJITMatchQuality(); + static unsigned getModuleMatchQuality(const Module &M); +}; + +/// PPC64TargetMachine - PowerPC 64-bit target machine. +/// +class PPC64TargetMachine : public PPCTargetMachine { +public: + PPC64TargetMachine(const Module &M, const std::string &FS); + + static unsigned getJITMatchQuality(); + static unsigned getModuleMatchQuality(const Module &M); +}; + } // end namespace llvm #endif From evan.cheng at apple.com Thu Jun 15 23:52:42 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 15 Jun 2006 23:52:42 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Message-ID: <200606160452.XAA26765@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: SimplifyLibCalls.cpp updated: 1.64 -> 1.65 --- Log message: Simplify fprintf(file, "%s", str) to fputs(str, file). --- Diffs of the changes: (+36 -16) SimplifyLibCalls.cpp | 52 +++++++++++++++++++++++++++++++++++---------------- 1 files changed, 36 insertions(+), 16 deletions(-) Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.64 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.65 --- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.64 Fri May 12 18:35:26 2006 +++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Thu Jun 15 23:52:30 2006 @@ -229,6 +229,15 @@ return fputc_func; } + /// @brief Return a Function* for the fputs libcall + Function* get_fputs(const Type* FILEptr_type) { + if (!fputs_func) + fputs_func = M->getOrInsertFunction("fputs", Type::IntTy, + PointerType::get(Type::SByteTy), + FILEptr_type, NULL); + return fputs_func; + } + /// @brief Return a Function* for the fwrite libcall Function* get_fwrite(const Type* FILEptr_type) { if (!fwrite_func) @@ -310,6 +319,7 @@ M = &mod; TD = &getAnalysis(); fputc_func = 0; + fputs_func = 0; fwrite_func = 0; memcpy_func = 0; memchr_func = 0; @@ -325,7 +335,7 @@ private: /// Caches for function pointers. - Function *fputc_func, *fwrite_func; + Function *fputc_func, *fputs_func, *fwrite_func; Function *memcpy_func, *memchr_func; Function* sqrt_func; Function *strcpy_func, *strlen_func; @@ -1340,21 +1350,31 @@ { uint64_t len = 0; ConstantArray* CA = 0; - if (!getConstantStringLength(ci->getOperand(3), len, &CA)) - return false; - - // fprintf(file,"%s",str) -> fwrite(fmt,strlen(fmt),1,file) - const Type* FILEptr_type = ci->getOperand(1)->getType(); - Function* fwrite_func = SLC.get_fwrite(FILEptr_type); - if (!fwrite_func) - return false; - std::vector args; - args.push_back(CastToCStr(ci->getOperand(3), *ci)); - args.push_back(ConstantUInt::get(SLC.getIntPtrType(),len)); - args.push_back(ConstantUInt::get(SLC.getIntPtrType(),1)); - args.push_back(ci->getOperand(1)); - new CallInst(fwrite_func,args,ci->getName(),ci); - ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy,len)); + if (getConstantStringLength(ci->getOperand(3), len, &CA)) { + // fprintf(file,"%s",str) -> fwrite(str,strlen(str),1,file) + const Type* FILEptr_type = ci->getOperand(1)->getType(); + Function* fwrite_func = SLC.get_fwrite(FILEptr_type); + if (!fwrite_func) + return false; + std::vector args; + args.push_back(CastToCStr(ci->getOperand(3), *ci)); + args.push_back(ConstantUInt::get(SLC.getIntPtrType(),len)); + args.push_back(ConstantUInt::get(SLC.getIntPtrType(),1)); + args.push_back(ci->getOperand(1)); + new CallInst(fwrite_func,args,ci->getName(),ci); + ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy,len)); + } else { + // fprintf(file,"%s",str) -> fputs(str,file) + const Type* FILEptr_type = ci->getOperand(1)->getType(); + Function* fputs_func = SLC.get_fputs(FILEptr_type); + if (!fputs_func) + return false; + std::vector args; + args.push_back(ci->getOperand(3)); + args.push_back(ci->getOperand(1)); + new CallInst(fputs_func,args,ci->getName(),ci); + ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy,len)); + } break; } case 'c': From evan.cheng at apple.com Fri Jun 16 03:36:49 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 16 Jun 2006 03:36:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Message-ID: <200606160836.DAA25665@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: SimplifyLibCalls.cpp updated: 1.65 -> 1.66 --- Log message: More libcall transformations: printf("%s\n", str) -> puts(str) printf("%c", c) -> putchar(c) Also fixed fprintf(file, "%c", c) -> fputc(c, file) --- Diffs of the changes: (+110 -8) SimplifyLibCalls.cpp | 118 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 110 insertions(+), 8 deletions(-) Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.65 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.66 --- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.65 Thu Jun 15 23:52:30 2006 +++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Fri Jun 16 03:36:35 2006 @@ -221,6 +221,23 @@ /// @brief Return the size_t type -- syntactic shortcut const Type* getIntPtrType() const { return TD->getIntPtrType(); } + /// @brief Return a Function* for the putchar libcall + Function* get_putchar() { + if (!putchar_func) + putchar_func = M->getOrInsertFunction("putchar", Type::IntTy, Type::IntTy, + NULL); + return putchar_func; + } + + /// @brief Return a Function* for the puts libcall + Function* get_puts() { + if (!puts_func) + puts_func = M->getOrInsertFunction("puts", Type::IntTy, + PointerType::get(Type::SByteTy), + NULL); + return puts_func; + } + /// @brief Return a Function* for the fputc libcall Function* get_fputc(const Type* FILEptr_type) { if (!fputc_func) @@ -318,6 +335,8 @@ void reset(Module& mod) { M = &mod; TD = &getAnalysis(); + putchar_func = 0; + puts_func = 0; fputc_func = 0; fputs_func = 0; fwrite_func = 0; @@ -335,6 +354,7 @@ private: /// Caches for function pointers. + Function *putchar_func, *puts_func; Function *fputc_func, *fputs_func, *fwrite_func; Function *memcpy_func, *memchr_func; Function* sqrt_func; @@ -1264,10 +1284,94 @@ } } PowOptimizer; +/// This LibCallOptimization will simplify calls to the "printf" library +/// function. It looks for cases where the result of printf is not used and the +/// operation can be reduced to something simpler. +/// @brief Simplify the printf library function. +struct PrintfOptimization : public LibCallOptimization { +public: + /// @brief Default Constructor + PrintfOptimization() : LibCallOptimization("printf", + "Number of 'printf' calls simplified") {} + + /// @brief Make sure that the "printf" function has the right prototype + virtual bool ValidateCalledFunction(const Function* f, SimplifyLibCalls& SLC){ + // Just make sure this has at least 1 arguments + return (f->arg_size() >= 1); + } + + /// @brief Perform the printf optimization. + virtual bool OptimizeCall(CallInst* ci, SimplifyLibCalls& SLC) { + // If the call has more than 2 operands, we can't optimize it + if (ci->getNumOperands() > 3 || ci->getNumOperands() <= 2) + return false; + + // If the result of the printf call is used, none of these optimizations + // can be made. + if (!ci->use_empty()) + return false; + + // All the optimizations depend on the length of the first argument and the + // fact that it is a constant string array. Check that now + uint64_t len = 0; + ConstantArray* CA = 0; + if (!getConstantStringLength(ci->getOperand(1), len, &CA)) + return false; + + if (len != 2 && len != 3) + return false; + + // The first character has to be a % + if (ConstantInt* CI = dyn_cast(CA->getOperand(0))) + if (CI->getRawValue() != '%') + return false; + + // Get the second character and switch on its value + ConstantInt* CI = dyn_cast(CA->getOperand(1)); + switch (CI->getRawValue()) { + case 's': + { + if (len != 3 || + dyn_cast(CA->getOperand(2))->getRawValue() != '\n') + return false; + + // printf("%s\n",str) -> puts(str) + Function* puts_func = SLC.get_puts(); + if (!puts_func) + return false; + std::vector args; + args.push_back(ci->getOperand(2)); + new CallInst(puts_func,args,ci->getName(),ci); + ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy,len)); + break; + } + case 'c': + { + // printf("%c",c) -> putchar(c) + if (len != 2) + return false; + + Function* putchar_func = SLC.get_putchar(); + if (!putchar_func) + return false; + CastInst* cast = new CastInst(ci->getOperand(2), Type::IntTy, + CI->getName()+".int", ci); + new CallInst(putchar_func, cast, "", ci); + ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy, 1)); + break; + } + default: + return false; + } + ci->eraseFromParent(); + return true; + } +} PrintfOptimizer; + /// This LibCallOptimization will simplify calls to the "fprintf" library /// function. It looks for cases where the result of fprintf is not used and the /// operation can be reduced to something simpler. -/// @brief Simplify the pow library function. +/// @brief Simplify the fprintf library function. struct FPrintFOptimization : public LibCallOptimization { public: /// @brief Default Constructor @@ -1379,15 +1483,13 @@ } case 'c': { - ConstantInt* CI = dyn_cast(ci->getOperand(3)); - if (!CI) - return false; - + // fprintf(file,"%c",c) -> fputc(c,file) const Type* FILEptr_type = ci->getOperand(1)->getType(); Function* fputc_func = SLC.get_fputc(FILEptr_type); if (!fputc_func) return false; - CastInst* cast = new CastInst(CI,Type::IntTy,CI->getName()+".int",ci); + CastInst* cast = new CastInst(ci->getOperand(3), Type::IntTy, + CI->getName()+".int", ci); new CallInst(fputc_func,cast,ci->getOperand(1),"",ci); ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy,1)); break; @@ -1403,7 +1505,7 @@ /// This LibCallOptimization will simplify calls to the "sprintf" library /// function. It looks for cases where the result of sprintf is not used and the /// operation can be reduced to something simpler. -/// @brief Simplify the pow library function. +/// @brief Simplify the sprintf library function. struct SPrintFOptimization : public LibCallOptimization { public: /// @brief Default Constructor @@ -1530,7 +1632,7 @@ /// This LibCallOptimization will simplify calls to the "fputs" library /// function. It looks for cases where the result of fputs is not used and the /// operation can be reduced to something simpler. -/// @brief Simplify the pow library function. +/// @brief Simplify the puts library function. struct PutsOptimization : public LibCallOptimization { public: /// @brief Default Constructor From jlaskey at apple.com Fri Jun 16 08:14:28 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 08:14:28 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Support/Dwarf.h Message-ID: <200606161314.IAA05179@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Support: Dwarf.h updated: 1.7 -> 1.8 --- Log message: 1. Revise vector debug support. 2. Update docs for vector debug support and new version control. 3. Simplify serialization of DebugDescInfo subclasses. --- Diffs of the changes: (+2 -0) Dwarf.h | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/include/llvm/Support/Dwarf.h diff -u llvm/include/llvm/Support/Dwarf.h:1.7 llvm/include/llvm/Support/Dwarf.h:1.8 --- llvm/include/llvm/Support/Dwarf.h:1.7 Thu Jun 15 15:51:43 2006 +++ llvm/include/llvm/Support/Dwarf.h Fri Jun 16 08:14:03 2006 @@ -37,6 +37,8 @@ DW_TAG_arg_variable = 0x101, // Tag for argument variables. DW_TAG_return_variable = 0x102, // Tag for return variables. + DW_TAG_vector_type = 0x103, // Tag for vector types. + DW_TAG_user_base = 0x1000, // Recommended base for user tags. DW_CIE_VERSION = 1, // Common frame information version. From jlaskey at apple.com Fri Jun 16 08:14:28 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 08:14:28 -0500 Subject: [llvm-commits] CVS: llvm/docs/SourceLevelDebugging.html Message-ID: <200606161314.IAA05180@zion.cs.uiuc.edu> Changes in directory llvm/docs: SourceLevelDebugging.html updated: 1.19 -> 1.20 --- Log message: 1. Revise vector debug support. 2. Update docs for vector debug support and new version control. 3. Simplify serialization of DebugDescInfo subclasses. --- Diffs of the changes: (+56 -56) SourceLevelDebugging.html | 112 +++++++++++++++++++++++----------------------- 1 files changed, 56 insertions(+), 56 deletions(-) Index: llvm/docs/SourceLevelDebugging.html diff -u llvm/docs/SourceLevelDebugging.html:1.19 llvm/docs/SourceLevelDebugging.html:1.20 --- llvm/docs/SourceLevelDebugging.html:1.19 Thu Jun 15 15:51:43 2006 +++ llvm/docs/SourceLevelDebugging.html Fri Jun 16 08:14:02 2006 @@ -295,13 +295,15 @@ } -

    The first field of a descriptor is always an uint containing a tag -value identifying the content of the descriptor. The remaining fields are -specific to the descriptor. The values of tags are loosely bound to the tag -values of Dwarf information entries. However, that does not restrict the use of -the information supplied to Dwarf targets.

    +

    The first field of a descriptor is always an +uint containing a tag value identifying the content of the descriptor. +The remaining fields are specific to the descriptor. The values of tags are +loosely bound to the tag values of Dwarf information entries. However, that +does not restrict the use of the information supplied to Dwarf targets. To +facilitate versioning of debug information, the tag is augmented with the +current debug version (LLVMDebugVersion = 4 << 16 or 0x40000.)

    -

    The details of the various descriptors follow.

    +

    The details of the various descriptors follow.

    @@ -314,7 +316,7 @@
       %llvm.dbg.anchor.type = type {
    -    uint,   ;; Tag = 0
    +    uint,   ;; Tag = 0 + LLVMDebugVersion
         uint    ;; Tag of descriptors grouped by the anchor
       }
     
    @@ -352,9 +354,8 @@
       %llvm.dbg.compile_unit.type = type {
    -    uint,   ;; Tag = 17 (DW_TAG_compile_unit)
    +    uint,   ;; Tag = 17 + LLVMDebugVersion (DW_TAG_compile_unit)
         {  }*,  ;; Compile unit anchor = cast = (%llvm.dbg.anchor.type* %llvm.dbg.compile_units to {  }*)
    -    uint,   ;; LLVM debug version number = 3
         uint,   ;; Dwarf language identifier (ex. DW_LANG_C89) 
         sbyte*, ;; Source file name
         sbyte*, ;; Source file directory (includes trailing slash)
    @@ -362,11 +363,11 @@
       }
     
    -

    These descriptors contain the version number for the debug info (currently -3), a source language ID for the file (we use the Dwarf 3.0 ID numbers, such as -DW_LANG_C89, DW_LANG_C_plus_plus, DW_LANG_Cobol74, -etc), three strings describing the filename, working directory of the compiler, -and an identifier string for the compiler that produced it.

    +

    These descriptors contain a source language ID for the file (we use the Dwarf +3.0 ID numbers, such as DW_LANG_C89, DW_LANG_C_plus_plus, +DW_LANG_Cobol74, etc), three strings describing the filename, working +directory of the compiler, and an identifier string for the compiler that +produced it.

    Compile unit descriptors provide the root context for objects declared in a specific source file. Global variables and top level functions would be defined @@ -384,7 +385,7 @@

       %llvm.dbg.global_variable.type = type {
    -    uint,   ;; Tag = 52 (DW_TAG_variable)
    +    uint,   ;; Tag = 52 + LLVMDebugVersion (DW_TAG_variable)
         {  }*,  ;; Global variable anchor = cast (%llvm.dbg.anchor.type* %llvm.dbg.global_variables to {  }*),  
         {  }*,  ;; Reference to context descriptor
         sbyte*, ;; Name
    @@ -411,7 +412,7 @@
     
     
       %llvm.dbg.subprogram.type = type {
    -    uint,   ;; Tag = 46 (DW_TAG_subprogram)
    +    uint,   ;; Tag = 46 + LLVMDebugVersion (DW_TAG_subprogram)
         {  }*,  ;; Subprogram anchor = cast (%llvm.dbg.anchor.type* %llvm.dbg.subprograms to {  }*),  
         {  }*,  ;; Reference to context descriptor
         sbyte*, ;; Name
    @@ -437,7 +438,7 @@
     
     
       %llvm.dbg.block = type {
    -    uint,   ;; Tag = 13 (DW_TAG_lexical_block)
    +    uint,   ;; Tag = 13 + LLVMDebugVersion (DW_TAG_lexical_block)
         {  }*   ;; Reference to context descriptor
       }
     
    @@ -457,7 +458,7 @@
       %llvm.dbg.basictype.type = type {
    -    uint,   ;; Tag = 36 (DW_TAG_base_type)
    +    uint,   ;; Tag = 36 + LLVMDebugVersion (DW_TAG_base_type)
         {  }*,  ;; Reference to context (typically a compile unit)
         sbyte*, ;; Name (may be "" for anonymous types)
         {  }*,  ;; Reference to compile unit where defined (may be NULL)
    @@ -575,7 +576,6 @@
         uint,   ;; Size in bits
         uint,   ;; Alignment in bits
         uint,   ;; Offset in bits
    -    bool,   ;; Is vector flag
         {  }*   ;; Reference to array of member descriptors
       }
     
    @@ -589,13 +589,15 @@ DW_TAG_enumeration_type = 4 DW_TAG_structure_type = 19 DW_TAG_union_type = 23 + DW_TAG_vector_type = 259

    The vector flag indicates that an array type is a native packed vector.

    -

    The members of array types (tag = DW_TAG_array_type) are subrange descriptors, each representing the range of -subscripts at that level of indexing.

    +

    The members of array types (tag = DW_TAG_array_type) or vector types +(tag = DW_TAG_vector_type) are subrange +descriptors, each representing the range of subscripts at that level of +indexing.

    The members of enumeration types (tag = DW_TAG_enumeration_type) are enumerator descriptors, each representing the @@ -627,7 +629,7 @@

       %llvm.dbg.subrange.type = type {
    -    uint,   ;; Tag = 33 (DW_TAG_subrange_type)
    +    uint,   ;; Tag = 33 + LLVMDebugVersion (DW_TAG_subrange_type)
         uint,   ;; Low value
         uint    ;; High value
       }
    @@ -650,7 +652,7 @@
     
     
       %llvm.dbg.enumerator.type = type {
    -    uint,   ;; Tag = 40 (DW_TAG_enumerator)
    +    uint,   ;; Tag = 40 + LLVMDebugVersion (DW_TAG_enumerator)
         sbyte*, ;; Name
         uint    ;; Value
       }
    @@ -1042,7 +1044,7 @@
     ;; Define the compile unit for the source file "/Users/mine/sources/MySource.cpp".
     ;;
     %llvm.dbg.compile_unit1 = internal constant %llvm.dbg.compile_unit.type {
    -    uint 17, 
    +    uint add(uint 17, uint 262144), 
         {  }* cast (%llvm.dbg.anchor.type* %llvm.dbg.compile_units to {  }*), 
         uint 1, 
         uint 1, 
    @@ -1054,7 +1056,7 @@
     ;; Define the compile unit for the header file "/Users/mine/sources/MyHeader.h".
     ;;
     %llvm.dbg.compile_unit2 = internal constant %llvm.dbg.compile_unit.type {
    -    uint 17, 
    +    uint add(uint 17, uint 262144), 
         {  }* cast (%llvm.dbg.anchor.type* %llvm.dbg.compile_units to {  }*), 
         uint 1, 
         uint 1, 
    @@ -1117,7 +1119,7 @@
     ;; variable anchor and the global variable itself.
     ;;
     %llvm.dbg.global_variable = internal constant %llvm.dbg.global_variable.type {
    -    uint 52, 
    +    uint add(uint 52, uint 262144), 
         {  }* cast (%llvm.dbg.anchor.type* %llvm.dbg.global_variables to {  }*), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([9 x sbyte]* %str1, int 0, int 0), 
    @@ -1133,7 +1135,7 @@
     ;; intrinsic type the source file is NULL and line 0.
     ;;    
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([4 x sbyte]* %str2, int 0, int 0), 
         {  }* null, 
    @@ -1190,7 +1192,7 @@
     ;; Define the descriptor for the subprogram.  TODO - more details.
     ;;
     %llvm.dbg.subprogram = internal constant %llvm.dbg.subprogram.type {
    -    uint 46, 
    +    uint add(uint 46, uint 262144), 
         {  }* cast (%llvm.dbg.anchor.type* %llvm.dbg.subprograms to {  }*), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([5 x sbyte]* %str1, int 0, int 0), 
    @@ -1235,7 +1237,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([5 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1258,7 +1260,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([5 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1281,7 +1283,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([14 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1304,7 +1306,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([10 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1327,7 +1329,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([19 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1350,7 +1352,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([4 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1373,7 +1375,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([13 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1396,7 +1398,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([14 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1419,7 +1421,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([23 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1442,7 +1444,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([6 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1465,7 +1467,7 @@
     
     
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([7 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1499,7 +1501,7 @@
     ;; Define the typedef "IntPtr".
     ;;
     %llvm.dbg.derivedtype1 = internal constant %llvm.dbg.derivedtype.type {
    -    uint 22, 
    +    uint add(uint 22, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([7 x sbyte]* %str1, int 0, int 0), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
    @@ -1514,7 +1516,7 @@
     ;; Define the pointer type.
     ;;
     %llvm.dbg.derivedtype2 = internal constant %llvm.dbg.derivedtype.type {
    -    uint 15, 
    +    uint add(uint 15, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* null, 
         {  }* null, 
    @@ -1528,7 +1530,7 @@
     ;; Define the const type.
     ;;
     %llvm.dbg.derivedtype3 = internal constant %llvm.dbg.derivedtype.type {
    -    uint 38, 
    +    uint add(uint 38, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* null, 
         {  }* null, 
    @@ -1542,7 +1544,7 @@
     ;; Define the int type.
     ;;
     %llvm.dbg.basictype1 = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([4 x sbyte]* %str2, int 0, int 0), 
         {  }* null, 
    @@ -1580,7 +1582,7 @@
     ;; Define basic type for unsigned int.
     ;;
     %llvm.dbg.basictype = internal constant %llvm.dbg.basictype.type {
    -    uint 36, 
    +    uint add(uint 36, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([13 x sbyte]* %str1, int 0, int 0), 
         {  }* null, 
    @@ -1595,7 +1597,7 @@
     ;; Define composite type for struct Color.
     ;;
     %llvm.dbg.compositetype = internal constant %llvm.dbg.compositetype.type {
    -    uint 19, 
    +    uint add(uint 19, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([6 x sbyte]* %str2, int 0, int 0), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
    @@ -1604,7 +1606,6 @@
         uint 32, 
         uint 0, 
         {  }* null,
    -    bool false,
         {  }* cast ([3 x {  }*]* %llvm.dbg.array to {  }*) }, section "llvm.metadata"
     %str2 = internal constant [6 x sbyte] c"Color\00", section "llvm.metadata"
     
    @@ -1612,7 +1613,7 @@
     ;; Define the Red field.
     ;;
     %llvm.dbg.derivedtype1 = internal constant %llvm.dbg.derivedtype.type {
    -    uint 13, 
    +    uint add(uint 13, uint 262144), 
         {  }* null, 
         sbyte* getelementptr ([4 x sbyte]* %str3, int 0, int 0), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
    @@ -1627,7 +1628,7 @@
     ;; Define the Green field.
     ;;
     %llvm.dbg.derivedtype2 = internal constant %llvm.dbg.derivedtype.type {
    -    uint 13, 
    +    uint add(uint 13, uint 262144), 
         {  }* null, 
         sbyte* getelementptr ([6 x sbyte]* %str4, int 0, int 0), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
    @@ -1642,7 +1643,7 @@
     ;; Define the Blue field.
     ;;
     %llvm.dbg.derivedtype3 = internal constant %llvm.dbg.derivedtype.type {
    -    uint 13, 
    +    uint add(uint 13, uint 262144), 
         {  }* null, 
         sbyte* getelementptr ([5 x sbyte]* %str5, int 0, int 0), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
    @@ -1688,7 +1689,7 @@
     ;; Define composite type for enum Trees
     ;;
     %llvm.dbg.compositetype = internal constant %llvm.dbg.compositetype.type {
    -    uint 4, 
    +    uint add(uint 4, uint 262144), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
         sbyte* getelementptr ([6 x sbyte]* %str1, int 0, int 0), 
         {  }* cast (%llvm.dbg.compile_unit.type* %llvm.dbg.compile_unit to {  }*), 
    @@ -1697,7 +1698,6 @@
         uint 32, 
         uint 0, 
         {  }* null, 
    -    bool false,
         {  }* cast ([3 x {  }*]* %llvm.dbg.array to {  }*) }, section "llvm.metadata"
     %str1 = internal constant [6 x sbyte] c"Trees\00", section "llvm.metadata"
     
    @@ -1705,7 +1705,7 @@
     ;; Define Spruce enumerator.
     ;;
     %llvm.dbg.enumerator1 = internal constant %llvm.dbg.enumerator.type {
    -    uint 40, 
    +    uint add(uint 40, uint 262144), 
         sbyte* getelementptr ([7 x sbyte]* %str2, int 0, int 0), 
         int 100 }, section "llvm.metadata"
     %str2 = internal constant [7 x sbyte] c"Spruce\00", section "llvm.metadata"
    @@ -1714,7 +1714,7 @@
     ;; Define Oak enumerator.
     ;;
     %llvm.dbg.enumerator2 = internal constant %llvm.dbg.enumerator.type {
    -    uint 40, 
    +    uint add(uint 40, uint 262144), 
         sbyte* getelementptr ([4 x sbyte]* %str3, int 0, int 0), 
         int 200 }, section "llvm.metadata"
     %str3 = internal constant [4 x sbyte] c"Oak\00", section "llvm.metadata"
    @@ -1723,7 +1723,7 @@
     ;; Define Maple enumerator.
     ;;
     %llvm.dbg.enumerator3 = internal constant %llvm.dbg.enumerator.type {
    -    uint 40, 
    +    uint add(uint 40, uint 262144), 
         sbyte* getelementptr ([6 x sbyte]* %str4, int 0, int 0), 
         int 300 }, section "llvm.metadata"
     %str4 = internal constant [6 x sbyte] c"Maple\00", section "llvm.metadata"
    @@ -1750,7 +1750,7 @@
     
       Chris Lattner
    LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/06/15 20:51:43 $ + Last modified: $Date: 2006/06/16 13:14:02 $ From jlaskey at apple.com Fri Jun 16 08:14:28 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 08:14:28 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/MachineDebugInfo.h Message-ID: <200606161314.IAA05178@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: MachineDebugInfo.h updated: 1.35 -> 1.36 --- Log message: 1. Revise vector debug support. 2. Update docs for vector debug support and new version control. 3. Simplify serialization of DebugDescInfo subclasses. --- Diffs of the changes: (+51 -34) MachineDebugInfo.h | 85 +++++++++++++++++++++++++++++++---------------------- 1 files changed, 51 insertions(+), 34 deletions(-) Index: llvm/include/llvm/CodeGen/MachineDebugInfo.h diff -u llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.35 llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.36 --- llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.35 Thu Jun 15 15:51:43 2006 +++ llvm/include/llvm/CodeGen/MachineDebugInfo.h Fri Jun 16 08:14:03 2006 @@ -57,7 +57,8 @@ // Debug info constants. enum { - LLVMDebugVersion = 4 // Current version of debug information. + LLVMDebugVersion = (4 << 16), // Current version of debug information. + LLVMDebugVersionMask = 0xffff0000 // Mask for version number. }; //===----------------------------------------------------------------------===// @@ -90,25 +91,20 @@ /// class DebugInfoDesc { private: - enum { - tag_mask = 0x0000ffff, - version_shift = 16 - }; - - unsigned Tag; // Content indicator. Dwarf values are // used but that does not limit use to // Dwarf writers. protected: - DebugInfoDesc(unsigned T) : Tag(T | (LLVMDebugVersion << version_shift)) {} + DebugInfoDesc(unsigned T) : Tag(T | LLVMDebugVersion) {} public: virtual ~DebugInfoDesc() {} // Accessors - unsigned getTag() const { return Tag & tag_mask; } - unsigned getVersion() const { return Tag >> version_shift; } + unsigned getTag() const { return Tag & ~LLVMDebugVersionMask; } + unsigned getVersion() const { return Tag & LLVMDebugVersionMask; } + void setTag(unsigned T) { Tag = T | LLVMDebugVersion; } /// TagFromGlobal - Returns the tag number from a debug info descriptor /// GlobalVariable. Return DIIValid if operand is not an unsigned int. @@ -199,7 +195,7 @@ /// descriptors. class AnchoredDesc : public DebugInfoDesc { private: - AnchorDesc *Anchor; // Anchor for all descriptors of the + DebugInfoDesc *Anchor; // Anchor for all descriptors of the // same type. protected: @@ -208,8 +204,8 @@ public: // Accessors. - AnchorDesc *getAnchor() const { return Anchor; } - void setAnchor(AnchorDesc *A) { Anchor = A; } + AnchorDesc *getAnchor() const { return static_cast(Anchor); } + void setAnchor(AnchorDesc *A) { Anchor = static_cast(A); } //===--------------------------------------------------------------------===// // Subclasses should supply the following virtual methods. @@ -282,7 +278,7 @@ private: DebugInfoDesc *Context; // Context debug descriptor. std::string Name; // Type name (may be empty.) - CompileUnitDesc *File; // Defined compile unit (may be NULL.) + DebugInfoDesc *File; // Defined compile unit (may be NULL.) unsigned Line; // Defined line# (may be zero.) uint64_t Size; // Type bit size (may be zero.) uint64_t Align; // Type bit alignment (may be zero.) @@ -294,14 +290,18 @@ // Accessors DebugInfoDesc *getContext() const { return Context; } const std::string &getName() const { return Name; } - CompileUnitDesc *getFile() const { return File; } + CompileUnitDesc *getFile() const { + return static_cast(File); + } unsigned getLine() const { return Line; } uint64_t getSize() const { return Size; } uint64_t getAlign() const { return Align; } uint64_t getOffset() const { return Offset; } void setContext(DebugInfoDesc *C) { Context = C; } void setName(const std::string &N) { Name = N; } - void setFile(CompileUnitDesc *U) { File = U; } + void setFile(CompileUnitDesc *U) { + File = static_cast(U); + } void setLine(unsigned L) { Line = L; } void setSize(uint64_t S) { Size = S; } void setAlign(uint64_t A) { Align = A; } @@ -365,14 +365,18 @@ /// derived types (eg., typedef, pointer, reference.) class DerivedTypeDesc : public TypeDesc { private: - TypeDesc *FromType; // Type derived from. + DebugInfoDesc *FromType; // Type derived from. public: DerivedTypeDesc(unsigned T); // Accessors - TypeDesc *getFromType() const { return FromType; } - void setFromType(TypeDesc *F) { FromType = F; } + TypeDesc *getFromType() const { + return static_cast(FromType); + } + void setFromType(TypeDesc *F) { + FromType = static_cast(F); + } // Implement isa/cast/dyncast. static bool classof(const DerivedTypeDesc *) { return true; } @@ -400,16 +404,13 @@ /// array/struct types (eg., arrays, struct, union, enums.) class CompositeTypeDesc : public DerivedTypeDesc { private: - bool IsVector; // packed/vector array std::vector Elements;// Information used to compose type. public: CompositeTypeDesc(unsigned T); // Accessors - bool isVector() const { return IsVector; } std::vector &getElements() { return Elements; } - void setIsVector() { IsVector = true; } // Implement isa/cast/dyncast. static bool classof(const CompositeTypeDesc *) { return true; } @@ -516,9 +517,9 @@ private: DebugInfoDesc *Context; // Context debug descriptor. std::string Name; // Type name (may be empty.) - CompileUnitDesc *File; // Defined compile unit (may be NULL.) + DebugInfoDesc *File; // Defined compile unit (may be NULL.) unsigned Line; // Defined line# (may be zero.) - TypeDesc *TyDesc; // Type of variable. + DebugInfoDesc *TyDesc; // Type of variable. public: VariableDesc(unsigned T); @@ -526,14 +527,22 @@ // Accessors DebugInfoDesc *getContext() const { return Context; } const std::string &getName() const { return Name; } - CompileUnitDesc *getFile() const { return File; } + CompileUnitDesc *getFile() const { + return static_cast(File); + } unsigned getLine() const { return Line; } - TypeDesc *getType() const { return TyDesc; } + TypeDesc *getType() const { + return static_cast(TyDesc); + } void setContext(DebugInfoDesc *C) { Context = C; } void setName(const std::string &N) { Name = N; } - void setFile(CompileUnitDesc *U) { File = U; } + void setFile(CompileUnitDesc *U) { + File = static_cast(U); + } void setLine(unsigned L) { Line = L; } - void setType(TypeDesc *T) { TyDesc = T; } + void setType(TypeDesc *T) { + TyDesc = static_cast(T); + } // Implement isa/cast/dyncast. static bool classof(const VariableDesc *) { return true; } @@ -563,9 +572,9 @@ private: DebugInfoDesc *Context; // Context debug descriptor. std::string Name; // Global name. - CompileUnitDesc *File; // Defined compile unit (may be NULL.) + DebugInfoDesc *File; // Defined compile unit (may be NULL.) unsigned Line; // Defined line# (may be zero.) - TypeDesc *TyDesc; // Type debug descriptor. + DebugInfoDesc *TyDesc; // Type debug descriptor. bool IsStatic; // Is the global a static. bool IsDefinition; // Is the global defined in context. @@ -576,16 +585,24 @@ // Accessors DebugInfoDesc *getContext() const { return Context; } const std::string &getName() const { return Name; } - CompileUnitDesc *getFile() const { return File; } + CompileUnitDesc *getFile() const { + return static_cast(File); + } unsigned getLine() const { return Line; } - TypeDesc *getType() const { return TyDesc; } + TypeDesc *getType() const { + return static_cast(TyDesc); + } bool isStatic() const { return IsStatic; } bool isDefinition() const { return IsDefinition; } void setContext(DebugInfoDesc *C) { Context = C; } void setName(const std::string &N) { Name = N; } - void setFile(CompileUnitDesc *U) { File = U; } + void setFile(CompileUnitDesc *U) { + File = static_cast(U); + } void setLine(unsigned L) { Line = L; } - void setType(TypeDesc *T) { TyDesc = T; } + void setType(TypeDesc *T) { + TyDesc = static_cast(T); + } void setIsStatic(bool IS) { IsStatic = IS; } void setIsDefinition(bool ID) { IsDefinition = ID; } From jlaskey at apple.com Fri Jun 16 08:14:28 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 08:14:28 -0500 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineDebugInfo.cpp Message-ID: <200606161314.IAA05182@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.62 -> 1.63 MachineDebugInfo.cpp updated: 1.41 -> 1.42 --- Log message: 1. Revise vector debug support. 2. Update docs for vector debug support and new version control. 3. Simplify serialization of DebugDescInfo subclasses. --- Diffs of the changes: (+24 -35) DwarfWriter.cpp | 16 +++++++++------- MachineDebugInfo.cpp | 43 +++++++++++++++---------------------------- 2 files changed, 24 insertions(+), 35 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.62 llvm/lib/CodeGen/DwarfWriter.cpp:1.63 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.62 Thu Jun 15 15:51:43 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Fri Jun 16 08:14:03 2006 @@ -1276,11 +1276,18 @@ NewType(Context, FromTy, Unit)); } } else if (CompositeTypeDesc *CompTy = dyn_cast(TyDesc)) { + // Fetch tag + unsigned Tag = CompTy->getTag(); + // Create specific DIE. - Slot = Ty = new DIE(CompTy->getTag()); + Slot = Ty = Tag == DW_TAG_vector_type ? new DIE(DW_TAG_array_type) : + new DIE(Tag); + std::vector &Elements = CompTy->getElements(); - switch (CompTy->getTag()) { + switch (Tag) { + case DW_TAG_vector_type: Ty->AddUInt(DW_AT_GNU_vector, DW_FORM_flag, 1); + // Fall thru case DW_TAG_array_type: { // Add element type. if (TypeDesc *FromTy = CompTy->getFromType()) { @@ -1288,11 +1295,6 @@ NewType(Context, FromTy, Unit)); } - // check for vector type - if (CompTy->isVector()) { - Ty->AddUInt(DW_AT_GNU_vector, DW_FORM_flag, 1); - } - // Don't emit size attribute. Size = 0; Index: llvm/lib/CodeGen/MachineDebugInfo.cpp diff -u llvm/lib/CodeGen/MachineDebugInfo.cpp:1.41 llvm/lib/CodeGen/MachineDebugInfo.cpp:1.42 --- llvm/lib/CodeGen/MachineDebugInfo.cpp:1.41 Thu Jun 15 15:51:43 2006 +++ llvm/lib/CodeGen/MachineDebugInfo.cpp Fri Jun 16 08:14:03 2006 @@ -459,7 +459,8 @@ /// GlobalVariable. Return DIIValid if operand is not an unsigned int. unsigned DebugInfoDesc::TagFromGlobal(GlobalVariable *GV) { ConstantUInt *C = getUIntOperand(GV, 0); - return C ? ((unsigned)C->getValue() & tag_mask) : (unsigned)DW_TAG_invalid; + return C ? ((unsigned)C->getValue() & ~LLVMDebugVersionMask) : + (unsigned)DW_TAG_invalid; } /// VersionFromGlobal - Returns the version number from a debug info @@ -467,7 +468,7 @@ /// int. unsigned DebugInfoDesc::VersionFromGlobal(GlobalVariable *GV) { ConstantUInt *C = getUIntOperand(GV, 0); - return C ? ((unsigned)C->getValue() >> version_shift) : + return C ? ((unsigned)C->getValue() & LLVMDebugVersionMask) : (unsigned)DW_TAG_invalid; } @@ -491,7 +492,8 @@ case DW_TAG_array_type: case DW_TAG_structure_type: case DW_TAG_union_type: - case DW_TAG_enumeration_type: return new CompositeTypeDesc(Tag); + case DW_TAG_enumeration_type: + case DW_TAG_vector_type: return new CompositeTypeDesc(Tag); case DW_TAG_subrange_type: return new SubrangeDesc(); case DW_TAG_enumerator: return new EnumeratorDesc(); case DW_TAG_return_variable: @@ -590,9 +592,7 @@ void AnchoredDesc::ApplyToFields(DIVisitor *Visitor) { DebugInfoDesc::ApplyToFields(Visitor); - DebugInfoDesc *Tmp = Anchor; - Visitor->Apply(Tmp); - Anchor = (AnchorDesc*)Tmp; + Visitor->Apply(Anchor); } //===----------------------------------------------------------------------===// @@ -673,9 +673,7 @@ Visitor->Apply(Context); Visitor->Apply(Name); - DebugInfoDesc* Tmp = File; - Visitor->Apply(Tmp); - File = (CompileUnitDesc*)Tmp; + Visitor->Apply(File); Visitor->Apply(Line); Visitor->Apply(Size); Visitor->Apply(Align); @@ -782,9 +780,7 @@ void DerivedTypeDesc::ApplyToFields(DIVisitor *Visitor) { TypeDesc::ApplyToFields(Visitor); - DebugInfoDesc* Tmp = FromType; - Visitor->Apply(Tmp); - FromType = (TypeDesc*)Tmp; + Visitor->Apply(FromType); } /// getDescString - Return a string used to compose global names and labels. @@ -817,7 +813,6 @@ CompositeTypeDesc::CompositeTypeDesc(unsigned T) : DerivedTypeDesc(T) -, IsVector(false) , Elements() {} @@ -829,6 +824,7 @@ case DW_TAG_structure_type: case DW_TAG_union_type: case DW_TAG_enumeration_type: + case DW_TAG_vector_type: return true; default: break; } @@ -838,9 +834,8 @@ /// ApplyToFields - Target the visitor to the fields of the CompositeTypeDesc. /// void CompositeTypeDesc::ApplyToFields(DIVisitor *Visitor) { - DerivedTypeDesc::ApplyToFields(Visitor); - - Visitor->Apply(IsVector); + DerivedTypeDesc::ApplyToFields(Visitor); + Visitor->Apply(Elements); } @@ -990,13 +985,9 @@ Visitor->Apply(Context); Visitor->Apply(Name); - DebugInfoDesc* Tmp1 = File; - Visitor->Apply(Tmp1); - File = (CompileUnitDesc*)Tmp1; + Visitor->Apply(File); Visitor->Apply(Line); - DebugInfoDesc* Tmp2 = TyDesc; - Visitor->Apply(Tmp2); - TyDesc = (TypeDesc*)Tmp2; + Visitor->Apply(TyDesc); } /// getDescString - Return a string used to compose global names and labels. @@ -1044,13 +1035,9 @@ Visitor->Apply(Context); Visitor->Apply(Name); - DebugInfoDesc* Tmp1 = File; - Visitor->Apply(Tmp1); - File = (CompileUnitDesc*)Tmp1; + Visitor->Apply(File); Visitor->Apply(Line); - DebugInfoDesc* Tmp2 = TyDesc; - Visitor->Apply(Tmp2); - TyDesc = (TypeDesc*)Tmp2; + Visitor->Apply(TyDesc); Visitor->Apply(IsStatic); Visitor->Apply(IsDefinition); } From jlaskey at apple.com Fri Jun 16 08:45:50 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 08:45:50 -0500 Subject: [llvm-commits] CVS: llvm/docs/SourceLevelDebugging.html Message-ID: <200606161345.IAA07855@zion.cs.uiuc.edu> Changes in directory llvm/docs: SourceLevelDebugging.html updated: 1.20 -> 1.21 --- Log message: add decimal form of LLVMDebugVersion --- Diffs of the changes: (+2 -2) SourceLevelDebugging.html | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/docs/SourceLevelDebugging.html diff -u llvm/docs/SourceLevelDebugging.html:1.20 llvm/docs/SourceLevelDebugging.html:1.21 --- llvm/docs/SourceLevelDebugging.html:1.20 Fri Jun 16 08:14:02 2006 +++ llvm/docs/SourceLevelDebugging.html Fri Jun 16 08:45:38 2006 @@ -301,7 +301,7 @@ loosely bound to the tag values of Dwarf information entries. However, that does not restrict the use of the information supplied to Dwarf targets. To facilitate versioning of debug information, the tag is augmented with the -current debug version (LLVMDebugVersion = 4 << 16 or 0x40000.)

    +current debug version (LLVMDebugVersion = 4 << 16 or 0x40000 or 262144.)

    The details of the various descriptors follow.

    @@ -1750,7 +1750,7 @@ Chris Lattner
    LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/06/16 13:14:02 $ + Last modified: $Date: 2006/06/16 13:45:38 $ From alenhar2 at cs.uiuc.edu Fri Jun 16 09:33:14 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Fri, 16 Jun 2006 09:33:14 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/LinkAllAnalyses.h CallTargets.h Message-ID: <200606161433.JAA08150@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis: LinkAllAnalyses.h updated: 1.5 -> 1.6 CallTargets.h (r1.1) removed --- Log message: move header --- Diffs of the changes: (+1 -1) LinkAllAnalyses.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/Analysis/LinkAllAnalyses.h diff -u llvm/include/llvm/Analysis/LinkAllAnalyses.h:1.5 llvm/include/llvm/Analysis/LinkAllAnalyses.h:1.6 --- llvm/include/llvm/Analysis/LinkAllAnalyses.h:1.5 Mon May 29 17:58:38 2006 +++ llvm/include/llvm/Analysis/LinkAllAnalyses.h Fri Jun 16 09:33:00 2006 @@ -22,7 +22,7 @@ #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/DataStructure/DataStructure.h" -#include "llvm/Analysis/CallTargets.h" +#include "llvm/Analysis/DataStructure/CallTargets.h" #include "llvm/Function.h" #include From alenhar2 at cs.uiuc.edu Fri Jun 16 09:33:14 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Fri, 16 Jun 2006 09:33:14 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Analysis/DataStructure/CallTargets.h Message-ID: <200606161433.JAA08152@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Analysis/DataStructure: CallTargets.h added (r1.1) --- Log message: move header --- Diffs of the changes: (+54 -0) CallTargets.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 54 insertions(+) Index: llvm/include/llvm/Analysis/DataStructure/CallTargets.h diff -c /dev/null llvm/include/llvm/Analysis/DataStructure/CallTargets.h:1.1 *** /dev/null Fri Jun 16 09:33:10 2006 --- llvm/include/llvm/Analysis/DataStructure/CallTargets.h Fri Jun 16 09:33:00 2006 *************** *** 0 **** --- 1,54 ---- + //=- llvm/Analysis/CallTargets.h - Resolve Indirect Call Targets --*- C++ -*-=// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by the LLVM research group and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This pass uses DSA to map targets of all calls, and reports on if it + // thinks it knows all targets of a given call. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_ANALYSIS_CALLTARGETS_H + #define LLVM_ANALYSIS_CALLTARGETS_H + + #include "llvm/Pass.h" + #include "llvm/Support/CallSite.h" + + #include + #include + + namespace llvm { + + class CallTargetFinder : public ModulePass { + std::map > IndMap; + std::set CompleteSites; + std::list AllSites; + + void findIndTargets(Module &M); + public: + virtual bool runOnModule(Module &M); + + virtual void getAnalysisUsage(AnalysisUsage &AU) const; + + virtual void print(std::ostream &O, const Module *M) const; + + // Given a CallSite, get an iterator of callees + std::vector::iterator begin(CallSite cs); + std::vector::iterator end(CallSite cs); + + // Iterate over CallSites in program + std::list::iterator cs_begin(); + std::list::iterator cs_end(); + + // Do we think we have complete knowledge of this site? + // That is, do we think there are no missing callees + bool isComplete(CallSite cs) const; + }; + + } + + #endif From alenhar2 at cs.uiuc.edu Fri Jun 16 09:34:05 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Fri, 16 Jun 2006 09:34:05 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/CallTargets.cpp Message-ID: <200606161434.JAA08185@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: CallTargets.cpp updated: 1.1 -> 1.2 --- Log message: move header --- Diffs of the changes: (+1 -1) CallTargets.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Analysis/DataStructure/CallTargets.cpp diff -u llvm/lib/Analysis/DataStructure/CallTargets.cpp:1.1 llvm/lib/Analysis/DataStructure/CallTargets.cpp:1.2 --- llvm/lib/Analysis/DataStructure/CallTargets.cpp:1.1 Mon May 29 18:39:48 2006 +++ llvm/lib/Analysis/DataStructure/CallTargets.cpp Fri Jun 16 09:33:53 2006 @@ -21,7 +21,7 @@ #include "llvm/Instructions.h" #include "llvm/Analysis/DataStructure/DataStructure.h" #include "llvm/Analysis/DataStructure/DSGraph.h" -#include "llvm/Analysis/CallTargets.h" +#include "llvm/Analysis/DataStructure/CallTargets.h" #include "llvm/ADT/Statistic.h" #include #include "llvm/Constants.h" From alenhar2 at cs.uiuc.edu Fri Jun 16 09:43:49 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Fri, 16 Jun 2006 09:43:49 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp Message-ID: <200606161443.JAA08249@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis/DataStructure: CompleteBottomUp.cpp updated: 1.34 -> 1.35 --- Log message: Add a error message to cbu to match bu --- Diffs of the changes: (+7 -1) CompleteBottomUp.cpp | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletion(-) Index: llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp diff -u llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp:1.34 llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp:1.35 --- llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp:1.34 Sun Jan 22 17:19:18 2006 +++ llvm/lib/Analysis/DataStructure/CompleteBottomUp.cpp Fri Jun 16 09:43:36 2006 @@ -56,8 +56,14 @@ } for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (!I->isExternal() && !DSInfo.count(I)) + if (!I->isExternal() && !DSInfo.count(I)) { +#ifndef NDEBUG + if (MainFunc) + std::cerr << "*** CBU: Function unreachable from main: " + << I->getName() << "\n"; +#endif calculateSCCGraphs(getOrCreateGraph(*I), Stack, NextID, ValMap); + } GlobalsGraph->removeTriviallyDeadNodes(); From lattner at cs.uiuc.edu Fri Jun 16 11:37:02 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 11:37:02 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/ret_arg5.ll Message-ID: <200606161637.LAA09035@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: ret_arg5.ll updated: 1.1 -> 1.2 --- Log message: This test isn't implemented yet --- Diffs of the changes: (+1 -0) ret_arg5.ll | 1 + 1 files changed, 1 insertion(+) Index: llvm/test/Regression/CodeGen/ARM/ret_arg5.ll diff -u llvm/test/Regression/CodeGen/ARM/ret_arg5.ll:1.1 llvm/test/Regression/CodeGen/ARM/ret_arg5.ll:1.2 --- llvm/test/Regression/CodeGen/ARM/ret_arg5.ll:1.1 Thu Jun 1 17:01:25 2006 +++ llvm/test/Regression/CodeGen/ARM/ret_arg5.ll Fri Jun 16 11:36:50 2006 @@ -1,4 +1,5 @@ ; RUN: llvm-as < %s | llc -march=arm +; XFAIL: * int %test(int %a1, int %a2, int %a3, int %a4, int %a5) { ret int %a5 } From jlaskey at apple.com Fri Jun 16 11:50:37 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 11:50:37 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CFrontend/2005-12-04-DeclarationLineNumbers.c 2006-01-13-Includes.c Message-ID: <200606161650.LAA09134@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CFrontend: 2005-12-04-DeclarationLineNumbers.c updated: 1.3 -> 1.4 2006-01-13-Includes.c updated: 1.3 -> 1.4 --- Log message: debug info is alive again --- Diffs of the changes: (+0 -4) 2005-12-04-DeclarationLineNumbers.c | 2 -- 2006-01-13-Includes.c | 2 -- 2 files changed, 4 deletions(-) Index: llvm/test/Regression/CFrontend/2005-12-04-DeclarationLineNumbers.c diff -u llvm/test/Regression/CFrontend/2005-12-04-DeclarationLineNumbers.c:1.3 llvm/test/Regression/CFrontend/2005-12-04-DeclarationLineNumbers.c:1.4 --- llvm/test/Regression/CFrontend/2005-12-04-DeclarationLineNumbers.c:1.3 Thu Apr 13 16:19:13 2006 +++ llvm/test/Regression/CFrontend/2005-12-04-DeclarationLineNumbers.c Fri Jun 16 11:50:24 2006 @@ -21,5 +21,3 @@ return s0734 + s1625; } -// FIXME: PR735 -// XFAIL: llvmgcc4 Index: llvm/test/Regression/CFrontend/2006-01-13-Includes.c diff -u llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.3 llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.4 --- llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.3 Thu Apr 13 12:35:36 2006 +++ llvm/test/Regression/CFrontend/2006-01-13-Includes.c Fri Jun 16 11:50:24 2006 @@ -1,6 +1,4 @@ // RUN: %llvmgcc %s -g -S -o - | gccas | llvm-dis | grep "test/Regression/CFrontend" -// XFAIL: llvmgcc4 -// PR676 #include From jlaskey at apple.com Fri Jun 16 11:57:55 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 11:57:55 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CFrontend/2006-01-13-Includes.c Message-ID: <200606161657.LAA09250@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CFrontend: 2006-01-13-Includes.c updated: 1.4 -> 1.5 --- Log message: PR# not associated with XFAIL --- Diffs of the changes: (+1 -0) 2006-01-13-Includes.c | 1 + 1 files changed, 1 insertion(+) Index: llvm/test/Regression/CFrontend/2006-01-13-Includes.c diff -u llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.4 llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.5 --- llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.4 Fri Jun 16 11:50:24 2006 +++ llvm/test/Regression/CFrontend/2006-01-13-Includes.c Fri Jun 16 11:57:43 2006 @@ -1,4 +1,5 @@ // RUN: %llvmgcc %s -g -S -o - | gccas | llvm-dis | grep "test/Regression/CFrontend" +// PR676 #include From lattner at cs.uiuc.edu Fri Jun 16 12:20:46 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 12:20:46 -0500 Subject: [llvm-commits] CVS: llvm/docs/GettingStarted.html Message-ID: <200606161720.MAA09412@zion.cs.uiuc.edu> Changes in directory llvm/docs: GettingStarted.html updated: 1.132 -> 1.133 --- Log message: apple's compiler works too --- Diffs of the changes: (+4 -4) GettingStarted.html | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) Index: llvm/docs/GettingStarted.html diff -u llvm/docs/GettingStarted.html:1.132 llvm/docs/GettingStarted.html:1.133 --- llvm/docs/GettingStarted.html:1.132 Thu Apr 20 13:46:45 2006 +++ llvm/docs/GettingStarted.html Fri Jun 16 12:20:33 2006 @@ -486,9 +486,9 @@

    LLVM is very demanding of the host C++ compiler, and as such tends to expose bugs in the compiler. In particular, several versions of GCC crash when trying -to compile LLVM. We routinely use GCC 3.3.3 and GCC 3.4.0 and have had success -with them (however, see below). Other versions of GCC will probably -work as well. GCC versions listed +to compile LLVM. We routinely use GCC 3.3.3, 3.4.0, and Apple 4.0.1 +successfully with them (however, see below). Other versions of GCC will +probably work as well. GCC versions listed here are known to not work. If you are using one of these versions, please try to upgrade your GCC to something more recent. If you run into a problem with a version of GCC not listed here, please let @@ -1536,7 +1536,7 @@ Chris Lattner
    Reid Spencer
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/04/20 18:46:45 $ + Last modified: $Date: 2006/06/16 17:20:33 $ From lattner at cs.uiuc.edu Fri Jun 16 12:34:25 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 12:34:25 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC.td PPCISelLowering.cpp PPCSubtarget.cpp PPCSubtarget.h Message-ID: <200606161734.MAA09522@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC.td updated: 1.17 -> 1.18 PPCISelLowering.cpp updated: 1.188 -> 1.189 PPCSubtarget.cpp updated: 1.20 -> 1.21 PPCSubtarget.h updated: 1.14 -> 1.15 --- Log message: Rename some subtarget features. A CPU now can *have* 64-bit instructions, can in 32-bit mode we can choose to optionally *use* 64-bit registers. --- Diffs of the changes: (+12 -12) PPC.td | 6 +++--- PPCISelLowering.cpp | 6 +++--- PPCSubtarget.cpp | 4 ++-- PPCSubtarget.h | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) Index: llvm/lib/Target/PowerPC/PPC.td diff -u llvm/lib/Target/PowerPC/PPC.td:1.17 llvm/lib/Target/PowerPC/PPC.td:1.18 --- llvm/lib/Target/PowerPC/PPC.td:1.17 Wed May 17 19:12:25 2006 +++ llvm/lib/Target/PowerPC/PPC.td Fri Jun 16 12:34:12 2006 @@ -19,10 +19,10 @@ // PowerPC Subtarget features. // -def Feature64Bit : SubtargetFeature<"64bit","Is64Bit", "true", +def Feature64Bit : SubtargetFeature<"64bit","Has64BitSupport", "true", "Enable 64-bit instructions">; -def Feature64BitRegs : SubtargetFeature<"64bitregs","Has64BitRegs", "true", - "Enable 64-bit registers [beta]">; +def Feature64BitRegs : SubtargetFeature<"64bitregs","Use64BitRegs", "true", + "Enable 64-bit registers usage for ppc32 [beta]">; def FeatureAltivec : SubtargetFeature<"altivec","HasAltivec", "true", "Enable Altivec instructions">; def FeatureGPUL : SubtargetFeature<"gpul","IsGigaProcessor", "true", Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.188 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.189 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.188 Thu Jun 15 03:17:07 2006 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Fri Jun 16 12:34:12 2006 @@ -146,7 +146,7 @@ // We want to custom lower some of our intrinsics. setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom); - if (TM.getSubtarget().is64Bit()) { + if (TM.getSubtarget().has64BitSupport()) { // They also have instructions for converting between i64 and fp. setOperationAction(ISD::FP_TO_SINT, MVT::i64, Custom); setOperationAction(ISD::SINT_TO_FP, MVT::i64, Custom); @@ -163,7 +163,7 @@ setOperationAction(ISD::FP_TO_UINT, MVT::i32, Expand); } - if (TM.getSubtarget().has64BitRegs()) { + if (TM.getSubtarget().use64BitRegs()) { // 64 bit PowerPC implementations can support i64 types directly addRegisterClass(MVT::i64, PPC::G8RCRegisterClass); // BUILD_PAIR can't be handled natively, and should be expanded to shl/or @@ -2227,7 +2227,7 @@ switch (N->getOpcode()) { default: break; case ISD::SINT_TO_FP: - if (TM.getSubtarget().is64Bit()) { + if (TM.getSubtarget().has64BitSupport()) { if (N->getOperand(0).getOpcode() == ISD::FP_TO_SINT) { // Turn (sint_to_fp (fp_to_sint X)) -> fctidz/fcfid without load/stores. // We allow the src/dst to be either f32/f64, but the intermediate Index: llvm/lib/Target/PowerPC/PPCSubtarget.cpp diff -u llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.20 llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.21 --- llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.20 Thu Jun 15 20:37:27 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.cpp Fri Jun 16 12:34:12 2006 @@ -73,8 +73,8 @@ : StackAlignment(16) , InstrItins() , IsGigaProcessor(false) - , Is64Bit(false) - , Has64BitRegs(false) + , Has64BitSupport(false) + , Use64BitRegs(false) , HasAltivec(false) , HasFSQRT(false) , HasSTFIWX(false) Index: llvm/lib/Target/PowerPC/PPCSubtarget.h diff -u llvm/lib/Target/PowerPC/PPCSubtarget.h:1.14 llvm/lib/Target/PowerPC/PPCSubtarget.h:1.15 --- llvm/lib/Target/PowerPC/PPCSubtarget.h:1.14 Thu Jun 15 20:37:27 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.h Fri Jun 16 12:34:12 2006 @@ -33,8 +33,8 @@ /// Used by the ISel to turn in optimizations for POWER4-derived architectures bool IsGigaProcessor; - bool Is64Bit; - bool Has64BitRegs; + bool Has64BitSupport; + bool Use64BitRegs; bool HasAltivec; bool HasFSQRT; bool HasSTFIWX; @@ -66,12 +66,12 @@ bool hasFSQRT() const { return HasFSQRT; } bool hasSTFIWX() const { return HasSTFIWX; } - bool has64BitRegs() const { return Has64BitRegs; } + bool use64BitRegs() const { return Use64BitRegs; } bool hasAltivec() const { return HasAltivec; } bool isAIX() const { return IsAIX; } bool isDarwin() const { return IsDarwin; } - bool is64Bit() const { return Is64Bit; } + bool has64BitSupport() const { return Has64BitSupport; } bool isGigaProcessor() const { return IsGigaProcessor; } }; } // End llvm namespace From lattner at cs.uiuc.edu Fri Jun 16 12:50:24 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 12:50:24 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCSubtarget.cpp PPCSubtarget.h Message-ID: <200606161750.MAA09710@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCSubtarget.cpp updated: 1.21 -> 1.22 PPCSubtarget.h updated: 1.15 -> 1.16 --- Log message: Document the subtarget features better, make sure that 64-bit mode, 64-bit support, and 64-bit register use are all consistent with each other. Add a new "IsPPC" feature, to distinguish ppc32 vs ppc64 targets, use this to configure TargetData differently. This not makes ppc64 blow up on lots of stuff :) --- Diffs of the changes: (+42 -6) PPCSubtarget.cpp | 21 +++++++++++++++++++++ PPCSubtarget.h | 27 +++++++++++++++++++++------ 2 files changed, 42 insertions(+), 6 deletions(-) Index: llvm/lib/Target/PowerPC/PPCSubtarget.cpp diff -u llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.21 llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.22 --- llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.21 Fri Jun 16 12:34:12 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.cpp Fri Jun 16 12:50:12 2006 @@ -16,6 +16,7 @@ #include "llvm/Module.h" #include "llvm/Support/CommandLine.h" #include "PPCGenSubtarget.inc" +#include using namespace llvm; PPCTargetEnum llvm::PPCTarget = TargetDefault; @@ -75,6 +76,7 @@ , IsGigaProcessor(false) , Has64BitSupport(false) , Use64BitRegs(false) + , IsPPC64(is64Bit) , HasAltivec(false) , HasFSQRT(false) , HasSTFIWX(false) @@ -90,6 +92,25 @@ // Parse features string. ParseSubtargetFeatures(FS, CPU); + // If we are generating code for ppc64, verify that options make sense. + if (is64Bit) { + if (!has64BitSupport()) { + std::cerr << "PPC: Generation of 64-bit code for a 32-bit processor " + "requested. Ignoring 32-bit processor feature.\n"; + Has64BitSupport = true; + // Silently force 64-bit register use on ppc64. + Use64BitRegs = true; + } + } + + // If the user requested use of 64-bit regs, but the cpu selected doesn't + // support it, warn and ignore. + if (use64BitRegs() && !has64BitSupport()) { + std::cerr << "PPC: 64-bit registers requested on CPU without support. " + "Disabling 64-bit register use.\n"; + Use64BitRegs = false; + } + // Set the boolean corresponding to the current target triple, or the default // if one cannot be determined, to true. const std::string& TT = M.getTargetTriple(); Index: llvm/lib/Target/PowerPC/PPCSubtarget.h diff -u llvm/lib/Target/PowerPC/PPCSubtarget.h:1.15 llvm/lib/Target/PowerPC/PPCSubtarget.h:1.16 --- llvm/lib/Target/PowerPC/PPCSubtarget.h:1.15 Fri Jun 16 12:34:12 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.h Fri Jun 16 12:50:12 2006 @@ -35,6 +35,7 @@ bool IsGigaProcessor; bool Has64BitSupport; bool Use64BitRegs; + bool IsPPC64; bool HasAltivec; bool HasFSQRT; bool HasSTFIWX; @@ -58,21 +59,35 @@ /// getInstrItins - Return the instruction itineraies based on subtarget /// selection. const InstrItineraryData getInstrItineraryData() const { return InstrItins; } - + + /// getTargetDataString - Return the pointer size and type alignment + /// properties of this subtarget. const char *getTargetDataString() const { - // FIXME: Make is64Bit be for the processor, not the target. - return true ? "E-p:32:32-d:32-l:32" : "E-p:64:64-d:32-l:32"; + return isPPC64() ? "E-p:64:64-d:32-l:32" : "E-p:32:32-d:32-l:32"; } + /// isPPC64 - Return true if we are generating code for 64-bit pointer mode. + /// + bool isPPC64() const { return IsPPC64; } + + /// has64BitSupport - Return true if the selected CPU supports 64-bit + /// instructions, regardless of whether we are in 32-bit or 64-bit mode. + bool has64BitSupport() const { return Has64BitSupport; } + + /// use64BitRegs - Return true if in 64-bit mode or if we should use 64-bit + /// registers in 32-bit mode when possible. This can only true if + /// has64BitSupport() returns true. + bool use64BitRegs() const { return Use64BitRegs; } + + + // Specific obvious features. bool hasFSQRT() const { return HasFSQRT; } bool hasSTFIWX() const { return HasSTFIWX; } - bool use64BitRegs() const { return Use64BitRegs; } bool hasAltivec() const { return HasAltivec; } + bool isGigaProcessor() const { return IsGigaProcessor; } bool isAIX() const { return IsAIX; } bool isDarwin() const { return IsDarwin; } - bool has64BitSupport() const { return Has64BitSupport; } - bool isGigaProcessor() const { return IsGigaProcessor; } }; } // End llvm namespace From lattner at cs.uiuc.edu Fri Jun 16 13:08:50 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:08:50 -0500 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp Interpreter.h Message-ID: <200606161808.NAA09904@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine/Interpreter: Interpreter.cpp updated: 1.30 -> 1.31 Interpreter.h updated: 1.74 -> 1.75 --- Log message: Simplify interpreter construction. --- Diffs of the changes: (+11 -21) Interpreter.cpp | 30 ++++++++++-------------------- Interpreter.h | 2 +- 2 files changed, 11 insertions(+), 21 deletions(-) Index: llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp diff -u llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp:1.30 llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp:1.31 --- llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp:1.30 Tue May 2 20:29:56 2006 +++ llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp Fri Jun 16 13:08:38 2006 @@ -39,37 +39,27 @@ return 0; // error materializing the module. } - bool isLittleEndian = false; - switch (M->getEndianness()) { - case Module::LittleEndian: isLittleEndian = true; break; - case Module::BigEndian: isLittleEndian = false; break; - case Module::AnyPointerSize: + if (M->getEndianness() == Module::AnyEndianness) { int Test = 0; *(char*)&Test = 1; // Return true if the host is little endian - isLittleEndian = (Test == 1); - break; + bool isLittleEndian = (Test == 1); + M->setEndianness(isLittleEndian ? Module::LittleEndian : Module::BigEndian); } - bool isLongPointer = false; - switch (M->getPointerSize()) { - case Module::Pointer32: isLongPointer = false; break; - case Module::Pointer64: isLongPointer = true; break; - case Module::AnyPointerSize: - isLongPointer = (sizeof(void*) == 8); // Follow host - break; + if (M->getPointerSize() == Module::AnyPointerSize) { + // Follow host. + bool Ptr64 = sizeof(void*) == 8; + M->setPointerSize(Ptr64 ? Module::Pointer64 : Module::Pointer32); } - return new Interpreter(M, isLittleEndian, isLongPointer); + return new Interpreter(M); } //===----------------------------------------------------------------------===// // Interpreter ctor - Initialize stuff // -Interpreter::Interpreter(Module *M, bool isLittleEndian, bool isLongPointer) - : ExecutionEngine(M), - TD("lli", isLittleEndian, isLongPointer ? 8 : 4, isLongPointer ? 8 : 4, - isLongPointer ? 8 : 4) { - +Interpreter::Interpreter(Module *M) : ExecutionEngine(M), TD("lli", M) { + memset(&ExitValue, 0, sizeof(ExitValue)); setTargetData(&TD); // Initialize the "backend" Index: llvm/lib/ExecutionEngine/Interpreter/Interpreter.h diff -u llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.74 llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.75 --- llvm/lib/ExecutionEngine/Interpreter/Interpreter.h:1.74 Wed Mar 22 23:22:51 2006 +++ llvm/lib/ExecutionEngine/Interpreter/Interpreter.h Fri Jun 16 13:08:38 2006 @@ -94,7 +94,7 @@ std::vector AtExitHandlers; public: - Interpreter(Module *M, bool isLittleEndian, bool isLongPointer); + Interpreter(Module *M); ~Interpreter(); /// runAtExitHandlers - Run any functions registered by the program's calls to From lattner at cs.uiuc.edu Fri Jun 16 13:09:40 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:09:40 -0500 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp Message-ID: <200606161809.NAA09941@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine/JIT: JITEmitter.cpp updated: 1.103 -> 1.104 --- Log message: Only count instructions as code size, not constant pools and other per-function stuff. --- Diffs of the changes: (+10 -6) JITEmitter.cpp | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) Index: llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp diff -u llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp:1.103 llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp:1.104 --- llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp:1.103 Thu Jun 1 12:29:22 2006 +++ llvm/lib/ExecutionEngine/JIT/JITEmitter.cpp Fri Jun 16 13:09:26 2006 @@ -760,8 +760,14 @@ emitJumpTableInfo(F.getJumpTableInfo()); - MemMgr.endFunctionBody(F.getFunction(), BufferBegin, CurBufferPtr); - NumBytes += getCurrentPCOffset(); + // FnStart is the start of the text, not the start of the constant pool and + // other per-function data. + unsigned char *FnStart = + (unsigned char *)TheJIT->getPointerToGlobalIfAvailable(F.getFunction()); + unsigned char *FnEnd = CurBufferPtr; + + MemMgr.endFunctionBody(F.getFunction(), BufferBegin, FnEnd); + NumBytes += FnEnd-FnStart; if (!Relocations.empty()) { NumRelos += Relocations.size(); @@ -815,11 +821,9 @@ } } - DEBUG(void *FnStart = TheJIT->getPointerToGlobalIfAvailable(F.getFunction()); - char *FnEnd = (char*)getCurrentPCOffset(); - std::cerr << "JIT: Finished CodeGen of [" << FnStart + DEBUG(std::cerr << "JIT: Finished CodeGen of [" << (void*)FnStart << "] Function: " << F.getFunction()->getName() - << ": " << (FnEnd-(char*)FnStart) << " bytes of text, " + << ": " << (FnEnd-FnStart) << " bytes of text, " << Relocations.size() << " relocations\n"); Relocations.clear(); return false; From lattner at cs.uiuc.edu Fri Jun 16 13:11:20 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:11:20 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetData.h Message-ID: <200606161811.NAA10039@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetData.h updated: 1.38 -> 1.39 --- Log message: Remove ctor with each piece specifyable (which causes overload ambiguities), add a new init method. --- Diffs of the changes: (+11 -10) TargetData.h | 21 +++++++++++---------- 1 files changed, 11 insertions(+), 10 deletions(-) Index: llvm/include/llvm/Target/TargetData.h diff -u llvm/include/llvm/Target/TargetData.h:1.38 llvm/include/llvm/Target/TargetData.h:1.39 --- llvm/include/llvm/Target/TargetData.h:1.38 Sat May 20 18:28:54 2006 +++ llvm/include/llvm/Target/TargetData.h Fri Jun 16 13:11:07 2006 @@ -45,20 +45,16 @@ unsigned char PointerAlignment; // Defaults to 8 bytes public: - TargetData(const std::string &TargetName = "", - bool LittleEndian = false, - unsigned char PtrSize = 8, - unsigned char PtrAl = 8, unsigned char DoubleAl = 8, - unsigned char FloatAl = 4, unsigned char LongAl = 8, - unsigned char IntAl = 4, unsigned char ShortAl = 2, - unsigned char ByteAl = 1, unsigned char BoolAl = 1); - /// Constructs a TargetData from a string of the following format: /// "E-p:64:64-d:64-f:32-l:64-i:32-s:16-b:8-B:8" /// The above string is considered the default, and any values not specified /// in the string will be assumed to be as above. - TargetData(const std::string &TargetName, - const std::string &TargetDescription); + TargetData(const std::string &TargetName = "", + const std::string &TargetDescription = "") { + assert(!TargetName.empty() && + "ERROR: Tool did not specify a target data to use!"); + init(TargetDescription); + } // Copy constructor TargetData (const TargetData &TD) : @@ -78,6 +74,11 @@ TargetData(const std::string &ToolName, const Module *M); ~TargetData(); // Not virtual, do not subclass this class + /// init - Specify configuration if not available at ctor time. + /// + void init(const std::string &TargetDescription); + + /// Target endianness... bool isLittleEndian() const { return LittleEndian; } bool isBigEndian() const { return !LittleEndian; } From lattner at cs.uiuc.edu Fri Jun 16 13:11:38 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:11:38 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetData.cpp Message-ID: <200606161811.NAA10072@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetData.cpp updated: 1.68 -> 1.69 --- Log message: Remove ctor with each piece specifyable (which causes overload ambiguities), add a new init method. --- Diffs of the changes: (+1 -32) TargetData.cpp | 33 +-------------------------------- 1 files changed, 1 insertion(+), 32 deletions(-) Index: llvm/lib/Target/TargetData.cpp diff -u llvm/lib/Target/TargetData.cpp:1.68 llvm/lib/Target/TargetData.cpp:1.69 --- llvm/lib/Target/TargetData.cpp:1.68 Sat May 20 18:28:54 2006 +++ llvm/lib/Target/TargetData.cpp Fri Jun 16 13:11:26 2006 @@ -95,38 +95,7 @@ // TargetData Class Implementation //===----------------------------------------------------------------------===// -TargetData::TargetData(const std::string &TargetName, - bool isLittleEndian, unsigned char PtrSize, - unsigned char PtrAl, unsigned char DoubleAl, - unsigned char FloatAl, unsigned char LongAl, - unsigned char IntAl, unsigned char ShortAl, - unsigned char ByteAl, unsigned char BoolAl) { - - // If this assert triggers, a pass "required" TargetData information, but the - // top level tool did not provide one for it. We do not want to default - // construct, or else we might end up using a bad endianness or pointer size! - // - assert(!TargetName.empty() && - "ERROR: Tool did not specify a target data to use!"); - - LittleEndian = isLittleEndian; - PointerSize = PtrSize; - PointerAlignment = PtrAl; - DoubleAlignment = DoubleAl; - FloatAlignment = FloatAl; - LongAlignment = LongAl; - IntAlignment = IntAl; - ShortAlignment = ShortAl; - ByteAlignment = ByteAl; - BoolAlignment = BoolAl; -} - -TargetData::TargetData(const std::string &TargetName, - const std::string &TargetDescription) { - assert(!TargetName.empty() && - "ERROR: Tool did not specify a target data to use!"); - - +void TargetData::init(const std::string &TargetDescription) { std::string temp = TargetDescription; LittleEndian = false; From lattner at cs.uiuc.edu Fri Jun 16 13:22:05 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:22:05 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetData.h Message-ID: <200606161822.NAA10213@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetData.h updated: 1.39 -> 1.40 --- Log message: Simplify the targetdata ctor by not passing in a "targetname" which is always ignored. --- Diffs of the changes: (+14 -8) TargetData.h | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) Index: llvm/include/llvm/Target/TargetData.h diff -u llvm/include/llvm/Target/TargetData.h:1.39 llvm/include/llvm/Target/TargetData.h:1.40 --- llvm/include/llvm/Target/TargetData.h:1.39 Fri Jun 16 13:11:07 2006 +++ llvm/include/llvm/Target/TargetData.h Fri Jun 16 13:21:53 2006 @@ -45,19 +45,26 @@ unsigned char PointerAlignment; // Defaults to 8 bytes public: + /// Default ctor - This has to exist, because this is a pass, but it should + /// never be used. + TargetData() { + assert(0 && "ERROR: Bad TargetData ctor used. " + "Tool did not specify a TargetData to use?"); + abort(); + } + /// Constructs a TargetData from a string of the following format: /// "E-p:64:64-d:64-f:32-l:64-i:32-s:16-b:8-B:8" /// The above string is considered the default, and any values not specified /// in the string will be assumed to be as above. - TargetData(const std::string &TargetName = "", - const std::string &TargetDescription = "") { - assert(!TargetName.empty() && - "ERROR: Tool did not specify a target data to use!"); + TargetData(const std::string &TargetDescription) { init(TargetDescription); } - - // Copy constructor - TargetData (const TargetData &TD) : + + /// Initialize target data from properties stored in the module. + TargetData(const Module *M); + + TargetData(const TargetData &TD) : ImmutablePass(), LittleEndian(TD.isLittleEndian()), BoolAlignment(TD.getBoolAlignment()), @@ -71,7 +78,6 @@ PointerAlignment(TD.getPointerAlignment()) { } - TargetData(const std::string &ToolName, const Module *M); ~TargetData(); // Not virtual, do not subclass this class /// init - Specify configuration if not available at ctor time. From lattner at cs.uiuc.edu Fri Jun 16 13:23:08 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:08 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMTargetMachine.cpp Message-ID: <200606161823.NAA10289@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMTargetMachine.cpp updated: 1.2 -> 1.3 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -3) ARMTargetMachine.cpp | 4 +--- 1 files changed, 1 insertion(+), 3 deletions(-) Index: llvm/lib/Target/ARM/ARMTargetMachine.cpp diff -u llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.2 llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.3 --- llvm/lib/Target/ARM/ARMTargetMachine.cpp:1.2 Fri May 19 19:24:56 2006 +++ llvm/lib/Target/ARM/ARMTargetMachine.cpp Fri Jun 16 13:22:52 2006 @@ -32,9 +32,7 @@ /// TargetMachine ctor - Create an ILP32 architecture model /// ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS) - : TargetMachine("ARM"), - DataLayout(std::string("ARM"), std::string("E-p:32:32")), - InstrInfo(), + : TargetMachine("ARM"), DataLayout("E-p:32:32"), FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) { } From lattner at cs.uiuc.edu Fri Jun 16 13:23:10 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:10 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/CBackend/CTargetMachine.h Message-ID: <200606161823.NAA10295@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/CBackend: CTargetMachine.h updated: 1.13 -> 1.14 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -2) CTargetMachine.h | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/Target/CBackend/CTargetMachine.h diff -u llvm/lib/Target/CBackend/CTargetMachine.h:1.13 llvm/lib/Target/CBackend/CTargetMachine.h:1.14 --- llvm/lib/Target/CBackend/CTargetMachine.h:1.13 Fri May 12 01:33:48 2006 +++ llvm/lib/Target/CBackend/CTargetMachine.h Fri Jun 16 13:22:52 2006 @@ -23,8 +23,7 @@ const TargetData DataLayout; // Calculates type size & alignment CTargetMachine(const Module &M, const std::string &FS) - : TargetMachine("CBackend", M), - DataLayout("CBackend", &M) {} + : TargetMachine("CBackend", M), DataLayout(&M) {} // This is the only thing that actually does anything here. virtual bool addPassesToEmitFile(PassManager &PM, std::ostream &Out, From lattner at cs.uiuc.edu Fri Jun 16 13:23:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86TargetMachine.cpp Message-ID: <200606161823.NAA10317@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86TargetMachine.cpp updated: 1.116 -> 1.117 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -1) X86TargetMachine.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.116 llvm/lib/Target/X86/X86TargetMachine.cpp:1.117 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.116 Tue May 30 16:45:53 2006 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Fri Jun 16 13:22:52 2006 @@ -70,7 +70,7 @@ X86TargetMachine::X86TargetMachine(const Module &M, const std::string &FS) : TargetMachine("X86"), Subtarget(M, FS), - DataLayout(std::string("X86"), std::string("e-p:32:32-d:32-l:32")), + DataLayout("e-p:32:32-d:32-l:32"), FrameInfo(TargetFrameInfo::StackGrowsDown, Subtarget.getStackAlignment(), -4), InstrInfo(*this), JITInfo(*this), TLInfo(*this) { From lattner at cs.uiuc.edu Fri Jun 16 13:23:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Sparc/SparcTargetMachine.cpp Message-ID: <200606161823.NAA10322@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Sparc: SparcTargetMachine.cpp updated: 1.47 -> 1.48 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -2) SparcTargetMachine.cpp | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/Target/Sparc/SparcTargetMachine.cpp diff -u llvm/lib/Target/Sparc/SparcTargetMachine.cpp:1.47 llvm/lib/Target/Sparc/SparcTargetMachine.cpp:1.48 --- llvm/lib/Target/Sparc/SparcTargetMachine.cpp:1.47 Fri May 19 19:49:30 2006 +++ llvm/lib/Target/Sparc/SparcTargetMachine.cpp Fri Jun 16 13:22:52 2006 @@ -31,8 +31,7 @@ /// SparcTargetMachine ctor - Create an ILP32 architecture model /// SparcTargetMachine::SparcTargetMachine(const Module &M, const std::string &FS) - : TargetMachine("Sparc"), - DataLayout(std::string("Sparc"), std::string("E-p:32:32")), + : TargetMachine("Sparc"), DataLayout("E-p:32:32"), Subtarget(M, FS), InstrInfo(Subtarget), FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) { } From lattner at cs.uiuc.edu Fri Jun 16 13:23:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaTargetMachine.cpp Message-ID: <200606161823.NAA10320@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaTargetMachine.cpp updated: 1.25 -> 1.26 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -2) AlphaTargetMachine.cpp | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/Target/Alpha/AlphaTargetMachine.cpp diff -u llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.25 llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.26 --- llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.25 Fri May 19 19:24:56 2006 +++ llvm/lib/Target/Alpha/AlphaTargetMachine.cpp Fri Jun 16 13:22:52 2006 @@ -54,8 +54,7 @@ } AlphaTargetMachine::AlphaTargetMachine(const Module &M, const std::string &FS) - : TargetMachine("alpha"), - DataLayout(std::string("alpha"), std::string("e")), + : TargetMachine("alpha"), DataLayout("e"), FrameInfo(TargetFrameInfo::StackGrowsDown, 16, 0), JITInfo(*this), Subtarget(M, FS) From lattner at cs.uiuc.edu Fri Jun 16 13:23:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64TargetMachine.cpp Message-ID: <200606161823.NAA10338@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64TargetMachine.cpp updated: 1.16 -> 1.17 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -1) IA64TargetMachine.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/IA64/IA64TargetMachine.cpp diff -u llvm/lib/Target/IA64/IA64TargetMachine.cpp:1.16 llvm/lib/Target/IA64/IA64TargetMachine.cpp:1.17 --- llvm/lib/Target/IA64/IA64TargetMachine.cpp:1.16 Fri May 19 19:24:56 2006 +++ llvm/lib/Target/IA64/IA64TargetMachine.cpp Fri Jun 16 13:22:52 2006 @@ -76,7 +76,7 @@ /// IA64TargetMachine ctor - Create an LP64 architecture model /// IA64TargetMachine::IA64TargetMachine(const Module &M, const std::string &FS) - : TargetMachine("IA64"), DataLayout(std::string("IA64"), std::string("e")), + : TargetMachine("IA64"), DataLayout("e"), FrameInfo(TargetFrameInfo::StackGrowsDown, 16, 0), TLInfo(*this) { // FIXME? check this stuff } From lattner at cs.uiuc.edu Fri Jun 16 13:23:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/TargetData.cpp Message-ID: <200606161823.NAA10332@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target: TargetData.cpp updated: 1.69 -> 1.70 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -1) TargetData.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/TargetData.cpp diff -u llvm/lib/Target/TargetData.cpp:1.69 llvm/lib/Target/TargetData.cpp:1.70 --- llvm/lib/Target/TargetData.cpp:1.69 Fri Jun 16 13:11:26 2006 +++ llvm/lib/Target/TargetData.cpp Fri Jun 16 13:22:52 2006 @@ -152,7 +152,7 @@ } } -TargetData::TargetData(const std::string &ToolName, const Module *M) { +TargetData::TargetData(const Module *M) { LittleEndian = M->getEndianness() != Module::BigEndian; PointerSize = M->getPointerSize() != Module::Pointer64 ? 4 : 8; PointerAlignment = PointerSize; From lattner at cs.uiuc.edu Fri Jun 16 13:23:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:23:11 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCTargetMachine.cpp Message-ID: <200606161823.NAA10331@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCTargetMachine.cpp updated: 1.92 -> 1.93 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. Remove explicit casts to std::string now that there is no overload resolution issues in the TargetData ctors. --- Diffs of the changes: (+1 -2) PPCTargetMachine.cpp | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPCTargetMachine.cpp diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.92 llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.93 --- llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.92 Thu Jun 15 20:37:27 2006 +++ llvm/lib/Target/PowerPC/PPCTargetMachine.cpp Fri Jun 16 13:22:52 2006 @@ -87,8 +87,7 @@ PPCTargetMachine::PPCTargetMachine(const Module &M, const std::string &FS, bool is64Bit) : TargetMachine("PowerPC"), Subtarget(M, FS, is64Bit), - DataLayout(std::string("PowerPC"), - std::string(Subtarget.getTargetDataString())), + DataLayout(Subtarget.getTargetDataString()), FrameInfo(*this, false), JITInfo(*this), TLInfo(*this), InstrItins(Subtarget.getInstrItineraryData()) { From lattner at cs.uiuc.edu Fri Jun 16 13:24:06 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:06 -0500 Subject: [llvm-commits] CVS: llvm/tools/opt/opt.cpp Message-ID: <200606161824.NAA10461@zion.cs.uiuc.edu> Changes in directory llvm/tools/opt: opt.cpp updated: 1.109 -> 1.110 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+1 -1) opt.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/opt/opt.cpp diff -u llvm/tools/opt/opt.cpp:1.109 llvm/tools/opt/opt.cpp:1.110 --- llvm/tools/opt/opt.cpp:1.109 Wed Jun 7 18:03:13 2006 +++ llvm/tools/opt/opt.cpp Fri Jun 16 13:23:49 2006 @@ -134,7 +134,7 @@ PassManager Passes; // Add an appropriate TargetData instance for this module... - Passes.add(new TargetData("opt", M.get())); + Passes.add(new TargetData(M.get())); // Create a new optimization pass for each one specified on the command line for (unsigned i = 0; i < OptimizationList.size(); ++i) { From lattner at cs.uiuc.edu Fri Jun 16 13:24:06 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:06 -0500 Subject: [llvm-commits] CVS: llvm/tools/llvm-ld/Optimize.cpp Message-ID: <200606161824.NAA10465@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-ld: Optimize.cpp updated: 1.8 -> 1.9 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+1 -1) Optimize.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/llvm-ld/Optimize.cpp diff -u llvm/tools/llvm-ld/Optimize.cpp:1.8 llvm/tools/llvm-ld/Optimize.cpp:1.9 --- llvm/tools/llvm-ld/Optimize.cpp:1.8 Wed Jun 7 18:07:51 2006 +++ llvm/tools/llvm-ld/Optimize.cpp Fri Jun 16 13:23:48 2006 @@ -102,7 +102,7 @@ Passes.add(createVerifierPass()); // Add an appropriate TargetData instance for this module... - addPass(Passes, new TargetData("gccld", M)); + addPass(Passes, new TargetData(M)); // Often if the programmer does not specify proper prototypes for the // functions they are calling, they end up calling a vararg version of the From lattner at cs.uiuc.edu Fri Jun 16 13:24:07 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:07 -0500 Subject: [llvm-commits] CVS: llvm/tools/analyze/analyze.cpp Message-ID: <200606161824.NAA10472@zion.cs.uiuc.edu> Changes in directory llvm/tools/analyze: analyze.cpp updated: 1.67 -> 1.68 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+1 -1) analyze.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/analyze/analyze.cpp diff -u llvm/tools/analyze/analyze.cpp:1.67 llvm/tools/analyze/analyze.cpp:1.68 --- llvm/tools/analyze/analyze.cpp:1.67 Wed Jun 7 18:03:13 2006 +++ llvm/tools/analyze/analyze.cpp Fri Jun 16 13:23:48 2006 @@ -148,7 +148,7 @@ PassManager Passes; // Add an appropriate TargetData instance for this module... - Passes.add(new TargetData("analyze", CurMod)); + Passes.add(new TargetData(CurMod)); // Make sure the input LLVM is well formed. if (!NoVerify) From lattner at cs.uiuc.edu Fri Jun 16 13:24:08 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:08 -0500 Subject: [llvm-commits] CVS: llvm/tools/gccld/GenerateCode.cpp Message-ID: <200606161824.NAA10492@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccld: GenerateCode.cpp updated: 1.57 -> 1.58 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+1 -1) GenerateCode.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/gccld/GenerateCode.cpp diff -u llvm/tools/gccld/GenerateCode.cpp:1.57 llvm/tools/gccld/GenerateCode.cpp:1.58 --- llvm/tools/gccld/GenerateCode.cpp:1.57 Sun May 14 14:17:28 2006 +++ llvm/tools/gccld/GenerateCode.cpp Fri Jun 16 13:23:48 2006 @@ -207,7 +207,7 @@ if (Verify) Passes.add(createVerifierPass()); // Add an appropriate TargetData instance for this module... - addPass(Passes, new TargetData("gccld", M)); + addPass(Passes, new TargetData(M)); // Often if the programmer does not specify proper prototypes for the // functions they are calling, they end up calling a vararg version of the From lattner at cs.uiuc.edu Fri Jun 16 13:24:07 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:07 -0500 Subject: [llvm-commits] CVS: llvm/tools/llvm-extract/llvm-extract.cpp Message-ID: <200606161824.NAA10470@zion.cs.uiuc.edu> Changes in directory llvm/tools/llvm-extract: llvm-extract.cpp updated: 1.29 -> 1.30 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+1 -1) llvm-extract.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/llvm-extract/llvm-extract.cpp diff -u llvm/tools/llvm-extract/llvm-extract.cpp:1.29 llvm/tools/llvm-extract/llvm-extract.cpp:1.30 --- llvm/tools/llvm-extract/llvm-extract.cpp:1.29 Sun Apr 24 12:35:15 2005 +++ llvm/tools/llvm-extract/llvm-extract.cpp Fri Jun 16 13:23:48 2006 @@ -66,7 +66,7 @@ // In addition to deleting all other functions, we also want to spiff it // up a little bit. Do this now. PassManager Passes; - Passes.add(new TargetData("extract", M.get())); // Use correct TargetData + Passes.add(new TargetData(M.get())); // Use correct TargetData // Either isolate the function or delete it from the Module Passes.add(createFunctionExtractionPass(F, DeleteFn)); Passes.add(createGlobalDCEPass()); // Delete unreachable globals From lattner at cs.uiuc.edu Fri Jun 16 13:24:08 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:08 -0500 Subject: [llvm-commits] CVS: llvm/tools/gccas/gccas.cpp Message-ID: <200606161824.NAA10488@zion.cs.uiuc.edu> Changes in directory llvm/tools/gccas: gccas.cpp updated: 1.115 -> 1.116 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+1 -1) gccas.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/tools/gccas/gccas.cpp diff -u llvm/tools/gccas/gccas.cpp:1.115 llvm/tools/gccas/gccas.cpp:1.116 --- llvm/tools/gccas/gccas.cpp:1.115 Wed Feb 22 01:33:49 2006 +++ llvm/tools/gccas/gccas.cpp Fri Jun 16 13:23:48 2006 @@ -192,7 +192,7 @@ PassManager Passes; // Add an appropriate TargetData instance for this module... - Passes.add(new TargetData("gccas", M.get())); + Passes.add(new TargetData(M.get())); // Add all of the transformation passes to the pass manager to do the cleanup // and optimization of the GCC output. From lattner at cs.uiuc.edu Fri Jun 16 13:24:07 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:07 -0500 Subject: [llvm-commits] CVS: llvm/tools/bugpoint/ExtractFunction.cpp OptimizerDriver.cpp Message-ID: <200606161824.NAA10478@zion.cs.uiuc.edu> Changes in directory llvm/tools/bugpoint: ExtractFunction.cpp updated: 1.47 -> 1.48 OptimizerDriver.cpp updated: 1.39 -> 1.40 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+2 -2) ExtractFunction.cpp | 2 +- OptimizerDriver.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/tools/bugpoint/ExtractFunction.cpp diff -u llvm/tools/bugpoint/ExtractFunction.cpp:1.47 llvm/tools/bugpoint/ExtractFunction.cpp:1.48 --- llvm/tools/bugpoint/ExtractFunction.cpp:1.47 Fri May 12 12:28:36 2006 +++ llvm/tools/bugpoint/ExtractFunction.cpp Fri Jun 16 13:23:48 2006 @@ -80,7 +80,7 @@ // Spiff up the output a little bit. PassManager Passes; // Make sure that the appropriate target data is always used... - Passes.add(new TargetData("bugpoint", Result)); + Passes.add(new TargetData(Result)); /// FIXME: If this used runPasses() like the methods below, we could get rid /// of the -disable-* options! Index: llvm/tools/bugpoint/OptimizerDriver.cpp diff -u llvm/tools/bugpoint/OptimizerDriver.cpp:1.39 llvm/tools/bugpoint/OptimizerDriver.cpp:1.40 --- llvm/tools/bugpoint/OptimizerDriver.cpp:1.39 Mon Jun 12 22:10:48 2006 +++ llvm/tools/bugpoint/OptimizerDriver.cpp Fri Jun 16 13:23:48 2006 @@ -104,7 +104,7 @@ PassManager PM; // Make sure that the appropriate target data is always used... - PM.add(new TargetData("bugpoint", Program)); + PM.add(new TargetData(Program)); for (unsigned i = 0, e = Passes.size(); i != e; ++i) { if (Passes[i]->getNormalCtor()) From lattner at cs.uiuc.edu Fri Jun 16 13:24:07 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:07 -0500 Subject: [llvm-commits] CVS: llvm/projects/Stacker/lib/compiler/StackerCompiler.cpp Message-ID: <200606161824.NAA10476@zion.cs.uiuc.edu> Changes in directory llvm/projects/Stacker/lib/compiler: StackerCompiler.cpp updated: 1.16 -> 1.17 --- Log message: Don't pass target name into TargetData anymore, it is never used or needed. --- Diffs of the changes: (+1 -1) StackerCompiler.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/projects/Stacker/lib/compiler/StackerCompiler.cpp diff -u llvm/projects/Stacker/lib/compiler/StackerCompiler.cpp:1.16 llvm/projects/Stacker/lib/compiler/StackerCompiler.cpp:1.17 --- llvm/projects/Stacker/lib/compiler/StackerCompiler.cpp:1.16 Fri May 12 12:29:40 2006 +++ llvm/projects/Stacker/lib/compiler/StackerCompiler.cpp Fri Jun 16 13:23:49 2006 @@ -264,7 +264,7 @@ // Set up a pass manager PassManager Passes; // Add in the passes we want to execute - Passes.add(new TargetData("stkrc",TheModule)); + Passes.add(new TargetData(TheModule)); // Verify we start with valid Passes.add(createVerifierPass()); From lattner at cs.uiuc.edu Fri Jun 16 13:24:51 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:24:51 -0500 Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp Message-ID: <200606161824.NAA10529@zion.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine/Interpreter: Interpreter.cpp updated: 1.31 -> 1.32 --- Log message: Simplify TargetData ctor call --- Diffs of the changes: (+1 -1) Interpreter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp diff -u llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp:1.31 llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp:1.32 --- llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp:1.31 Fri Jun 16 13:08:38 2006 +++ llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp Fri Jun 16 13:24:38 2006 @@ -58,7 +58,7 @@ //===----------------------------------------------------------------------===// // Interpreter ctor - Initialize stuff // -Interpreter::Interpreter(Module *M) : ExecutionEngine(M), TD("lli", M) { +Interpreter::Interpreter(Module *M) : ExecutionEngine(M), TD(M) { memset(&ExitValue, 0, sizeof(ExitValue)); setTargetData(&TD); From lattner at cs.uiuc.edu Fri Jun 16 13:25:18 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:25:18 -0500 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200606161825.NAA10567@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.212 -> 1.213 --- Log message: Improve a comment. --- Diffs of the changes: (+1 -1) DAGISelEmitter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.212 llvm/utils/TableGen/DAGISelEmitter.cpp:1.213 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.212 Wed Jun 14 19:16:37 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Fri Jun 16 13:25:06 2006 @@ -145,7 +145,7 @@ assert(NumResults <= 1 && "We only work with nodes with zero or one result so far!"); - // Check that the number of operands is sane. + // Check that the number of operands is sane. Negative operands -> varargs. if (NodeInfo.getNumOperands() >= 0) { if (N->getNumChildren() != (unsigned)NodeInfo.getNumOperands()) TP.error(N->getOperator()->getName() + " node requires exactly " + From evan.cheng at apple.com Fri Jun 16 13:37:27 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 16 Jun 2006 13:37:27 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Message-ID: <200606161837.NAA10675@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: SimplifyLibCalls.cpp updated: 1.66 -> 1.67 --- Log message: Add missing casts. This fixed some regressions. --- Diffs of the changes: (+2 -2) SimplifyLibCalls.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.66 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.67 --- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.66 Fri Jun 16 03:36:35 2006 +++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Fri Jun 16 13:37:15 2006 @@ -1340,7 +1340,7 @@ if (!puts_func) return false; std::vector args; - args.push_back(ci->getOperand(2)); + args.push_back(CastToCStr(ci->getOperand(2), *ci)); new CallInst(puts_func,args,ci->getName(),ci); ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy,len)); break; @@ -1474,7 +1474,7 @@ if (!fputs_func) return false; std::vector args; - args.push_back(ci->getOperand(3)); + args.push_back(CastToCStr(ci->getOperand(3), *ci)); args.push_back(ci->getOperand(1)); new CallInst(fputs_func,args,ci->getName(),ci); ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy,len)); From lattner at cs.uiuc.edu Fri Jun 16 13:51:00 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 13:51:00 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC.h PPCRegisterInfo.td PPCSubtarget.cpp PPCTargetMachine.cpp Message-ID: <200606161851.NAA10833@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPC.h updated: 1.28 -> 1.29 PPCRegisterInfo.td updated: 1.36 -> 1.37 PPCSubtarget.cpp updated: 1.22 -> 1.23 PPCTargetMachine.cpp updated: 1.93 -> 1.94 --- Log message: Remove the -darwin and -aix llc options, inferring darwinism and aixism from the target triple & subtarget info. woo. --- Diffs of the changes: (+7 -35) PPC.h | 7 ------- PPCRegisterInfo.td | 4 ++-- PPCSubtarget.cpp | 18 +++--------------- PPCTargetMachine.cpp | 13 ++----------- 4 files changed, 7 insertions(+), 35 deletions(-) Index: llvm/lib/Target/PowerPC/PPC.h diff -u llvm/lib/Target/PowerPC/PPC.h:1.28 llvm/lib/Target/PowerPC/PPC.h:1.29 --- llvm/lib/Target/PowerPC/PPC.h:1.28 Mon Mar 13 17:20:37 2006 +++ llvm/lib/Target/PowerPC/PPC.h Fri Jun 16 13:50:48 2006 @@ -21,17 +21,10 @@ class FunctionPass; class PPCTargetMachine; - -enum PPCTargetEnum { - TargetDefault, TargetAIX, TargetDarwin -}; - FunctionPass *createPPCBranchSelectionPass(); FunctionPass *createPPCISelDag(PPCTargetMachine &TM); FunctionPass *createDarwinAsmPrinter(std::ostream &OS, PPCTargetMachine &TM); FunctionPass *createAIXAsmPrinter(std::ostream &OS, PPCTargetMachine &TM); - -extern PPCTargetEnum PPCTarget; } // end namespace llvm; // GCC #defines PPC on Linux but we use it as our namespace name Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.td diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.36 llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.37 --- llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.36 Thu May 4 11:56:45 2006 +++ llvm/lib/Target/PowerPC/PPCRegisterInfo.td Fri Jun 16 13:50:48 2006 @@ -215,7 +215,7 @@ let MethodBodies = [{ GPRCClass::iterator GPRCClass::allocation_order_begin(MachineFunction &MF) const { - return begin() + ((TargetAIX == PPCTarget) ? 1 : 0); + return begin(); } GPRCClass::iterator GPRCClass::allocation_order_end(MachineFunction &MF) const { @@ -238,7 +238,7 @@ let MethodBodies = [{ G8RCClass::iterator G8RCClass::allocation_order_begin(MachineFunction &MF) const { - return begin() + ((TargetAIX == PPCTarget) ? 1 : 0); + return begin(); } G8RCClass::iterator G8RCClass::allocation_order_end(MachineFunction &MF) const { Index: llvm/lib/Target/PowerPC/PPCSubtarget.cpp diff -u llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.22 llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.23 --- llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.22 Fri Jun 16 12:50:12 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.cpp Fri Jun 16 13:50:48 2006 @@ -14,24 +14,10 @@ #include "PPCSubtarget.h" #include "PPC.h" #include "llvm/Module.h" -#include "llvm/Support/CommandLine.h" #include "PPCGenSubtarget.inc" #include - using namespace llvm; -PPCTargetEnum llvm::PPCTarget = TargetDefault; -namespace llvm { - cl::opt - PPCTargetArg(cl::desc("Force generation of code for a specific PPC target:"), - cl::values( - clEnumValN(TargetAIX, "aix", " Enable AIX codegen"), - clEnumValN(TargetDarwin,"darwin", - " Enable Darwin codegen"), - clEnumValEnd), - cl::location(PPCTarget), cl::init(TargetDefault)); -} - #if defined(__APPLE__) #include #include @@ -115,7 +101,9 @@ // if one cannot be determined, to true. const std::string& TT = M.getTargetTriple(); if (TT.length() > 5) { - IsDarwin = TT.find("darwin") != std::string::npos; + IsDarwin = TT.find("-darwin") != std::string::npos; + if (!IsDarwin) + IsAIX = TT.find("-aix") != std::string::npos; } else if (TT.empty()) { #if defined(_POWER) IsAIX = true; Index: llvm/lib/Target/PowerPC/PPCTargetMachine.cpp diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.93 llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.94 --- llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.93 Fri Jun 16 13:22:52 2006 +++ llvm/lib/Target/PowerPC/PPCTargetMachine.cpp Fri Jun 16 13:50:48 2006 @@ -91,10 +91,6 @@ FrameInfo(*this, false), JITInfo(*this), TLInfo(*this), InstrItins(Subtarget.getInstrItineraryData()) { - if (TargetDefault == PPCTarget) { - if (Subtarget.isAIX()) PPCTarget = TargetAIX; - if (Subtarget.isDarwin()) PPCTarget = TargetDarwin; - } if (getRelocationModel() == Reloc::Default) if (Subtarget.isDarwin()) setRelocationModel(Reloc::DynamicNoPIC); @@ -153,15 +149,10 @@ // Decide which asm printer to use. If the user has not specified one on // the command line, choose whichever one matches the default (current host). - switch (PPCTarget) { - case TargetAIX: + if (Subtarget.isAIX()) PM.add(createAIXAsmPrinter(Out, *this)); - break; - case TargetDefault: - case TargetDarwin: + else PM.add(createDarwinAsmPrinter(Out, *this)); - break; - } PM.add(createMachineCodeDeleter()); return false; From lattner at cs.uiuc.edu Fri Jun 16 14:53:52 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 14:53:52 -0500 Subject: [llvm-commits] CVS: llvm/docs/GettingStarted.html Message-ID: <200606161953.OAA11093@zion.cs.uiuc.edu> Changes in directory llvm/docs: GettingStarted.html updated: 1.133 -> 1.134 --- Log message: Document known xcode 2.3 issue --- Diffs of the changes: (+4 -1) GettingStarted.html | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/docs/GettingStarted.html diff -u llvm/docs/GettingStarted.html:1.133 llvm/docs/GettingStarted.html:1.134 --- llvm/docs/GettingStarted.html:1.133 Fri Jun 16 12:20:33 2006 +++ llvm/docs/GettingStarted.html Fri Jun 16 14:53:39 2006 @@ -515,6 +515,9 @@ to a newer version of GCC.

    IA-64 GCC 4.0.0: The IA-64 version of GCC 4.0.0 is known to miscompile LLVM.

    +

    Apple Xcode 2.3: GCC crashes when compiling LLVM at -O3 (which is the + default with ENABLE_OPTIMIZED=1. To work around this, build with + "ENABLE_OPTIMIZED=1 OPTIMIZE_OPTION=-O2".

    @@ -1536,7 +1539,7 @@ Chris Lattner
    Reid Spencer
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/06/16 17:20:33 $ + Last modified: $Date: 2006/06/16 19:53:39 $ From lattner at cs.uiuc.edu Fri Jun 16 15:05:19 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 15:05:19 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCSubtarget.cpp Message-ID: <200606162005.PAA11219@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCSubtarget.cpp updated: 1.23 -> 1.24 --- Log message: Force 64-bit register availability in 64-bit mode. For real. --- Diffs of the changes: (+2 -2) PPCSubtarget.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPCSubtarget.cpp diff -u llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.23 llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.24 --- llvm/lib/Target/PowerPC/PPCSubtarget.cpp:1.23 Fri Jun 16 13:50:48 2006 +++ llvm/lib/Target/PowerPC/PPCSubtarget.cpp Fri Jun 16 15:05:06 2006 @@ -84,9 +84,9 @@ std::cerr << "PPC: Generation of 64-bit code for a 32-bit processor " "requested. Ignoring 32-bit processor feature.\n"; Has64BitSupport = true; - // Silently force 64-bit register use on ppc64. - Use64BitRegs = true; } + // Silently force 64-bit register use on ppc64. + Use64BitRegs = true; } // If the user requested use of 64-bit regs, but the cpu selected doesn't From lattner at cs.uiuc.edu Fri Jun 16 15:22:14 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 15:22:14 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstr64Bit.td PPCInstrInfo.td Message-ID: <200606162022.PAA11436@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstr64Bit.td added (r1.1) PPCInstrInfo.td updated: 1.222 -> 1.223 --- Log message: Split 64-bit instructions out into a separate .td file --- Diffs of the changes: (+185 -130) PPCInstr64Bit.td | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ PPCInstrInfo.td | 132 --------------------------------------- 2 files changed, 185 insertions(+), 130 deletions(-) Index: llvm/lib/Target/PowerPC/PPCInstr64Bit.td diff -c /dev/null llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.1 *** /dev/null Fri Jun 16 15:22:11 2006 --- llvm/lib/Target/PowerPC/PPCInstr64Bit.td Fri Jun 16 15:22:01 2006 *************** *** 0 **** --- 1,183 ---- + //===- PPCInstr64Bit.td - The PowerPC 64-bit Support -------*- tablegen -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Chris Lattner and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file describes the PowerPC 64-bit instructions. These patterns are used + // both when in ppc64 mode and when in "use 64-bit extensions in 32-bit" mode. + // + //===----------------------------------------------------------------------===// + + + //===----------------------------------------------------------------------===// + // Fixed point instructions. + // + + let PPC970_Unit = 1 in { // FXU Operations. + + def OR8 : XForm_6<31, 444, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), + "or $rA, $rS, $rB", IntGeneral, + [(set G8RC:$rA, (or G8RC:$rS, G8RC:$rB))]>; + def OR4To8 : XForm_6<31, 444, (ops G8RC:$rA, GPRC:$rS, GPRC:$rB), + "or $rA, $rS, $rB", IntGeneral, + []>; + def OR8To4 : XForm_6<31, 444, (ops GPRC:$rA, G8RC:$rS, G8RC:$rB), + "or $rA, $rS, $rB", IntGeneral, + []>; + + def ADD8 : XOForm_1<31, 266, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), + "add $rT, $rA, $rB", IntGeneral, + [(set G8RC:$rT, (add G8RC:$rA, G8RC:$rB))]>; + def MULHD : XOForm_1<31, 73, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), + "mulhd $rT, $rA, $rB", IntMulHW, + [(set G8RC:$rT, (mulhs G8RC:$rA, G8RC:$rB))]>; + def MULHDU : XOForm_1<31, 9, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), + "mulhdu $rT, $rA, $rB", IntMulHWU, + [(set G8RC:$rT, (mulhu G8RC:$rA, G8RC:$rB))]>; + + def CMPDI : DForm_5_ext<11, (ops CRRC:$crD, GPRC:$rA, s16imm:$imm), + "cmpdi $crD, $rA, $imm", IntCompare>, isPPC64; + + def CMPLDI : DForm_6_ext<10, (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), + "cmpldi $dst, $src1, $src2", IntCompare>, isPPC64; + def CMPD : XForm_16_ext<31, 0, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), + "cmpd $crD, $rA, $rB", IntCompare>, isPPC64; + def CMPLD : XForm_16_ext<31, 32, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), + "cmpld $crD, $rA, $rB", IntCompare>, isPPC64; + + def SLD : XForm_6<31, 27, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), + "sld $rA, $rS, $rB", IntRotateD, + [(set G8RC:$rA, (shl G8RC:$rS, G8RC:$rB))]>, isPPC64; + def SRD : XForm_6<31, 539, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), + "srd $rA, $rS, $rB", IntRotateD, + [(set G8RC:$rA, (srl G8RC:$rS, G8RC:$rB))]>, isPPC64; + def SRAD : XForm_6<31, 794, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), + "srad $rA, $rS, $rB", IntRotateD, + [(set G8RC:$rA, (sra G8RC:$rS, G8RC:$rB))]>, isPPC64; + def EXTSW : XForm_11<31, 986, (ops G8RC:$rA, G8RC:$rS), + "extsw $rA, $rS", IntGeneral, + [(set G8RC:$rA, (sext_inreg G8RC:$rS, i32))]>, isPPC64; + /// EXTSW_32 - Just like EXTSW, but works on '32-bit' registers. + def EXTSW_32 : XForm_11<31, 986, (ops GPRC:$rA, GPRC:$rS), + "extsw $rA, $rS", IntGeneral, + [(set GPRC:$rA, (PPCextsw_32 GPRC:$rS))]>, isPPC64; + + def SRADI : XSForm_1<31, 413, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH), + "sradi $rA, $rS, $SH", IntRotateD>, isPPC64; + def DIVD : XOForm_1<31, 489, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), + "divd $rT, $rA, $rB", IntDivD, + [(set G8RC:$rT, (sdiv G8RC:$rA, G8RC:$rB))]>, isPPC64, + PPC970_DGroup_First, PPC970_DGroup_Cracked; + def DIVDU : XOForm_1<31, 457, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), + "divdu $rT, $rA, $rB", IntDivD, + [(set G8RC:$rT, (udiv G8RC:$rA, G8RC:$rB))]>, isPPC64, + PPC970_DGroup_First, PPC970_DGroup_Cracked; + def MULLD : XOForm_1<31, 233, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), + "mulld $rT, $rA, $rB", IntMulHD, + [(set G8RC:$rT, (mul G8RC:$rA, G8RC:$rB))]>, isPPC64; + + let isTwoAddress = 1, isCommutable = 1 in { + def RLDIMI : MDForm_1<30, 3, + (ops G8RC:$rA, G8RC:$rSi, G8RC:$rS, u6imm:$SH, u6imm:$MB), + "rldimi $rA, $rS, $SH, $MB", IntRotateD, + []>, isPPC64; + } + + // Rotate instructions. + def RLDICL : MDForm_1<30, 0, + (ops G8RC:$rA, G8RC:$rS, u6imm:$SH, u6imm:$MB), + "rldicl $rA, $rS, $SH, $MB", IntRotateD, + []>, isPPC64; + def RLDICR : MDForm_1<30, 1, + (ops G8RC:$rA, G8RC:$rS, u6imm:$SH, u6imm:$ME), + "rldicr $rA, $rS, $SH, $ME", IntRotateD, + []>, isPPC64; + } + + + //===----------------------------------------------------------------------===// + // Load/Store instructions. + // + + + let isLoad = 1, PPC970_Unit = 2 in { + def LWAX : XForm_1<31, 341, (ops G8RC:$rD, memrr:$src), + "lwax $rD, $src", LdStLHA, + [(set G8RC:$rD, (sextload xaddr:$src, i32))]>, isPPC64, + PPC970_DGroup_Cracked; + def LDX : XForm_1<31, 21, (ops G8RC:$rD, memrr:$src), + "ldx $rD, $src", LdStLD, + [(set G8RC:$rD, (load xaddr:$src))]>, isPPC64; + } + + + // DS-Form instructions. Load/Store instructions available in PPC-64 + // + let isLoad = 1, PPC970_Unit = 2 in { + def LWA : DSForm_1<58, 2, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), + "lwa $rT, $DS($rA)", LdStLWA, + []>, isPPC64, PPC970_DGroup_Cracked; + def LD : DSForm_2<58, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), + "ld $rT, $DS($rA)", LdStLD, + []>, isPPC64; + } + let isStore = 1, noResults = 1, PPC970_Unit = 2 in { + def STD : DSForm_2<62, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), + "std $rT, $DS($rA)", LdStSTD, + []>, isPPC64; + + // STD_32/STDX_32 - Just like STD/STDX, but uses a '32-bit' input register. + def STD_32 : DSForm_2<62, 0, (ops GPRC:$rT, memrix:$dst), + "std $rT, $dst", LdStSTD, + [(PPCstd_32 GPRC:$rT, ixaddr:$dst)]>, isPPC64; + def STDX_32 : XForm_8<31, 149, (ops GPRC:$rT, memrr:$dst), + "stdx $rT, $dst", LdStSTD, + [(PPCstd_32 GPRC:$rT, xaddr:$dst)]>, isPPC64, + PPC970_DGroup_Cracked; + + def STDX : XForm_8<31, 149, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), + "stdx $rS, $rA, $rB", LdStSTD, + []>, isPPC64, PPC970_DGroup_Cracked; + def STDUX : XForm_8<31, 181, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), + "stdux $rS, $rA, $rB", LdStSTD, + []>, isPPC64; + } + + + + //===----------------------------------------------------------------------===// + // Floating point instructions. + // + + + let PPC970_Unit = 3 in { // FPU Operations. + def FCFID : XForm_26<63, 846, (ops F8RC:$frD, F8RC:$frB), + "fcfid $frD, $frB", FPGeneral, + [(set F8RC:$frD, (PPCfcfid F8RC:$frB))]>, isPPC64; + def FCTIDZ : XForm_26<63, 815, (ops F8RC:$frD, F8RC:$frB), + "fctidz $frD, $frB", FPGeneral, + [(set F8RC:$frD, (PPCfctidz F8RC:$frB))]>, isPPC64; + } + + + //===----------------------------------------------------------------------===// + // Instruction Patterns + // + + // Extensions and truncates to/from 32-bit regs. + def : Pat<(i64 (zext GPRC:$in)), + (RLDICL (OR4To8 GPRC:$in, GPRC:$in), 0, 32)>; + def : Pat<(i64 (anyext GPRC:$in)), + (OR4To8 GPRC:$in, GPRC:$in)>; + def : Pat<(i32 (trunc G8RC:$in)), + (OR8To4 G8RC:$in, G8RC:$in)>; + + // SHL/SRL + def : Pat<(shl G8RC:$in, (i64 imm:$imm)), + (RLDICR G8RC:$in, imm:$imm, (SHL64 imm:$imm))>; + def : Pat<(srl G8RC:$in, (i64 imm:$imm)), + (RLDICL G8RC:$in, (SRL64 imm:$imm), imm:$imm)>; Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.222 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.223 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.222 Fri Jun 9 20:14:28 2006 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Fri Jun 16 15:22:01 2006 @@ -419,14 +419,10 @@ "cmpi $crD, $L, $rA, $imm", IntCompare>; def CMPWI : DForm_5_ext<11, (ops CRRC:$crD, GPRC:$rA, s16imm:$imm), "cmpwi $crD, $rA, $imm", IntCompare>; -def CMPDI : DForm_5_ext<11, (ops CRRC:$crD, GPRC:$rA, s16imm:$imm), - "cmpdi $crD, $rA, $imm", IntCompare>, isPPC64; def CMPLI : DForm_6<10, (ops CRRC:$dst, i1imm:$size, GPRC:$src1, u16imm:$src2), "cmpli $dst, $size, $src1, $src2", IntCompare>; def CMPLWI : DForm_6_ext<10, (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), "cmplwi $dst, $src1, $src2", IntCompare>; -def CMPLDI : DForm_6_ext<10, (ops CRRC:$dst, GPRC:$src1, u16imm:$src2), - "cmpldi $dst, $src1, $src2", IntCompare>, isPPC64; } let isLoad = 1, PPC970_Unit = 2 in { def LFS : DForm_8<48, (ops F4RC:$rD, memri:$src), @@ -445,31 +441,6 @@ [(store F8RC:$rS, iaddr:$dst)]>; } -// DS-Form instructions. Load/Store instructions available in PPC-64 -// -let isLoad = 1, PPC970_Unit = 2 in { -def LWA : DSForm_1<58, 2, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "lwa $rT, $DS($rA)", LdStLWA, - []>, isPPC64, PPC970_DGroup_Cracked; -def LD : DSForm_2<58, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "ld $rT, $DS($rA)", LdStLD, - []>, isPPC64; -} -let isStore = 1, noResults = 1, PPC970_Unit = 2 in { -def STD : DSForm_2<62, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "std $rT, $DS($rA)", LdStSTD, - []>, isPPC64; - -// STD_32/STDX_32 - Just like STD/STDX, but uses a '32-bit' input register. -def STD_32 : DSForm_2<62, 0, (ops GPRC:$rT, memrix:$dst), - "std $rT, $dst", LdStSTD, - [(PPCstd_32 GPRC:$rT, ixaddr:$dst)]>, isPPC64; -def STDX_32 : XForm_8<31, 149, (ops GPRC:$rT, memrr:$dst), - "stdx $rT, $dst", LdStSTD, - [(PPCstd_32 GPRC:$rT, xaddr:$dst)]>, isPPC64, - PPC970_DGroup_Cracked; -} - // X-Form instructions. Most instructions that perform an operation on a // register and another register are of this type. // @@ -484,16 +455,9 @@ def LHZX : XForm_1<31, 279, (ops GPRC:$rD, memrr:$src), "lhzx $rD, $src", LdStGeneral, [(set GPRC:$rD, (zextload xaddr:$src, i16))]>; -def LWAX : XForm_1<31, 341, (ops G8RC:$rD, memrr:$src), - "lwax $rD, $src", LdStLHA, - [(set G8RC:$rD, (sextload xaddr:$src, i32))]>, isPPC64, - PPC970_DGroup_Cracked; def LWZX : XForm_1<31, 23, (ops GPRC:$rD, memrr:$src), "lwzx $rD, $src", LdStGeneral, [(set GPRC:$rD, (load xaddr:$src))]>; -def LDX : XForm_1<31, 21, (ops G8RC:$rD, memrr:$src), - "ldx $rD, $src", LdStLD, - [(set G8RC:$rD, (load xaddr:$src))]>, isPPC64; } let PPC970_Unit = 1 in { // FXU Operations. @@ -512,15 +476,6 @@ def OR4 : XForm_6<31, 444, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "or $rA, $rS, $rB", IntGeneral, [(set GPRC:$rA, (or GPRC:$rS, GPRC:$rB))]>; -def OR8 : XForm_6<31, 444, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), - "or $rA, $rS, $rB", IntGeneral, - [(set G8RC:$rA, (or G8RC:$rS, G8RC:$rB))]>; -def OR4To8 : XForm_6<31, 444, (ops G8RC:$rA, GPRC:$rS, GPRC:$rB), - "or $rA, $rS, $rB", IntGeneral, - []>; -def OR8To4 : XForm_6<31, 444, (ops GPRC:$rA, G8RC:$rS, G8RC:$rB), - "or $rA, $rS, $rB", IntGeneral, - []>; def NOR : XForm_6<31, 124, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "nor $rA, $rS, $rB", IntGeneral, [(set GPRC:$rA, (not (or GPRC:$rS, GPRC:$rB)))]>; @@ -536,21 +491,12 @@ def XOR : XForm_6<31, 316, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "xor $rA, $rS, $rB", IntGeneral, [(set GPRC:$rA, (xor GPRC:$rS, GPRC:$rB))]>; -def SLD : XForm_6<31, 27, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), - "sld $rA, $rS, $rB", IntRotateD, - [(set G8RC:$rA, (shl G8RC:$rS, G8RC:$rB))]>, isPPC64; def SLW : XForm_6<31, 24, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "slw $rA, $rS, $rB", IntGeneral, [(set GPRC:$rA, (PPCshl GPRC:$rS, GPRC:$rB))]>; -def SRD : XForm_6<31, 539, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), - "srd $rA, $rS, $rB", IntRotateD, - [(set G8RC:$rA, (srl G8RC:$rS, G8RC:$rB))]>, isPPC64; def SRW : XForm_6<31, 536, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "srw $rA, $rS, $rB", IntGeneral, [(set GPRC:$rA, (PPCsrl GPRC:$rS, GPRC:$rB))]>; -def SRAD : XForm_6<31, 794, (ops G8RC:$rA, G8RC:$rS, G8RC:$rB), - "srad $rA, $rS, $rB", IntRotateD, - [(set G8RC:$rA, (sra G8RC:$rS, G8RC:$rB))]>, isPPC64; def SRAW : XForm_6<31, 792, (ops GPRC:$rA, GPRC:$rS, GPRC:$rB), "sraw $rA, $rS, $rB", IntShift, [(set GPRC:$rA, (PPCsra GPRC:$rS, GPRC:$rB))]>; @@ -571,12 +517,6 @@ def STWUX : XForm_8<31, 183, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), "stwux $rS, $rA, $rB", LdStGeneral, []>; -def STDX : XForm_8<31, 149, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdx $rS, $rA, $rB", LdStSTD, - []>, isPPC64, PPC970_DGroup_Cracked; -def STDUX : XForm_8<31, 181, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdux $rS, $rA, $rB", LdStSTD, - []>, isPPC64; } let PPC970_Unit = 1 in { // FXU Operations. def SRAWI : XForm_10<31, 824, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH), @@ -591,13 +531,6 @@ def EXTSH : XForm_11<31, 922, (ops GPRC:$rA, GPRC:$rS), "extsh $rA, $rS", IntGeneral, [(set GPRC:$rA, (sext_inreg GPRC:$rS, i16))]>; -def EXTSW : XForm_11<31, 986, (ops G8RC:$rA, G8RC:$rS), - "extsw $rA, $rS", IntGeneral, - [(set G8RC:$rA, (sext_inreg G8RC:$rS, i32))]>, isPPC64; -/// EXTSW_32 - Just like EXTSW, but works on '32-bit' registers. -def EXTSW_32 : XForm_11<31, 986, (ops GPRC:$rA, GPRC:$rS), - "extsw $rA, $rS", IntGeneral, - [(set GPRC:$rA, (PPCextsw_32 GPRC:$rS))]>, isPPC64; def CMP : XForm_16<31, 0, (ops CRRC:$crD, i1imm:$long, GPRC:$rA, GPRC:$rB), "cmp $crD, $long, $rA, $rB", IntCompare>; @@ -605,12 +538,8 @@ "cmpl $crD, $long, $rA, $rB", IntCompare>; def CMPW : XForm_16_ext<31, 0, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), "cmpw $crD, $rA, $rB", IntCompare>; -def CMPD : XForm_16_ext<31, 0, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), - "cmpd $crD, $rA, $rB", IntCompare>, isPPC64; def CMPLW : XForm_16_ext<31, 32, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), "cmplw $crD, $rA, $rB", IntCompare>; -def CMPLD : XForm_16_ext<31, 32, (ops CRRC:$crD, GPRC:$rA, GPRC:$rB), - "cmpld $crD, $rA, $rB", IntCompare>, isPPC64; } let PPC970_Unit = 3 in { // FPU Operations. //def FCMPO : XForm_17<63, 32, (ops CRRC:$crD, FPRC:$fA, FPRC:$fB), @@ -629,12 +558,6 @@ [(set F8RC:$frD, (load xaddr:$src))]>; } let PPC970_Unit = 3 in { // FPU Operations. -def FCFID : XForm_26<63, 846, (ops F8RC:$frD, F8RC:$frB), - "fcfid $frD, $frB", FPGeneral, - [(set F8RC:$frD, (PPCfcfid F8RC:$frB))]>, isPPC64; -def FCTIDZ : XForm_26<63, 815, (ops F8RC:$frD, F8RC:$frB), - "fctidz $frD, $frB", FPGeneral, - [(set F8RC:$frD, (PPCfctidz F8RC:$frB))]>, isPPC64; def FCTIWZ : XForm_26<63, 15, (ops F8RC:$frD, F8RC:$frB), "fctiwz $frD, $frB", FPGeneral, [(set F8RC:$frD, (PPCfctiwz F8RC:$frB))]>; @@ -741,20 +664,13 @@ "mfcr $rT, $FXM", SprMFCR>, PPC970_DGroup_First, PPC970_Unit_CRU; -// XS-Form instructions. Just 'sradi' -// let PPC970_Unit = 1 in { // FXU Operations. -def SRADI : XSForm_1<31, 413, (ops GPRC:$rA, GPRC:$rS, u6imm:$SH), - "sradi $rA, $rS, $SH", IntRotateD>, isPPC64; // XO-Form instructions. Arithmetic instructions that can set overflow bit // def ADD4 : XOForm_1<31, 266, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "add $rT, $rA, $rB", IntGeneral, [(set GPRC:$rT, (add GPRC:$rA, GPRC:$rB))]>; -def ADD8 : XOForm_1<31, 266, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), - "add $rT, $rA, $rB", IntGeneral, - [(set G8RC:$rT, (add G8RC:$rA, G8RC:$rB))]>; def ADDC : XOForm_1<31, 10, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "addc $rT, $rA, $rB", IntGeneral, [(set GPRC:$rT, (addc GPRC:$rA, GPRC:$rB))]>, @@ -762,14 +678,6 @@ def ADDE : XOForm_1<31, 138, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "adde $rT, $rA, $rB", IntGeneral, [(set GPRC:$rT, (adde GPRC:$rA, GPRC:$rB))]>; -def DIVD : XOForm_1<31, 489, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), - "divd $rT, $rA, $rB", IntDivD, - [(set G8RC:$rT, (sdiv G8RC:$rA, G8RC:$rB))]>, isPPC64, - PPC970_DGroup_First, PPC970_DGroup_Cracked; -def DIVDU : XOForm_1<31, 457, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), - "divdu $rT, $rA, $rB", IntDivD, - [(set G8RC:$rT, (udiv G8RC:$rA, G8RC:$rB))]>, isPPC64, - PPC970_DGroup_First, PPC970_DGroup_Cracked; def DIVW : XOForm_1<31, 491, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "divw $rT, $rA, $rB", IntDivW, [(set GPRC:$rT, (sdiv GPRC:$rA, GPRC:$rB))]>, @@ -778,21 +686,12 @@ "divwu $rT, $rA, $rB", IntDivW, [(set GPRC:$rT, (udiv GPRC:$rA, GPRC:$rB))]>, PPC970_DGroup_First, PPC970_DGroup_Cracked; -def MULHD : XOForm_1<31, 73, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), - "mulhd $rT, $rA, $rB", IntMulHW, - [(set G8RC:$rT, (mulhs G8RC:$rA, G8RC:$rB))]>; -def MULHDU : XOForm_1<31, 9, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), - "mulhdu $rT, $rA, $rB", IntMulHWU, - [(set G8RC:$rT, (mulhu G8RC:$rA, G8RC:$rB))]>; def MULHW : XOForm_1<31, 75, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mulhw $rT, $rA, $rB", IntMulHW, [(set GPRC:$rT, (mulhs GPRC:$rA, GPRC:$rB))]>; def MULHWU : XOForm_1<31, 11, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mulhwu $rT, $rA, $rB", IntMulHWU, [(set GPRC:$rT, (mulhu GPRC:$rA, GPRC:$rB))]>; -def MULLD : XOForm_1<31, 233, 0, (ops G8RC:$rT, G8RC:$rA, G8RC:$rB), - "mulld $rT, $rA, $rB", IntMulHD, - [(set G8RC:$rT, (mul G8RC:$rA, G8RC:$rB))]>, isPPC64; def MULLW : XOForm_1<31, 235, 0, (ops GPRC:$rT, GPRC:$rA, GPRC:$rB), "mullw $rT, $rA, $rB", IntMulHW, [(set GPRC:$rT, (mul GPRC:$rA, GPRC:$rB))]>; @@ -930,10 +829,6 @@ (ops GPRC:$rA, GPRC:$rSi, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), "rlwimi $rA, $rS, $SH, $MB, $ME", IntRotate, []>, PPC970_DGroup_Cracked; -def RLDIMI : MDForm_1<30, 3, - (ops G8RC:$rA, G8RC:$rSi, G8RC:$rS, u6imm:$SH, u6imm:$MB), - "rldimi $rA, $rS, $SH, $MB", IntRotateD, - []>, isPPC64; } def RLWINM : MForm_2<21, (ops GPRC:$rA, GPRC:$rS, u5imm:$SH, u5imm:$MB, u5imm:$ME), @@ -947,17 +842,6 @@ (ops GPRC:$rA, GPRC:$rS, GPRC:$rB, u5imm:$MB, u5imm:$ME), "rlwnm $rA, $rS, $rB, $MB, $ME", IntGeneral, []>; - -// MD-Form instructions. 64 bit rotate instructions. -// -def RLDICL : MDForm_1<30, 0, - (ops G8RC:$rA, G8RC:$rS, u6imm:$SH, u6imm:$MB), - "rldicl $rA, $rS, $SH, $MB", IntRotateD, - []>, isPPC64; -def RLDICR : MDForm_1<30, 1, - (ops G8RC:$rA, G8RC:$rS, u6imm:$SH, u6imm:$ME), - "rldicr $rA, $rS, $SH, $ME", IntRotateD, - []>, isPPC64; } @@ -1002,24 +886,11 @@ // Return void support. def : Pat<(ret), (BLR)>; -// 64-bit support -def : Pat<(i64 (zext GPRC:$in)), - (RLDICL (OR4To8 GPRC:$in, GPRC:$in), 0, 32)>; -def : Pat<(i64 (anyext GPRC:$in)), - (OR4To8 GPRC:$in, GPRC:$in)>; -def : Pat<(i32 (trunc G8RC:$in)), - (OR8To4 G8RC:$in, G8RC:$in)>; - -// SHL +// SHL/SRL def : Pat<(shl GPRC:$in, (i32 imm:$imm)), (RLWINM GPRC:$in, imm:$imm, 0, (SHL32 imm:$imm))>; -def : Pat<(shl G8RC:$in, (i64 imm:$imm)), - (RLDICR G8RC:$in, imm:$imm, (SHL64 imm:$imm))>; -// SRL def : Pat<(srl GPRC:$in, (i32 imm:$imm)), (RLWINM GPRC:$in, (SRL32 imm:$imm), imm:$imm, 31)>; -def : Pat<(srl G8RC:$in, (i64 imm:$imm)), - (RLDICL G8RC:$in, (SRL64 imm:$imm), imm:$imm)>; // ROTL def : Pat<(rotl GPRC:$in, GPRC:$sh), @@ -1088,3 +959,4 @@ include "PPCInstrAltivec.td" +include "PPCInstr64Bit.td" From lattner at cs.uiuc.edu Fri Jun 16 16:01:48 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 16:01:48 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp PPCInstr64Bit.td PPCInstrInfo.td Message-ID: <200606162101.QAA11737@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.cpp updated: 1.189 -> 1.190 PPCInstr64Bit.td updated: 1.1 -> 1.2 PPCInstrInfo.td updated: 1.223 -> 1.224 --- Log message: fix some assumptions that pointers can only be 32-bits. With this, we can now compile: static unsigned long X; void test1() { X = 0; } into: _test1: lis r2, ha16(_X) li r3, 0 stw r3, lo16(_X)(r2) blr Totally amazing :) --- Diffs of the changes: (+59 -62) PPCISelLowering.cpp | 67 +++++++++++++++++++++++++++------------------------- PPCInstr64Bit.td | 33 ++++++++++--------------- PPCInstrInfo.td | 21 +++++++--------- 3 files changed, 59 insertions(+), 62 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.189 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.190 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.189 Fri Jun 16 12:34:12 2006 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Fri Jun 16 16:01:35 2006 @@ -128,7 +128,10 @@ setOperationAction(ISD::GlobalAddress, MVT::i32, Custom); setOperationAction(ISD::ConstantPool, MVT::i32, Custom); setOperationAction(ISD::JumpTable, MVT::i32, Custom); - + setOperationAction(ISD::GlobalAddress, MVT::i64, Custom); + setOperationAction(ISD::ConstantPool, MVT::i64, Custom); + setOperationAction(ISD::JumpTable, MVT::i64, Custom); + // RET must be custom lowered, to meet ABI requirements setOperationAction(ISD::RET , MVT::Other, Custom); @@ -583,94 +586,94 @@ //===----------------------------------------------------------------------===// static SDOperand LowerConstantPool(SDOperand Op, SelectionDAG &DAG) { + MVT::ValueType PtrVT = Op.getValueType(); ConstantPoolSDNode *CP = cast(Op); Constant *C = CP->get(); - SDOperand CPI = DAG.getTargetConstantPool(C, MVT::i32, CP->getAlignment()); - SDOperand Zero = DAG.getConstant(0, MVT::i32); + SDOperand CPI = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment()); + SDOperand Zero = DAG.getConstant(0, PtrVT); const TargetMachine &TM = DAG.getTarget(); + SDOperand Hi = DAG.getNode(PPCISD::Hi, PtrVT, CPI, Zero); + SDOperand Lo = DAG.getNode(PPCISD::Lo, PtrVT, CPI, Zero); + // If this is a non-darwin platform, we don't support non-static relo models // yet. if (TM.getRelocationModel() == Reloc::Static || !TM.getSubtarget().isDarwin()) { // Generate non-pic code that has direct accesses to the constant pool. // The address of the global is just (hi(&g)+lo(&g)). - SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, CPI, Zero); - SDOperand Lo = DAG.getNode(PPCISD::Lo, MVT::i32, CPI, Zero); - return DAG.getNode(ISD::ADD, MVT::i32, Hi, Lo); + return DAG.getNode(ISD::ADD, PtrVT, Hi, Lo); } - SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, CPI, Zero); if (TM.getRelocationModel() == Reloc::PIC) { // With PIC, the first instruction is actually "GR+hi(&G)". - Hi = DAG.getNode(ISD::ADD, MVT::i32, - DAG.getNode(PPCISD::GlobalBaseReg, MVT::i32), Hi); + Hi = DAG.getNode(ISD::ADD, PtrVT, + DAG.getNode(PPCISD::GlobalBaseReg, PtrVT), Hi); } - SDOperand Lo = DAG.getNode(PPCISD::Lo, MVT::i32, CPI, Zero); - Lo = DAG.getNode(ISD::ADD, MVT::i32, Hi, Lo); + Lo = DAG.getNode(ISD::ADD, PtrVT, Hi, Lo); return Lo; } static SDOperand LowerJumpTable(SDOperand Op, SelectionDAG &DAG) { + MVT::ValueType PtrVT = Op.getValueType(); JumpTableSDNode *JT = cast(Op); - SDOperand JTI = DAG.getTargetJumpTable(JT->getIndex(), MVT::i32); - SDOperand Zero = DAG.getConstant(0, MVT::i32); + SDOperand JTI = DAG.getTargetJumpTable(JT->getIndex(), PtrVT); + SDOperand Zero = DAG.getConstant(0, PtrVT); const TargetMachine &TM = DAG.getTarget(); - + + SDOperand Hi = DAG.getNode(PPCISD::Hi, PtrVT, JTI, Zero); + SDOperand Lo = DAG.getNode(PPCISD::Lo, PtrVT, JTI, Zero); + // If this is a non-darwin platform, we don't support non-static relo models // yet. if (TM.getRelocationModel() == Reloc::Static || !TM.getSubtarget().isDarwin()) { // Generate non-pic code that has direct accesses to the constant pool. // The address of the global is just (hi(&g)+lo(&g)). - SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, JTI, Zero); - SDOperand Lo = DAG.getNode(PPCISD::Lo, MVT::i32, JTI, Zero); - return DAG.getNode(ISD::ADD, MVT::i32, Hi, Lo); + return DAG.getNode(ISD::ADD, PtrVT, Hi, Lo); } - SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, JTI, Zero); if (TM.getRelocationModel() == Reloc::PIC) { // With PIC, the first instruction is actually "GR+hi(&G)". - Hi = DAG.getNode(ISD::ADD, MVT::i32, + Hi = DAG.getNode(ISD::ADD, PtrVT, DAG.getNode(PPCISD::GlobalBaseReg, MVT::i32), Hi); } - SDOperand Lo = DAG.getNode(PPCISD::Lo, MVT::i32, JTI, Zero); - Lo = DAG.getNode(ISD::ADD, MVT::i32, Hi, Lo); + Lo = DAG.getNode(ISD::ADD, PtrVT, Hi, Lo); return Lo; } static SDOperand LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG) { + MVT::ValueType PtrVT = Op.getValueType(); GlobalAddressSDNode *GSDN = cast(Op); GlobalValue *GV = GSDN->getGlobal(); - SDOperand GA = DAG.getTargetGlobalAddress(GV, MVT::i32, GSDN->getOffset()); - SDOperand Zero = DAG.getConstant(0, MVT::i32); + SDOperand GA = DAG.getTargetGlobalAddress(GV, PtrVT, GSDN->getOffset()); + SDOperand Zero = DAG.getConstant(0, PtrVT); const TargetMachine &TM = DAG.getTarget(); + SDOperand Hi = DAG.getNode(PPCISD::Hi, PtrVT, GA, Zero); + SDOperand Lo = DAG.getNode(PPCISD::Lo, PtrVT, GA, Zero); + // If this is a non-darwin platform, we don't support non-static relo models // yet. if (TM.getRelocationModel() == Reloc::Static || !TM.getSubtarget().isDarwin()) { // Generate non-pic code that has direct accesses to globals. // The address of the global is just (hi(&g)+lo(&g)). - SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, GA, Zero); - SDOperand Lo = DAG.getNode(PPCISD::Lo, MVT::i32, GA, Zero); - return DAG.getNode(ISD::ADD, MVT::i32, Hi, Lo); + return DAG.getNode(ISD::ADD, PtrVT, Hi, Lo); } - SDOperand Hi = DAG.getNode(PPCISD::Hi, MVT::i32, GA, Zero); if (TM.getRelocationModel() == Reloc::PIC) { // With PIC, the first instruction is actually "GR+hi(&G)". - Hi = DAG.getNode(ISD::ADD, MVT::i32, - DAG.getNode(PPCISD::GlobalBaseReg, MVT::i32), Hi); + Hi = DAG.getNode(ISD::ADD, PtrVT, + DAG.getNode(PPCISD::GlobalBaseReg, PtrVT), Hi); } - SDOperand Lo = DAG.getNode(PPCISD::Lo, MVT::i32, GA, Zero); - Lo = DAG.getNode(ISD::ADD, MVT::i32, Hi, Lo); + Lo = DAG.getNode(ISD::ADD, PtrVT, Hi, Lo); if (!GV->hasWeakLinkage() && !GV->hasLinkOnceLinkage() && (!GV->isExternal() || GV->hasNotBeenReadFromBytecode())) @@ -678,7 +681,7 @@ // If the global is weak or external, we have to go through the lazy // resolution stub. - return DAG.getLoad(MVT::i32, DAG.getEntryNode(), Lo, DAG.getSrcValue(0)); + return DAG.getLoad(PtrVT, DAG.getEntryNode(), Lo, DAG.getSrcValue(0)); } static SDOperand LowerSETCC(SDOperand Op, SelectionDAG &DAG) { Index: llvm/lib/Target/PowerPC/PPCInstr64Bit.td diff -u llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.1 llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.2 --- llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.1 Fri Jun 16 15:22:01 2006 +++ llvm/lib/Target/PowerPC/PPCInstr64Bit.td Fri Jun 16 16:01:35 2006 @@ -105,6 +105,13 @@ let isLoad = 1, PPC970_Unit = 2 in { +def LWA : DSForm_1<58, 2, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), + "lwa $rT, $DS($rA)", LdStLWA, + []>, isPPC64, PPC970_DGroup_Cracked; +def LD : DSForm_2<58, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), + "ld $rT, $DS($rA)", LdStLD, + []>, isPPC64; + def LWAX : XForm_1<31, 341, (ops G8RC:$rD, memrr:$src), "lwax $rD, $src", LdStLHA, [(set G8RC:$rD, (sextload xaddr:$src, i32))]>, isPPC64, @@ -113,23 +120,18 @@ "ldx $rD, $src", LdStLD, [(set G8RC:$rD, (load xaddr:$src))]>, isPPC64; } - - -// DS-Form instructions. Load/Store instructions available in PPC-64 -// -let isLoad = 1, PPC970_Unit = 2 in { -def LWA : DSForm_1<58, 2, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "lwa $rT, $DS($rA)", LdStLWA, - []>, isPPC64, PPC970_DGroup_Cracked; -def LD : DSForm_2<58, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "ld $rT, $DS($rA)", LdStLD, - []>, isPPC64; -} let isStore = 1, noResults = 1, PPC970_Unit = 2 in { def STD : DSForm_2<62, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), "std $rT, $DS($rA)", LdStSTD, []>, isPPC64; +def STDX : XForm_8<31, 149, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), + "stdx $rS, $rA, $rB", LdStSTD, + []>, isPPC64, PPC970_DGroup_Cracked; +def STDUX : XForm_8<31, 181, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), + "stdux $rS, $rA, $rB", LdStSTD, + []>, isPPC64; + // STD_32/STDX_32 - Just like STD/STDX, but uses a '32-bit' input register. def STD_32 : DSForm_2<62, 0, (ops GPRC:$rT, memrix:$dst), "std $rT, $dst", LdStSTD, @@ -138,13 +140,6 @@ "stdx $rT, $dst", LdStSTD, [(PPCstd_32 GPRC:$rT, xaddr:$dst)]>, isPPC64, PPC970_DGroup_Cracked; - -def STDX : XForm_8<31, 149, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdx $rS, $rA, $rB", LdStSTD, - []>, isPPC64, PPC970_DGroup_Cracked; -def STDUX : XForm_8<31, 181, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdux $rS, $rA, $rB", LdStSTD, - []>, isPPC64; } Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.223 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.224 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.223 Fri Jun 16 15:22:01 2006 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Fri Jun 16 16:01:35 2006 @@ -183,13 +183,13 @@ def target : Operand { let PrintMethod = "printBranchOperand"; } -def calltarget : Operand { +def calltarget : Operand { let PrintMethod = "printCallOperand"; } -def aaddr : Operand { +def aaddr : Operand { let PrintMethod = "printAbsAddrOperand"; } -def piclabel: Operand { +def piclabel: Operand { let PrintMethod = "printPICLabel"; } def symbolHi: Operand { @@ -202,27 +202,27 @@ let PrintMethod = "printcrbitm"; } // Address operands -def memri : Operand { +def memri : Operand { let PrintMethod = "printMemRegImm"; let NumMIOperands = 2; let MIOperandInfo = (ops i32imm, GPRC); } -def memrr : Operand { +def memrr : Operand { let PrintMethod = "printMemRegReg"; let NumMIOperands = 2; let MIOperandInfo = (ops GPRC, GPRC); } -def memrix : Operand { // memri where the imm is shifted 2 bits. +def memrix : Operand { // memri where the imm is shifted 2 bits. let PrintMethod = "printMemRegImmShifted"; let NumMIOperands = 2; let MIOperandInfo = (ops i32imm, GPRC); } // Define PowerPC specific addressing mode. -def iaddr : ComplexPattern; -def xaddr : ComplexPattern; -def xoaddr : ComplexPattern; -def ixaddr : ComplexPattern; // "std" +def iaddr : ComplexPattern; +def xaddr : ComplexPattern; +def xoaddr : ComplexPattern; +def ixaddr : ComplexPattern; // "std" //===----------------------------------------------------------------------===// // PowerPC Instruction Predicate Definitions. @@ -957,6 +957,5 @@ def : Pat<(f64 (extload xaddr:$src, f32)), (FMRSD (LFSX xaddr:$src))>; - include "PPCInstrAltivec.td" include "PPCInstr64Bit.td" From lattner at cs.uiuc.edu Fri Jun 16 16:29:15 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 16:29:15 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrInfo.td Message-ID: <200606162129.QAA12006@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrInfo.td updated: 1.224 -> 1.225 --- Log message: In 64-bit mode, addr mode operands use G8RC instead of GPRC. --- Diffs of the changes: (+3 -3) PPCInstrInfo.td | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.224 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.225 --- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.224 Fri Jun 16 16:01:35 2006 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Fri Jun 16 16:29:03 2006 @@ -205,17 +205,17 @@ def memri : Operand { let PrintMethod = "printMemRegImm"; let NumMIOperands = 2; - let MIOperandInfo = (ops i32imm, GPRC); + let MIOperandInfo = (ops i32imm, ptr_rc); } def memrr : Operand { let PrintMethod = "printMemRegReg"; let NumMIOperands = 2; - let MIOperandInfo = (ops GPRC, GPRC); + let MIOperandInfo = (ops ptr_rc, ptr_rc); } def memrix : Operand { // memri where the imm is shifted 2 bits. let PrintMethod = "printMemRegImmShifted"; let NumMIOperands = 2; - let MIOperandInfo = (ops i32imm, GPRC); + let MIOperandInfo = (ops i32imm, ptr_rc); } // Define PowerPC specific addressing mode. From lattner at cs.uiuc.edu Fri Jun 16 16:29:53 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 16:29:53 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstr64Bit.td Message-ID: <200606162129.QAA12041@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstr64Bit.td updated: 1.2 -> 1.3 --- Log message: Upgrade some load/store instructions to use the proper addressing mode stuff. --- Diffs of the changes: (+10 -10) PPCInstr64Bit.td | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) Index: llvm/lib/Target/PowerPC/PPCInstr64Bit.td diff -u llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.2 llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.3 --- llvm/lib/Target/PowerPC/PPCInstr64Bit.td:1.2 Fri Jun 16 16:01:35 2006 +++ llvm/lib/Target/PowerPC/PPCInstr64Bit.td Fri Jun 16 16:29:41 2006 @@ -105,11 +105,11 @@ let isLoad = 1, PPC970_Unit = 2 in { -def LWA : DSForm_1<58, 2, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "lwa $rT, $DS($rA)", LdStLWA, +def LWA : DSForm_1<58, 2, (ops G8RC:$rT, memrix:$src), + "lwa $rT, $src", LdStLWA, []>, isPPC64, PPC970_DGroup_Cracked; -def LD : DSForm_2<58, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "ld $rT, $DS($rA)", LdStLD, +def LD : DSForm_2<58, 0, (ops G8RC:$rT, memrix:$src), + "ld $rT, $src", LdStLD, []>, isPPC64; def LWAX : XForm_1<31, 341, (ops G8RC:$rD, memrr:$src), @@ -121,15 +121,15 @@ [(set G8RC:$rD, (load xaddr:$src))]>, isPPC64; } let isStore = 1, noResults = 1, PPC970_Unit = 2 in { -def STD : DSForm_2<62, 0, (ops GPRC:$rT, s16immX4:$DS, GPRC:$rA), - "std $rT, $DS($rA)", LdStSTD, +def STD : DSForm_2<62, 0, (ops G8RC:$rT, memrix:$src), + "std $rT, $src", LdStSTD, []>, isPPC64; -def STDX : XForm_8<31, 149, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdx $rS, $rA, $rB", LdStSTD, +def STDX : XForm_8<31, 149, (ops GPRC:$rS, memrr:$dst), + "stdx $rS, $dst", LdStSTD, []>, isPPC64, PPC970_DGroup_Cracked; -def STDUX : XForm_8<31, 181, (ops GPRC:$rS, GPRC:$rA, GPRC:$rB), - "stdux $rS, $rA, $rB", LdStSTD, +def STDUX : XForm_8<31, 181, (ops GPRC:$rS, memrr:$dst), + "stdux $rS, $dst", LdStSTD, []>, isPPC64; // STD_32/STDX_32 - Just like STD/STDX, but uses a '32-bit' input register. From lattner at cs.uiuc.edu Fri Jun 16 16:48:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 16:48:11 -0500 Subject: [llvm-commits] CVS: llvm/Makefile.rules Message-ID: <200606162148.QAA12286@zion.cs.uiuc.edu> Changes in directory llvm: Makefile.rules updated: 1.379 -> 1.380 --- Log message: Do not hardcode random paths into the makefile. Make the user specify the SDK to use when building "universal" on Mac OS/X, if they want to use a specific one. --- Diffs of the changes: (+11 -5) Makefile.rules | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) Index: llvm/Makefile.rules diff -u llvm/Makefile.rules:1.379 llvm/Makefile.rules:1.380 --- llvm/Makefile.rules:1.379 Thu Jun 15 12:31:22 2006 +++ llvm/Makefile.rules Fri Jun 16 16:47:59 2006 @@ -370,13 +370,19 @@ # If we are building a universal binary on Mac OS/X, pass extra options. This # is useful to people that want to link the LLVM libraries into their universal -# apps. +# apps. The UNIVERSAL_SDK_PATH variable can optionally be specified as a path +# to the SDK to use. For Mac OS/X 10.4 Intel machines, the traditional one is: +# UNIVERSAL_SDK_PATH=/Developer/SDKs/MacOSX10.4u.sdk/ ifdef UNIVERSAL - CompileCommonOpts += \ - -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk/ + CompileCommonOpts += -arch i386 -arch ppc Relink.Flags := -XCClinker -arch -XCClinker i386 -XCClinker -arch \ - -XCClinker ppc -XCClinker \ - -isysroot -XCClinker /Developer/SDKs/MacOSX10.4u.sdk/ + -XCClinker ppc + ifdef UNIVERSAL_SDK_PATH + CompileCommonOpts += -isysroot $(UNIVERSAL_SDK_PATH) + Relink.Flags += -XCClinker -isysroot -XCClinker $(UNIVERSAL_SDK_PATH) + endif + + # Building universal cannot compute dependencies automatically. DISABLE_AUTO_DEPENDENCIES=1 endif From evan.cheng at apple.com Fri Jun 16 16:59:01 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 16 Jun 2006 16:59:01 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86Subtarget.cpp Message-ID: <200606162159.QAA12455@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86Subtarget.cpp updated: 1.27 -> 1.28 --- Log message: Later models likely to have Yonah like attributes. --- Diffs of the changes: (+2 -1) X86Subtarget.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86Subtarget.cpp diff -u llvm/lib/Target/X86/X86Subtarget.cpp:1.27 llvm/lib/Target/X86/X86Subtarget.cpp:1.28 --- llvm/lib/Target/X86/X86Subtarget.cpp:1.27 Thu May 25 16:59:08 2006 +++ llvm/lib/Target/X86/X86Subtarget.cpp Fri Jun 16 16:58:49 2006 @@ -90,7 +90,8 @@ case 9: case 13: return "pentium-m"; case 14: return "yonah"; - default: return "i686"; + default: + return (Model > 14) ? "yonah" : "i686"; } case 15: { switch (Model) { From jlaskey at apple.com Fri Jun 16 18:20:34 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 18:20:34 -0500 Subject: [llvm-commits] CVS: llvm/docs/GettingStarted.html Message-ID: <200606162320.SAA13147@zion.cs.uiuc.edu> Changes in directory llvm/docs: GettingStarted.html updated: 1.134 -> 1.135 --- Log message: Include information about svn repository for llvm-gcc4. --- Diffs of the changes: (+5 -1) GettingStarted.html | 6 +++++- 1 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/docs/GettingStarted.html diff -u llvm/docs/GettingStarted.html:1.134 llvm/docs/GettingStarted.html:1.135 --- llvm/docs/GettingStarted.html:1.134 Fri Jun 16 14:53:39 2006 +++ llvm/docs/GettingStarted.html Fri Jun 16 18:20:21 2006 @@ -640,6 +640,10 @@
    Binary release of the llvm-gcc4 front end for MacOS X/X86.
    +

    It is also possible to download the sources of the llvm-gcc4 front end from +a read-only subversion mirror at svn://anonsvn.opensource.apple.com/svn/llvm. +

    + @@ -1539,7 +1543,7 @@ Chris Lattner
    Reid Spencer
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/06/16 19:53:39 $ + Last modified: $Date: 2006/06/16 23:20:21 $ From jlaskey at apple.com Fri Jun 16 18:35:01 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 18:35:01 -0500 Subject: [llvm-commits] CVS: llvm/docs/CFEBuildInstrs.html Message-ID: <200606162335.SAA13273@zion.cs.uiuc.edu> Changes in directory llvm/docs: CFEBuildInstrs.html updated: 1.56 -> 1.57 --- Log message: Include information of svn repository for llvm-gcc4. --- Diffs of the changes: (+17 -1) CFEBuildInstrs.html | 18 +++++++++++++++++- 1 files changed, 17 insertions(+), 1 deletion(-) Index: llvm/docs/CFEBuildInstrs.html diff -u llvm/docs/CFEBuildInstrs.html:1.56 llvm/docs/CFEBuildInstrs.html:1.57 --- llvm/docs/CFEBuildInstrs.html:1.56 Mon Mar 13 23:39:39 2006 +++ llvm/docs/CFEBuildInstrs.html Fri Jun 16 18:34:49 2006 @@ -101,6 +101,22 @@

      +
    1. +

      Retrieve the appropriate llvm-gcc4-x.y.source.tar.gz archive from the llvm +web site.

      +

      It is also possible to download the sources of the llvm-gcc4 front end from +a read-only mirror using subversion. To check out the code the first time use; +

      + +svn co svn://anonsvn.opensource.apple.com/svn/llvm dst-directory + +

      After that, the code can be be updated in the destination directory using; +

      + +svn update + +

      The mirror is brought up to date every evening.

      +
    2. Configure and build the LLVM libraries and tools. There are two ways to do this: either with objdir == srcdir or objdir != srcdir. It is recommended @@ -357,7 +373,7 @@ Brian Gaeke
      LLVM Compiler Infrastructure
      - Last modified: $Date: 2006/03/14 05:39:39 $ + Last modified: $Date: 2006/06/16 23:34:49 $ From jlaskey at apple.com Fri Jun 16 18:36:24 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 16 Jun 2006 18:36:24 -0500 Subject: [llvm-commits] CVS: llvm/lib/VMCore/IntrinsicInst.cpp Message-ID: <200606162336.SAA13287@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: IntrinsicInst.cpp updated: 1.6 -> 1.7 --- Log message: Forgot operands were hard coded for compile unit. --- Diffs of the changes: (+2 -2) IntrinsicInst.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/VMCore/IntrinsicInst.cpp diff -u llvm/lib/VMCore/IntrinsicInst.cpp:1.6 llvm/lib/VMCore/IntrinsicInst.cpp:1.7 --- llvm/lib/VMCore/IntrinsicInst.cpp:1.6 Wed Jun 7 17:00:26 2006 +++ llvm/lib/VMCore/IntrinsicInst.cpp Fri Jun 16 18:36:12 2006 @@ -61,13 +61,13 @@ std::string DbgStopPointInst::getFileName() const { GlobalVariable *GV = cast(getContext()); ConstantStruct *CS = cast(GV->getInitializer()); - return CS->getOperand(4)->getStringValue(); + return CS->getOperand(3)->getStringValue(); } std::string DbgStopPointInst::getDirectory() const { GlobalVariable *GV = cast(getContext()); ConstantStruct *CS = cast(GV->getInitializer()); - return CS->getOperand(5)->getStringValue(); + return CS->getOperand(4)->getStringValue(); } //===----------------------------------------------------------------------===// From lattner at cs.uiuc.edu Fri Jun 16 19:01:16 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 19:01:16 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrInfo.cpp PPCInstrInfo.h PPCTargetMachine.cpp Message-ID: <200606170001.TAA13454@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrInfo.cpp updated: 1.20 -> 1.21 PPCInstrInfo.h updated: 1.15 -> 1.16 PPCTargetMachine.cpp updated: 1.94 -> 1.95 --- Log message: Implement the getPointerRegClass method, which is required for the ptr_rc magic to work. --- Diffs of the changes: (+20 -6) PPCInstrInfo.cpp | 16 +++++++++++++--- PPCInstrInfo.h | 8 ++++++-- PPCTargetMachine.cpp | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) Index: llvm/lib/Target/PowerPC/PPCInstrInfo.cpp diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.cpp:1.20 llvm/lib/Target/PowerPC/PPCInstrInfo.cpp:1.21 --- llvm/lib/Target/PowerPC/PPCInstrInfo.cpp:1.20 Thu May 4 12:52:23 2006 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.cpp Fri Jun 16 19:01:04 2006 @@ -13,13 +13,23 @@ #include "PPCInstrInfo.h" #include "PPCGenInstrInfo.inc" -#include "PPC.h" +#include "PPCTargetMachine.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include using namespace llvm; -PPCInstrInfo::PPCInstrInfo() - : TargetInstrInfo(PPCInsts, sizeof(PPCInsts)/sizeof(PPCInsts[0])) {} +PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm) + : TargetInstrInfo(PPCInsts, sizeof(PPCInsts)/sizeof(PPCInsts[0])), TM(tm) {} + +/// getPointerRegClass - Return the register class to use to hold pointers. +/// This is used for addressing modes. +const TargetRegisterClass *PPCInstrInfo::getPointerRegClass() const { + if (TM.getSubtargetImpl()->isPPC64()) + return &PPC::G8RCRegClass; + else + return &PPC::GPRCRegClass; +} + bool PPCInstrInfo::isMoveInstr(const MachineInstr& MI, unsigned& sourceReg, Index: llvm/lib/Target/PowerPC/PPCInstrInfo.h diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.15 llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.16 --- llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.15 Wed May 24 12:04:04 2006 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.h Fri Jun 16 19:01:04 2006 @@ -62,9 +62,10 @@ class PPCInstrInfo : public TargetInstrInfo { + PPCTargetMachine &TM; const PPCRegisterInfo RI; public: - PPCInstrInfo(); + PPCInstrInfo(PPCTargetMachine &TM); /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As /// such, whenever a client has an instance of instruction info, it should @@ -72,7 +73,10 @@ /// virtual const MRegisterInfo &getRegisterInfo() const { return RI; } - // + /// getPointerRegClass - Return the register class to use to hold pointers. + /// This is used for addressing modes. + virtual const TargetRegisterClass *getPointerRegClass() const; + // Return true if the instruction is a register to register move and // leave the source and dest operands in the passed parameters. // Index: llvm/lib/Target/PowerPC/PPCTargetMachine.cpp diff -u llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.94 llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.95 --- llvm/lib/Target/PowerPC/PPCTargetMachine.cpp:1.94 Fri Jun 16 13:50:48 2006 +++ llvm/lib/Target/PowerPC/PPCTargetMachine.cpp Fri Jun 16 19:01:04 2006 @@ -87,7 +87,7 @@ PPCTargetMachine::PPCTargetMachine(const Module &M, const std::string &FS, bool is64Bit) : TargetMachine("PowerPC"), Subtarget(M, FS, is64Bit), - DataLayout(Subtarget.getTargetDataString()), + DataLayout(Subtarget.getTargetDataString()), InstrInfo(*this), FrameInfo(*this, false), JITInfo(*this), TLInfo(*this), InstrItins(Subtarget.getInstrItineraryData()) { From evan.cheng at apple.com Fri Jun 16 19:46:02 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 16 Jun 2006 19:46:02 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/README.txt Message-ID: <200606170046.TAA13882@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: README.txt updated: 1.117 -> 1.118 --- Log message: A new entry. --- Diffs of the changes: (+2 -0) README.txt | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Target/X86/README.txt diff -u llvm/lib/Target/X86/README.txt:1.117 llvm/lib/Target/X86/README.txt:1.118 --- llvm/lib/Target/X86/README.txt:1.117 Thu Jun 15 16:33:31 2006 +++ llvm/lib/Target/X86/README.txt Fri Jun 16 19:45:49 2006 @@ -702,3 +702,5 @@ Smells like a register coallescing/reassociation issue. //===---------------------------------------------------------------------===// + +Use cpuid to auto-detect CPU features such as SSE, SSE2, and SSE3. From lattner at cs.uiuc.edu Fri Jun 16 20:01:42 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 20:01:42 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll Message-ID: <200606170101.UAA14082@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/IndVarsSimplify: 2006-06-16-Indvar-LCSSA-Crash.ll added (r1.1) --- Log message: new testcase that crashes indvars --- Diffs of the changes: (+21 -0) 2006-06-16-Indvar-LCSSA-Crash.ll | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+) Index: llvm/test/Regression/Transforms/IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll diff -c /dev/null llvm/test/Regression/Transforms/IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll:1.1 *** /dev/null Fri Jun 16 20:01:40 2006 --- llvm/test/Regression/Transforms/IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll Fri Jun 16 20:01:30 2006 *************** *** 0 **** --- 1,21 ---- + ; RUN: llvm-as < %s | opt -indvars -disable-output + + void %get_block() { + endif.0: ; preds = %entry + br label %no_exit.30 + + no_exit.30: ; preds = %no_exit.30, %endif.0 + %x.12.0 = phi int [ %inc.28, %no_exit.30 ], [ -2, %endif.0 ] ; [#uses=1] + %tmp.583 = load ushort* null ; [#uses=1] + %tmp.584 = cast ushort %tmp.583 to int ; [#uses=1] + %tmp.588 = load int* null ; [#uses=1] + %tmp.589 = mul int %tmp.584, %tmp.588 ; [#uses=1] + %tmp.591 = add int %tmp.589, 0 ; [#uses=1] + %inc.28 = add int %x.12.0, 1 ; [#uses=2] + %tmp.565 = setgt int %inc.28, 3 ; [#uses=1] + br bool %tmp.565, label %loopexit.30, label %no_exit.30 + + loopexit.30: ; preds = %no_exit.30 + %tmp.591.lcssa = phi int [ %tmp.591, %no_exit.30 ] ; [#uses=0] + ret void + } From lattner at cs.uiuc.edu Fri Jun 16 20:02:44 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 16 Jun 2006 20:02:44 -0500 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/IndVarSimplify.cpp Message-ID: <200606170102.UAA14094@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: IndVarSimplify.cpp updated: 1.82 -> 1.83 --- Log message: Fix IndVarsSimplify/2006-06-16-Indvar-LCSSA-Crash.ll, a case where a "LCSSA" phi node causes indvars to break dominance properties. This fixes causes indvars to avoid inserting aggressive code in this case, instead indvars should be fixed to be more aggressive in the face of lcssa phi's. --- Diffs of the changes: (+19 -4) IndVarSimplify.cpp | 23 +++++++++++++++++++---- 1 files changed, 19 insertions(+), 4 deletions(-) Index: llvm/lib/Transforms/Scalar/IndVarSimplify.cpp diff -u llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.82 llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.83 --- llvm/lib/Transforms/Scalar/IndVarSimplify.cpp:1.82 Fri Nov 18 12:30:47 2005 +++ llvm/lib/Transforms/Scalar/IndVarSimplify.cpp Fri Jun 16 20:02:31 2006 @@ -321,11 +321,26 @@ HasConstantItCount) { // Find out if this predictably varying value is actually used // outside of the loop. "extra" as opposed to "intra". - std::vector ExtraLoopUsers; + std::vector ExtraLoopUsers; for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); - UI != E; ++UI) - if (!L->contains(cast(*UI)->getParent())) - ExtraLoopUsers.push_back(*UI); + UI != E; ++UI) { + Instruction *User = cast(*UI); + if (!L->contains(User->getParent())) { + // If this is a PHI node in the exit block and we're inserting, + // into the exit block, it must have a single entry. In this + // case, we can't insert the code after the PHI and have the PHI + // still use it. Instead, don't insert the the PHI. + if (PHINode *PN = dyn_cast(User)) { + // FIXME: This is a case where LCSSA pessimizes code, this + // should be fixed better. + if (PN->getNumOperands() == 2 && + PN->getParent() == BlockToInsertInto) + continue; + } + ExtraLoopUsers.push_back(User); + } + } + if (!ExtraLoopUsers.empty()) { // Okay, this instruction has a user outside of the current loop // and varies predictably in this loop. Evaluate the value it From evan.cheng at apple.com Fri Jun 16 20:42:33 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 16 Jun 2006 20:42:33 -0500 Subject: [llvm-commits] CVS: llvm/include/llvm/Target/TargetInstrInfo.h Message-ID: <200606170142.UAA14432@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Target: TargetInstrInfo.h updated: 1.89 -> 1.90 --- Log message: Clean up --- Diffs of the changes: (+1 -2) TargetInstrInfo.h | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/include/llvm/Target/TargetInstrInfo.h diff -u llvm/include/llvm/Target/TargetInstrInfo.h:1.89 llvm/include/llvm/Target/TargetInstrInfo.h:1.90 --- llvm/include/llvm/Target/TargetInstrInfo.h:1.89 Thu Jun 15 03:10:27 2006 +++ llvm/include/llvm/Target/TargetInstrInfo.h Fri Jun 16 20:42:20 2006 @@ -149,8 +149,7 @@ const TargetRegisterClass *getInstrOperandRegClass(const TargetInstrDescriptor *II, unsigned Op) const { if (Op >= II->numOperands) { - if (!(II->Flags & M_VARIABLE_OPS)) - assert(false && "Invalid operand # of instruction"); + assert((II->Flags & M_VARIABLE_OPS)&& "Invalid operand # of instruction"); return NULL; } const TargetOperandInfo &toi = II->OpInfo[Op]; From lattner at cs.uiuc.edu Sat Jun 17 03:07:02 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat, 17 Jun 2006 03:07:02 -0500 Subject: [llvm-commits] CVS: llvm/test/TestRunner.sh Message-ID: <200606170807.DAA10624@zion.cs.uiuc.edu> Changes in directory llvm/test: TestRunner.sh updated: 1.11 -> 1.12 --- Log message: Just a minor tweak so you can run things like: TestRunner.sh Foo/Bar/test.ll instead of just TestRunner.sh test.ll which is convenient in conjunction with find. --- Diffs of the changes: (+2 -1) TestRunner.sh | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/test/TestRunner.sh diff -u llvm/test/TestRunner.sh:1.11 llvm/test/TestRunner.sh:1.12 --- llvm/test/TestRunner.sh:1.11 Wed Mar 8 16:28:19 2006 +++ llvm/test/TestRunner.sh Sat Jun 17 03:06:33 2006 @@ -13,7 +13,8 @@ FILENAME=$1 TESTNAME=$1 SUBST=$1 -OUTPUT=Output/$FILENAME.out +FILENAME_ONLY=`basename $1` +OUTPUT=Output/$FILENAME_ONLY.out # create the output directory if it does not already exist mkdir Output > /dev/null 2>&1 From lattner at cs.uiuc.edu Sat Jun 17 13:18:05 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Sat, 17 Jun 2006 13:18:05 -0500 Subject: [llvm-commits] CVS: llvm/lib/Analysis/ConstantFolding.cpp Message-ID: <200606171818.NAA26373@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: ConstantFolding.cpp updated: 1.3 -> 1.4 --- Log message: Constant fold sqrtf --- Diffs of the changes: (+4 -1) ConstantFolding.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/Analysis/ConstantFolding.cpp diff -u llvm/lib/Analysis/ConstantFolding.cpp:1.3 llvm/lib/Analysis/ConstantFolding.cpp:1.4 --- llvm/lib/Analysis/ConstantFolding.cpp:1.3 Mon Jan 16 15:12:35 2006 +++ llvm/lib/Analysis/ConstantFolding.cpp Sat Jun 17 13:17:52 2006 @@ -76,7 +76,8 @@ case 'p': return Name == "pow"; case 's': - return Name == "sin" || Name == "sinh" || Name == "sqrt"; + return Name == "sin" || Name == "sinh" || + Name == "sqrt" || Name == "sqrtf"; case 't': return Name == "tan" || Name == "tanh"; default: @@ -150,6 +151,8 @@ return ConstantFP::get(Ty, sinh(V)); else if (Name == "sqrt" && V >= 0) return ConstantFP::get(Ty, sqrt(V)); + else if (Name == "sqrtf" && V >= 0) + return ConstantFP::get(Ty, sqrt((float)V)); break; case 't': if (Name == "tan") From rafael.espindola at gmail.com Sat Jun 17 19:08:20 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Sat, 17 Jun 2006 19:08:20 -0500 Subject: [llvm-commits] CVS: llvm/lib/Target/ARM/ARMInstrInfo.td ARMRegisterInfo.cpp ARMRegisterInfo.td Message-ID: <200606180008.TAA29673@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/ARM: ARMInstrInfo.td updated: 1.4 -> 1.5 ARMRegisterInfo.cpp updated: 1.3 -> 1.4 ARMRegisterInfo.td updated: 1.1 -> 1.2 --- Log message: initial implementation of ARMRegisterInfo::eliminateFrameIndex fixes test/Regression/CodeGen/ARM/ret_arg5.ll --- Diffs of the changes: (+34 -2) ARMInstrInfo.td | 4 ++++ ARMRegisterInfo.cpp | 24 +++++++++++++++++++++++- ARMRegisterInfo.td | 8 +++++++- 3 files changed, 34 insertions(+), 2 deletions(-) Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.4 llvm/lib/Target/ARM/ARMInstrInfo.td:1.5 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.4 Tue May 30 12:33:19 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Sat Jun 17 19:08:07 2006 @@ -53,3 +53,7 @@ def movri : InstARM<(ops IntRegs:$dst, i32imm:$src), "mov $dst, $src", [(set IntRegs:$dst, imm:$src)]>; + +def addri : InstARM<(ops IntRegs:$dst, IntRegs:$a, i32imm:$b), + "add $dst, $a, $b", + [(set IntRegs:$dst, (add IntRegs:$a, imm:$b))]>; Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.3 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.4 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.3 Thu May 18 16:45:49 2006 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Sat Jun 17 19:08:07 2006 @@ -77,7 +77,29 @@ void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const { - assert(0 && "Not Implemented"); + MachineInstr &MI = *II; + MachineBasicBlock &MBB = *MI.getParent(); + MachineFunction &MF = *MBB.getParent(); + + assert (MI.getOpcode() == ARM::movrr); + + unsigned FrameIdx = 1; + + int FrameIndex = MI.getOperand(FrameIdx).getFrameIndex(); + + int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex); + + unsigned StackSize = MF.getFrameInfo()->getStackSize(); + + Offset += StackSize; + + // Insert a set of r12 with the full address + // r12 = r13 + offset + MachineBasicBlock *MBB2 = MI.getParent(); + BuildMI(*MBB2, II, ARM::addri, 2, ARM::R12).addReg(ARM::R13).addImm(Offset); + + // Replace the FrameIndex with r12 + MI.getOperand(FrameIdx).ChangeToRegister(ARM::R12); } void ARMRegisterInfo:: Index: llvm/lib/Target/ARM/ARMRegisterInfo.td diff -u llvm/lib/Target/ARM/ARMRegisterInfo.td:1.1 llvm/lib/Target/ARM/ARMRegisterInfo.td:1.2 --- llvm/lib/Target/ARM/ARMRegisterInfo.td:1.1 Sun May 14 17:18:28 2006 +++ llvm/lib/Target/ARM/ARMRegisterInfo.td Sat Jun 17 19:08:07 2006 @@ -50,7 +50,13 @@ let MethodBodies = [{ IntRegsClass::iterator IntRegsClass::allocation_order_end(MachineFunction &MF) const { - return end() - 1; + // r15 == Program Counter + // r14 == Link Register + // r13 == Stack Pointer + // r12 == ip (scratch) + // r11 == Frame Pointer + // r10 == Stack Limit + return end() - 4; } }]; } From rafael.espindola at gmail.com Sat Jun 17 19:08:21 2006 From: rafael.espindola at gmail.com (Rafael Espindola) Date: Sat, 17 Jun 2006 19:08:21 -0500 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/ARM/ret_arg5.ll Message-ID: <200606180008.TAA29677@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/ARM: ret_arg5.ll updated: 1.2 -> 1.3 --- Log message: initial implementation of ARMRegisterInfo::eliminateFrameIndex fixes test/Regression/CodeGen/ARM/ret_arg5.ll --- Diffs of the changes: (+0 -1) ret_arg5.ll | 1 - 1 files changed, 1 deletion(-) Index: llvm/test/Regression/CodeGen/ARM/ret_arg5.ll diff -u llvm/test/Regression/CodeGen/ARM/ret_arg5.ll:1.2 llvm/test/Regression/CodeGen/ARM/ret_arg5.ll:1.3 --- llvm/test/Regression/CodeGen/ARM/ret_arg5.ll:1.2 Fri Jun 16 11:36:50 2006 +++ llvm/test/Regression/CodeGen/ARM/ret_arg5.ll Sat Jun 17 19:08:07 2006 @@ -1,5 +1,4 @@ ; RUN: llvm-as < %s | llc -march=arm -; XFAIL: * int %test(int %a1, int %a2, int %a3, int %a4, int %a5) { ret int %a5 }