Strip the pointer casts off of allocas so that the selection DAG can find them.
authorBill Wendling <isanbard@gmail.com>
Tue, 1 May 2012 22:50:45 +0000 (22:50 +0000)
committerBill Wendling <isanbard@gmail.com>
Tue, 1 May 2012 22:50:45 +0000 (22:50 +0000)
PR10799

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155954 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
test/CodeGen/X86/GC/cg-O0.ll [new file with mode: 0644]

index 94cb95804f6900b608b8fe94a01f55e2911c937d..f1e879be9567ee44aca9ad119f1a8ddfdcec1751 100644 (file)
@@ -5050,7 +5050,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
   }
   case Intrinsic::gcroot:
     if (GFI) {
-      const Value *Alloca = I.getArgOperand(0);
+      const Value *Alloca = I.getArgOperand(0)->stripPointerCasts();
       const Constant *TypeMap = cast<Constant>(I.getArgOperand(1));
 
       FrameIndexSDNode *FI = cast<FrameIndexSDNode>(getValue(Alloca).getNode());
diff --git a/test/CodeGen/X86/GC/cg-O0.ll b/test/CodeGen/X86/GC/cg-O0.ll
new file mode 100644 (file)
index 0000000..b492942
--- /dev/null
@@ -0,0 +1,17 @@
+; RUN: llc < %s -O0
+
+define i32 @main() {
+entry:
+  call void @f()
+  ret i32 0
+}
+
+define void @f() gc "ocaml" {
+entry:
+  %ptr.stackref = alloca i8*
+  %gcroot = bitcast i8** %ptr.stackref to i8**
+  call void @llvm.gcroot(i8** %gcroot, i8* null)
+  ret void
+}
+
+declare void @llvm.gcroot(i8**, i8*) nounwind