[LLVMbugs] [Bug 1224] Invoke lowering broken with -enable-eh

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Sun Feb 25 13:47:23 PST 2007


http://llvm.org/bugs/show_bug.cgi?id=1224

jlaskey at apple.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From jlaskey at apple.com  2007-02-25 15:47 -------
Index: lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
===============================================================
====
RCS file: /var/cvs/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp,v
retrieving revision 1.374
diff -u -1 -0 -d -r1.374 SelectionDAGISel.cpp
--- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	24 Feb 2007 09:45:44 -0000
	1.374
+++ lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	25 Feb 2007 21:15:16 -0000
@@ -493,20 +493,21 @@
   void visitBr(BranchInst &I);
   void visitSwitch(SwitchInst &I);
   void visitUnreachable(UnreachableInst &I) { /* noop */ }
   // Helper for visitSwitch
   void visitSwitchCase(SelectionDAGISel::CaseBlock &CB);
   void visitJumpTable(SelectionDAGISel::JumpTable &JT);
  
   // These all get lowered before this pass.
   void visitInvoke(InvokeInst &I);
+  void visitInvoke(InvokeInst &I, bool AsTerminator);
   void visitUnwind(UnwindInst &I);
   void visitScalarBinary(User &I, unsigned OpCode);
   void visitVectorBinary(User &I, unsigned OpCode);
   void visitEitherBinary(User &I, unsigned ScalarOp, unsigned VectorOp);
   void visitShift(User &I, unsigned Opcode);
   void visitAdd(User &I) {
     if (isa<VectorType>(I.getType()))
       visitVectorBinary(I, ISD::VADD);
     else if (I.getType()->isFloatingPoint())
@@ -1098,58 +1099,63 @@
   // Emit the code for the jump table
   MVT::ValueType PTy = TLI.getPointerTy();
   SDOperand Index = DAG.getCopyFromReg(getRoot(), JT.Reg, PTy);
   SDOperand Table = DAG.getJumpTable(JT.JTI, PTy);
   DAG.setRoot(DAG.getNode(ISD::BR_JT, MVT::Other, Index.getValue(1),
                           Table, Index));
   return;
}
void SelectionDAGLowering::visitInvoke(InvokeInst &I) {
+  assert(0 && "Should never be visited directly");
+}
+void SelectionDAGLowering::visitInvoke(InvokeInst &I, bool AsTerminator) {
   // Retrieve successors.
   MachineBasicBlock *Return = FuncInfo.MBBMap[I.getSuccessor(0)];
   MachineBasicBlock *LandingPad = FuncInfo.MBBMap[I.getSuccessor(1)];
  
-  // Mark landing pad so that it doesn't get deleted in branch folding.
-  LandingPad->setIsLandingPad();
- 
-  // Insert a label before the invoke call to mark the try range.
-  // This can be used to detect deletion of the invoke via the
-  // MachineModuleInfo.
-  MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
-  unsigned BeginLabel = MMI->NextLabelID();
-  DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(),
-                          DAG.getConstant(BeginLabel, MVT::i32)));
-
-  LowerCallTo(I, I.getCalledValue()->getType(),
-                 I.getCallingConv(),
-                 false,
-                 getValue(I.getOperand(0)),
-                 3);
+  if (!AsTerminator) {
+    // Mark landing pad so that it doesn't get deleted in branch folding.
+    LandingPad->setIsLandingPad();
+   
+    // Insert a label before the invoke call to mark the try range.
+    // This can be used to detect deletion of the invoke via the
+    // MachineModuleInfo.
+    MachineModuleInfo *MMI = DAG.getMachineModuleInfo();
+    unsigned BeginLabel = MMI->NextLabelID();
+    DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(),
+                            DAG.getConstant(BeginLabel, MVT::i32)));
-  // Insert a label before the invoke call to mark the try range.
-  // This can be used to detect deletion of the invoke via the
-  // MachineModuleInfo.
-  unsigned EndLabel = MMI->NextLabelID();
-  DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(),
-                          DAG.getConstant(EndLabel, MVT::i32)));
-                         
-  // Inform MachineModuleInfo of range.   
-  MMI->addInvoke(LandingPad, BeginLabel, EndLabel);
+    LowerCallTo(I, I.getCalledValue()->getType(),
+                   I.getCallingConv(),
+                   false,
+                   getValue(I.getOperand(0)),
+                   3);
-  // Drop into normal successor.
-  DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(),
-                          DAG.getBasicBlock(Return)));
-                         
-  // Update successor info
-  CurMBB->addSuccessor(Return);
-  CurMBB->addSuccessor(LandingPad);
+    // Insert a label before the invoke call to mark the try range.
+    // This can be used to detect deletion of the invoke via the
+    // MachineModuleInfo.
+    unsigned EndLabel = MMI->NextLabelID();
+    DAG.setRoot(DAG.getNode(ISD::LABEL, MVT::Other, getRoot(),
+                            DAG.getConstant(EndLabel, MVT::i32)));
+                           
+    // Inform MachineModuleInfo of range.   
+    MMI->addInvoke(LandingPad, BeginLabel, EndLabel);
+                           
+    // Update successor info
+    CurMBB->addSuccessor(Return);
+    CurMBB->addSuccessor(LandingPad);
+  } else {
+    // Drop into normal successor.
+    DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, getRoot(),
+                            DAG.getBasicBlock(Return)));
+  }
}
void SelectionDAGLowering::visitUnwind(UnwindInst &I) {
}
void SelectionDAGLowering::visitSwitch(SwitchInst &I) {
   // Figure out which block is immediately after the current one.
   MachineBasicBlock *NextBlock = 0;
   MachineFunction::iterator BBI = CurMBB;
@@ -4212,20 +4218,24 @@
   if (LLVMBB == &LLVMBB->getParent()->front())
     LowerArguments(LLVMBB, SDL, UnorderedChains);
   BB = FuncInfo.MBBMap[LLVMBB];
   SDL.setCurrentBasicBlock(BB);
   // Lower all of the non-terminator instructions.
   for (BasicBlock::iterator I = LLVMBB->begin(), E = --LLVMBB->end();
        I != E; ++I)
     SDL.visit(*I);
+   
+  // Lower call part of invoke.
+  InvokeInst *Invoke = dyn_cast<InvokeInst>(LLVMBB->getTerminator());
+  if (Invoke) SDL.visitInvoke(*Invoke, false);
  
   // Ensure that all instructions which are used outside of their defining
   // blocks are available as virtual registers.
   for (BasicBlock::iterator I = LLVMBB->begin(), E = LLVMBB->end(); I != E;++I)
     if (!I->use_empty() && !isa<PHINode>(I)) {
       DenseMap<const Value*, unsigned>::iterator VMI =FuncInfo.ValueMap.find(I);
       if (VMI != FuncInfo.ValueMap.end())
         UnorderedChains.push_back(
                                 SDL.CopyValueToVirtualRegister(I, VMI->second));
     }
@@ -4324,21 +4334,26 @@
       }
        
       if (i == e)
         UnorderedChains.push_back(Root);
     }
     DAG.setRoot(DAG.getNode(ISD::TokenFactor, MVT::Other,
                             &UnorderedChains[0], UnorderedChains.size()));
   }
   // Lower the terminator after the copies are emitted.
-  SDL.visit(*LLVMBB->getTerminator());
+  if (Invoke) {
+    // Just the branch part of invoke.
+    SDL.visitInvoke(*Invoke, true);
+  } else {
+    SDL.visit(*LLVMBB->getTerminator());
+  }
   // Copy over any CaseBlock records that may now exist due to SwitchInst
   // lowering, as well as any jump table information.
   SwitchCases.clear();
   SwitchCases = SDL.SwitchCases;
   JT = SDL.JT;
  
   // Make sure the root of the DAG is up-to-date.
   DAG.setRoot(SDL.getRoot());
}




------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.



More information about the llvm-bugs mailing list