Fix PPC ISD::Declare isel and eliminate the need for PPCTargetLowering::LowerGlobalAd...
authorEvan Cheng <evan.cheng@apple.com>
Fri, 16 Jan 2009 22:57:32 +0000 (22:57 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 16 Jan 2009 22:57:32 +0000 (22:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62373 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelDAGToDAG.cpp
lib/Target/PowerPC/PPCISelLowering.cpp
test/CodeGen/PowerPC/2009-01-16-DeclareISelBug.ll [new file with mode: 0644]

index 0259a7280168ce13f531a645407b846520322c74..276abe77bf3b6d4929156e90228f65a5466ed9eb 100644 (file)
@@ -1100,6 +1100,26 @@ SDNode *PPCDAGToDAGISel::Select(SDValue Op) {
                                             Chain), 0);
     return CurDAG->SelectNodeTo(N, PPC::BCTR, MVT::Other, Chain);
   }
+  case ISD::DECLARE: {
+    SDValue Chain = N->getOperand(0);
+    SDValue N1 = N->getOperand(1);
+    SDValue N2 = N->getOperand(2);
+    FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(N1);
+    if (!FINode)
+      break;
+    if (N2.getOpcode() == ISD::ADD &&
+        N2.getOperand(0).getOpcode() == PPCISD::Hi &&
+        N2.getOperand(1).getOpcode() == PPCISD::Lo)
+      N2 = N2.getOperand(0).getOperand(0);
+    if (!isa<GlobalAddressSDNode>(N2))
+      break;
+    int FI = cast<FrameIndexSDNode>(N1)->getIndex();
+    GlobalValue *GV = cast<GlobalAddressSDNode>(N2)->getGlobal();
+    SDValue Tmp1 = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
+    SDValue Tmp2 = CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());
+    return CurDAG->SelectNodeTo(N, TargetInstrInfo::DECLARE,
+                                MVT::Other, Tmp1, Tmp2, Chain);
+  }
   }
   
   return SelectCode(Op);
index c31daccbd55b02183f4ab91e1876aa63bd74d21f..67c253654677c8ab6c64ddcd49c7eb1b875f2804 100644 (file)
@@ -1134,14 +1134,11 @@ SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op,
 }
 
 SDValue PPCTargetLowering::LowerGlobalAddress(SDValue Op, 
-                                                SelectionDAG &DAG) {
+                                              SelectionDAG &DAG) {
   MVT PtrVT = Op.getValueType();
   GlobalAddressSDNode *GSDN = cast<GlobalAddressSDNode>(Op);
   GlobalValue *GV = GSDN->getGlobal();
   SDValue GA = DAG.getTargetGlobalAddress(GV, PtrVT, GSDN->getOffset());
-  // If it's a debug information descriptor, don't mess with it.
-  if (DAG.isVerifiedDebugInfoDesc(Op))
-    return GA;
   SDValue Zero = DAG.getConstant(0, PtrVT);
   
   const TargetMachine &TM = DAG.getTarget();
diff --git a/test/CodeGen/PowerPC/2009-01-16-DeclareISelBug.ll b/test/CodeGen/PowerPC/2009-01-16-DeclareISelBug.ll
new file mode 100644 (file)
index 0000000..0cf5518
--- /dev/null
@@ -0,0 +1,19 @@
+; RUN: llvm-as < %s | llc -mtriple=powerpc-apple-darwin9.5
+; rdar://6499616
+
+       %llvm.dbg.anchor.type = type { i32, i32 }
+       %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8* }
+@llvm.dbg.compile_units = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 17 }               ; <%llvm.dbg.anchor.type*> [#uses=1]
+@.str = internal constant [11 x i8] c"testcase.c\00"           ; <[11 x i8]*> [#uses=1]
+@.str1 = internal constant [30 x i8] c"/Volumes/SandBox/NightlyTest/\00"               ; <[30 x i8]*> [#uses=1]
+@.str2 = internal constant [57 x i8] c"4.2.1 (Based on Apple Inc. build 5628) (LLVM build 9999)\00"            ; <[57 x i8]*> [#uses=1]
+@llvm.dbg.compile_unit = internal constant %llvm.dbg.compile_unit.type { i32 458769, { }* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.compile_units to { }*), i32 1, i8* getelementptr ([11 x i8]* @.str, i32 0, i32 0), i8* getelementptr ([30 x i8]* @.str1, i32 0, i32 0), i8* getelementptr ([57 x i8]* @.str2, i32 0, i32 0) }              ; <%llvm.dbg.compile_unit.type*> [#uses=0]
+@"\01LC" = internal constant [13 x i8] c"conftest.val\00"              ; <[13 x i8]*> [#uses=1]
+
+define i32 @main() nounwind {
+entry:
+       %0 = call i8* @fopen(i8* getelementptr ([13 x i8]* @"\01LC", i32 0, i32 0), i8* null) nounwind          ; <i8*> [#uses=0]
+       unreachable
+}
+
+declare i8* @fopen(i8*, i8*)