Temporary solution: added a different set of BCTRL_Macho / BCTRL_ELF with right calle...
authorEvan Cheng <evan.cheng@apple.com>
Tue, 23 Oct 2007 06:42:42 +0000 (06:42 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 23 Oct 2007 06:42:42 +0000 (06:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43248 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelDAGToDAG.cpp
lib/Target/PowerPC/PPCInstr64Bit.td
lib/Target/PowerPC/PPCInstrInfo.td
test/CodeGen/PowerPC/2007-10-21-LocalRegAllocAssert2.ll [new file with mode: 0644]

index 730bac653a40787c7595db90ab042bba0b0dc33f..372d2387ff747884e3660ed2bbb28c49e84caf40 100644 (file)
@@ -42,11 +42,13 @@ namespace {
   class VISIBILITY_HIDDEN PPCDAGToDAGISel : public SelectionDAGISel {
     PPCTargetMachine &TM;
     PPCTargetLowering PPCLowering;
+    const PPCSubtarget &PPCSubTarget;
     unsigned GlobalBaseReg;
   public:
     PPCDAGToDAGISel(PPCTargetMachine &tm)
       : SelectionDAGISel(PPCLowering), TM(tm),
-        PPCLowering(*TM.getTargetLowering()) {}
+        PPCLowering(*TM.getTargetLowering()),
+        PPCSubTarget(*TM.getSubtargetImpl()) {}
     
     virtual bool runOnFunction(Function &Fn) {
       // Make sure we re-emit a set of the global base reg if necessary
@@ -736,7 +738,7 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDOperand Op) {
   CCReg = CurDAG->getCopyToReg(CurDAG->getEntryNode(), CR7Reg, CCReg, 
                                InFlag).getValue(1);
   
-  if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor())
+  if (PPCSubTarget.isGigaProcessor())
     IntCR = SDOperand(CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CR7Reg,
                                             CCReg), 0);
   else
@@ -859,7 +861,7 @@ SDNode *PPCDAGToDAGISel::Select(SDOperand Op) {
     SDOperand InFlag = N->getOperand(1);
     AddToISelQueue(InFlag);
     // Use MFOCRF if supported.
-    if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor())
+    if (PPCSubTarget.isGigaProcessor())
       return CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32,
                                    N->getOperand(0), InFlag);
     else
index 9d728cfc8ffd4c10fd7a0c13202ca669ee5236b9..11d90b3415574a4b682c75cfdc96436e1e9087c8 100644 (file)
@@ -81,10 +81,13 @@ let isCall = 1, PPC970_Unit = 7,
   def BL8_Macho  : IForm<18, 0, 1,
                          (outs), (ins calltarget:$func, variable_ops), 
                          "bl $func", BrB, []>;  // See Pat patterns below.
-                            
   def BLA8_Macho : IForm<18, 1, 1,
                          (outs), (ins aaddr:$func, variable_ops),
                          "bla $func", BrB, [(PPCcall_Macho (i64 imm:$func))]>;
+  def BCTRL8_Macho : XLForm_2_ext<19, 528, 20, 0, 1, 
+                                 (outs), (ins variable_ops),
+                                 "bctrl", BrB,
+                                 [(PPCbctrl_Macho)]>, Requires<[In64BitMode]>;
 }
 
 // ELF 64 ABI Calls = Macho ABI Calls
@@ -99,11 +102,14 @@ let isCall = 1, PPC970_Unit = 7,
   // Convenient aliases for call instructions
   def BL8_ELF  : IForm<18, 0, 1,
                        (outs), (ins calltarget:$func, variable_ops), 
-                       "bl $func", BrB, []>;  // See Pat patterns below.
-                            
+                       "bl $func", BrB, []>;  // See Pat patterns below.                            
   def BLA8_ELF : IForm<18, 1, 1,
                        (outs), (ins aaddr:$func, variable_ops),
                        "bla $func", BrB, [(PPCcall_ELF (i64 imm:$func))]>;
+  def BCTRL8_ELF : XLForm_2_ext<19, 528, 20, 0, 1,
+                               (outs), (ins variable_ops),
+                               "bctrl", BrB,
+                               [(PPCbctrl_ELF)]>, Requires<[In64BitMode]>;
 }
 
 
