From 9453eea49bca1c3904047db495855c93e001d1cd Mon Sep 17 00:00:00 2001 From: Nate Begeman Date: Sun, 23 Apr 2006 06:26:20 +0000 Subject: [PATCH] Fix the updating of the machine CFG when a PHI node was in a successor of the jump table's range check block. This re-enables 100% dense jump tables by default on PPC & x86 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27952 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/SelectionDAGISel.h | 9 ++++++--- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 15 ++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/llvm/CodeGen/SelectionDAGISel.h b/include/llvm/CodeGen/SelectionDAGISel.h index 0e59d7b9136..6ebcda35db7 100644 --- a/include/llvm/CodeGen/SelectionDAGISel.h +++ b/include/llvm/CodeGen/SelectionDAGISel.h @@ -41,7 +41,7 @@ public: SelectionDAG *CurDAG; MachineBasicBlock *BB; - SelectionDAGISel(TargetLowering &tli) : TLI(tli), JT(0,0,0) {} + SelectionDAGISel(TargetLowering &tli) : TLI(tli), JT(0,0,0,0) {} virtual void getAnalysisUsage(AnalysisUsage &AU) const; @@ -89,8 +89,8 @@ public: MachineBasicBlock *ThisBB; }; struct JumpTable { - JumpTable(unsigned R, unsigned J, MachineBasicBlock *me) : Reg(R), JTI(J), - MBB(me) {} + JumpTable(unsigned R, unsigned J, MachineBasicBlock *M, + MachineBasicBlock *D) : Reg(R), JTI(J), MBB(M), Default(D) {} // Reg - the virtual register containing the index of the jump table entry // to jump to. unsigned Reg; @@ -98,6 +98,9 @@ public: unsigned JTI; // MBB - the MBB into which to emit the code for the indirect jump. MachineBasicBlock *MBB; + // Default - the MBB of the default bb, which is a successor of the range + // check MBB. This is when updating PHI nodes in successors. + MachineBasicBlock *Default; // SuccMBBs - a vector of unique successor MBBs used for updating CFG info // and PHI nodes. std::set SuccMBBs; diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 60cb5810446..0663e81a1b9 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -408,7 +408,7 @@ public: SelectionDAGLowering(SelectionDAG &dag, TargetLowering &tli, FunctionLoweringInfo &funcinfo) : TLI(tli), DAG(dag), TD(DAG.getTarget().getTargetData()), - JT(0,0,0), FuncInfo(funcinfo) { + JT(0,0,0,0), FuncInfo(funcinfo) { } /// getRoot - Return the current virtual root of the Selection DAG. @@ -891,7 +891,7 @@ void SelectionDAGLowering::visitSwitch(SwitchInst &I) { // FIXME: Make this work with 64 bit targets someday, possibly by always // doing differences there so that entries stay 32 bits. // FIXME: Make this work with PIC code - if (0 && TLI.isOperationLegal(ISD::BRIND, TLI.getPointerTy()) && + if (TLI.isOperationLegal(ISD::BRIND, TLI.getPointerTy()) && TLI.getPointerTy() == MVT::i32 && (Relocs == Reloc::Static || Relocs == Reloc::DynamicNoPIC) && Cases.size() > 3) { @@ -955,6 +955,7 @@ void SelectionDAGLowering::visitSwitch(SwitchInst &I) { JT.Reg = JumpTableReg; JT.JTI = JTI; JT.MBB = JumpTableBB; + JT.Default = Default; JT.SuccMBBs = UniqueBBs; return; } @@ -3190,12 +3191,15 @@ void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF, return; } - // If we need to emit a jump table, + // If the JumpTable record is filled in, then we need to emit a jump table. + // Updating the PHI nodes is tricky in this case, since we need to determine + // whether the PHI is a successor of the range check MBB or the jump table MBB if (JT.Reg) { assert(SwitchCases.empty() && "Cannot have jump table and lowered switch"); SelectionDAG SDAG(TLI, MF, getAnalysisToUpdate()); CurDAG = &SDAG; SelectionDAGLowering SDL(SDAG, TLI, FuncInfo); + MachineBasicBlock *RangeBB = BB; // Set the current basic block to the mbb we wish to insert the code into BB = JT.MBB; SDL.setCurrentBasicBlock(BB); @@ -3209,9 +3213,10 @@ void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF, MachineBasicBlock *PHIBB = PHI->getParent(); assert(PHI->getOpcode() == TargetInstrInfo::PHI && "This is not a machine PHI node that we are updating!"); - if (JT.SuccMBBs.find(PHIBB) != JT.SuccMBBs.end()) { + if (PHIBB == JT.Default || JT.SuccMBBs.find(PHIBB) != JT.SuccMBBs.end()) { + PHIBB = (PHIBB == JT.Default) ? RangeBB : BB; PHI->addRegOperand(PHINodesToUpdate[pi].second); - PHI->addMachineBasicBlockOperand(BB); + PHI->addMachineBasicBlockOperand(PHIBB); } } return;