From ffac17a223386c7e68cb58422aa2891dbad1f5f7 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Sat, 1 Sep 2007 02:00:51 +0000 Subject: [PATCH] Fix a gcroot lowering bug. llvm-svn: 41668 --- llvm/lib/Transforms/Scalar/LowerGC.cpp | 7 +++++-- llvm/test/CodeGen/Generic/GC/lower_gcroot.ll | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/Generic/GC/lower_gcroot.ll diff --git a/llvm/lib/Transforms/Scalar/LowerGC.cpp b/llvm/lib/Transforms/Scalar/LowerGC.cpp index e1576845dc2a..0da1d9199ba4 100644 --- a/llvm/lib/Transforms/Scalar/LowerGC.cpp +++ b/llvm/lib/Transforms/Scalar/LowerGC.cpp @@ -262,7 +262,7 @@ bool LowerGC::runOnFunction(Function &F) { cast(GCRootInt->getFunctionType()->getParamType(0)); Constant *Null = ConstantPointerNull::get(PtrLocTy); - // Initialize all of the gcroot records now, and eliminate them as we go. + // Initialize all of the gcroot records now. for (unsigned i = 0, e = GCRoots.size(); i != e; ++i) { // Initialize the meta-data pointer. Par[2] = ConstantInt::get(Type::Int32Ty, i); @@ -282,7 +282,6 @@ bool LowerGC::runOnFunction(Function &F) { new StoreInst(Constant::getNullValue(PtrLocTy->getElementType()), GCRoots[i]->getOperand(1), GCRoots[i]); new StoreInst(GCRoots[i]->getOperand(1), RootPtrPtr, GCRoots[i]); - GCRoots[i]->getParent()->getInstList().erase(GCRoots[i]); } // Now that the record is all initialized, store the pointer into the global @@ -290,6 +289,10 @@ bool LowerGC::runOnFunction(Function &F) { Value *C = new BitCastInst(AI, PointerType::get(MainRootRecordType), "", IP); new StoreInst(C, RootChain, IP); + // Eliminate all the gcroot records now. + for (unsigned i = 0, e = GCRoots.size(); i != e; ++i) + GCRoots[i]->getParent()->getInstList().erase(GCRoots[i]); + // On exit from the function we have to remove the entry from the GC root // chain. Doing this is straight-forward for return and unwind instructions: // just insert the appropriate copy. diff --git a/llvm/test/CodeGen/Generic/GC/lower_gcroot.ll b/llvm/test/CodeGen/Generic/GC/lower_gcroot.ll new file mode 100644 index 000000000000..3a3abac25854 --- /dev/null +++ b/llvm/test/CodeGen/Generic/GC/lower_gcroot.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | llc + + %Env = type opaque* + +define void @.main(%Env) { + call void @llvm.gcroot( %Env* null, %Env null ) + unreachable +} + +declare void @llvm.gcroot(%Env*, %Env)