index f62f7cb0e5ec49b16b4f0a0cfa2201d0e8f0ffc6..6a08cea512e02b76e55e07acd20db0174f48fa93 100644 (file)
@@ -304,6 +304,8 @@ def iaddroff : ComplexPattern<iPTR, 1, "SelectAddrImmOffs", [], []>;
 //===----------------------------------------------------------------------===//
 // PowerPC Instruction Predicate Definitions.
 def FPContractions : Predicate<"!NoExcessFPPrecision">;
+def In32BitMode  : Predicate<"!PPCSubTarget.isPPC64()">;
+def In64BitMode  : Predicate<"PPCSubTarget.isPPC64()">;
 
 
 //===----------------------------------------------------------------------===//
@@ -409,7 +411,7 @@ let isCall = 1, PPC970_Unit = 7,
   def BCTRL_Macho : XLForm_2_ext<19, 528, 20, 0, 1, 
                                  (outs), (ins variable_ops),
                                  "bctrl", BrB,
-                                 [(PPCbctrl_Macho)]>;
+                                 [(PPCbctrl_Macho)]>, Requires<[In32BitMode]>;
 }
 
 // ELF ABI Calls.
@@ -431,7 +433,7 @@ let isCall = 1, PPC970_Unit = 7,
   def BCTRL_ELF : XLForm_2_ext<19, 528, 20, 0, 1,
                                (outs), (ins variable_ops),
                                "bctrl", BrB,
-                               [(PPCbctrl_ELF)]>;
+                               [(PPCbctrl_ELF)]>, Requires<[In32BitMode]>;
 }
 
 // DCB* instructions.
diff --git a/test/CodeGen/PowerPC/2007-10-21-LocalRegAllocAssert2.ll b/test/CodeGen/PowerPC/2007-10-21-LocalRegAllocAssert2.ll
new file mode 100644 (file)
index 0000000..80ef6f1
--- /dev/null
@@ -0,0 +1,25 @@
+; RUN: llvm-as < %s | llc -mtriple=powerpc64-apple-darwin9 -regalloc=local -relocation-model=pic
+
+       %struct.NSError = type opaque
+       %struct.NSManagedObjectContext = type opaque
+       %struct.NSString = type opaque
+       %struct.NSURL = type opaque
+       %struct._message_ref_t = type { %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*, %struct.objc_selector* }
+       %struct.objc_object = type {  }
+       %struct.objc_selector = type opaque
+@"\01L_OBJC_MESSAGE_REF_2" = external global %struct._message_ref_t            ; <%struct._message_ref_t*> [#uses=2]
+@"\01L_OBJC_MESSAGE_REF_6" = external global %struct._message_ref_t            ; <%struct._message_ref_t*> [#uses=2]
+@NSXMLStoreType = external constant %struct.NSString*          ; <%struct.NSString**> [#uses=1]
+@"\01L_OBJC_MESSAGE_REF_4" = external global %struct._message_ref_t            ; <%struct._message_ref_t*> [#uses=2]
+
+define %struct.NSManagedObjectContext* @"+[ListGenerator(Private) managedObjectContextWithModelURL:storeURL:]"(%struct.objc_object* %self, %struct._message_ref_t* %_cmd, %struct.NSURL* %modelURL, %struct.NSURL* %storeURL) {
+entry:
+       %tmp27 = load %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)** getelementptr (%struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_2", i32 0, i32 0), align 8             ; <%struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*> [#uses=1]
+       %tmp29 = call %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)* %tmp27( %struct.objc_object* null, %struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_2" )                ; <%struct.objc_object*> [#uses=0]
+       %tmp33 = load %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)** getelementptr (%struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_6", i32 0, i32 0), align 8             ; <%struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*> [#uses=1]
+       %tmp34 = load %struct.NSString** @NSXMLStoreType, align 8               ; <%struct.NSString*> [#uses=1]
+       %tmp40 = load %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)** getelementptr (%struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_4", i32 0, i32 0), align 8             ; <%struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*> [#uses=1]
+       %tmp42 = call %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)* %tmp40( %struct.objc_object* null, %struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_4", i32 1 )         ; <%struct.objc_object*> [#uses=0]
+       %tmp48 = call %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)* %tmp33( %struct.objc_object* null, %struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_6", %struct.NSString* %tmp34, i8* null, %struct.NSURL* null, %struct.objc_object* null, %struct.NSError** null )            ; <%struct.objc_object*> [#uses=0]
+       unreachable
+}