diff options
author | Philip Reames <listmail@philipreames.com> | 2015-02-20 18:56:14 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2015-02-20 18:56:14 +0000 |
commit | 2ef029c7ae2d3ef31d71b179035a3f59f6b77386 (patch) | |
tree | 9bdc8d4513d78f31cbf50a85cf1be9b087423354 | |
parent | 9cda4b7ed941750dde35d9a289a5c00aa1f6c872 (diff) | |
download | bcm5719-llvm-2ef029c7ae2d3ef31d71b179035a3f59f6b77386.tar.gz bcm5719-llvm-2ef029c7ae2d3ef31d71b179035a3f59f6b77386.zip |
Bugfix for 229954
Before calling Function::getGC to test for enablement, we need to make sure there's actually a GC at all via Function::hasGC. Otherwise, we'd crash on functions without a GC. Thankfully, this only mattered if you manually scheduled the pass, but still, oops. :(
llvm-svn: 230040
-rw-r--r-- | llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Transforms/RewriteStatepointsForGC/basics.ll | 11 |
2 files changed, 16 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp index 052a149ae26..e3859bcb673 100644 --- a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp +++ b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp @@ -1911,8 +1911,11 @@ static bool insertParsePoints(Function &F, DominatorTree &DT, Pass *P, /// point of this function is as an extension point for custom logic. static bool shouldRewriteStatepointsIn(Function &F) { // TODO: This should check the GCStrategy - const std::string StatepointExampleName("statepoint-example"); - return StatepointExampleName == F.getGC(); + if (F.hasGC()) { + const std::string StatepointExampleName("statepoint-example"); + return StatepointExampleName == F.getGC(); + } else + return false; } bool RewriteStatepointsForGC::runOnFunction(Function &F) { diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/basics.ll b/llvm/test/Transforms/RewriteStatepointsForGC/basics.ll index 7454ea1d403..ec522abd912 100644 --- a/llvm/test/Transforms/RewriteStatepointsForGC/basics.ll +++ b/llvm/test/Transforms/RewriteStatepointsForGC/basics.ll @@ -74,4 +74,15 @@ merge: ret i8 addrspace(1)* %obj } +; When run over a function which doesn't opt in, should do nothing! +define i8 addrspace(1)* @test5(i8 addrspace(1)* %obj) { +; CHECK-LABEL: @test5 +; CHECK-LABEL: entry: +; CHECK-NEXT: gc.statepoint +; CHECK-NOT: %obj.relocated = call coldcc i8 addrspace(1)* +entry: + call i32 (void ()*, i32, i32, ...)* @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0) + ret i8 addrspace(1)* %obj +} + declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...) |