diff options
author | Nate Begeman <natebegeman@mac.com> | 2006-04-23 06:26:20 +0000 |
---|---|---|
committer | Nate Begeman <natebegeman@mac.com> | 2006-04-23 06:26:20 +0000 |
commit | 9453eea49bca1c3904047db495855c93e001d1cd (patch) | |
tree | 7276c569e8d8853ed5e2676102427a7cddb9cc7f /lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | |
parent | 84bfed087b12c89cb09a257059666578de3b01cc (diff) |
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
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 60cb581044..0663e81a1b 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<MachineDebugInfo>()); 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; |