From d3f3d5f0d744ddcaa8f5488d409a224c94850e87 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Mon, 9 Feb 2015 22:10:15 +0000 Subject: [PATCH] Introduce more tests for PlaceSafepoints These tests the two optimizations for backedge insertion currently implemented and the split backedge flag which is currently off by default. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228617 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../PlaceSafepoints/call-in-loop.ll | 31 +++++++ .../PlaceSafepoints/finite-loops.ll | 80 +++++++++++++++++++ .../PlaceSafepoints/split-backedge.ll | 46 +++++++++++ 3 files changed, 157 insertions(+) create mode 100644 test/Transforms/PlaceSafepoints/call-in-loop.ll create mode 100644 test/Transforms/PlaceSafepoints/finite-loops.ll create mode 100644 test/Transforms/PlaceSafepoints/split-backedge.ll diff --git a/test/Transforms/PlaceSafepoints/call-in-loop.ll b/test/Transforms/PlaceSafepoints/call-in-loop.ll new file mode 100644 index 00000000000..5e961f73fa7 --- /dev/null +++ b/test/Transforms/PlaceSafepoints/call-in-loop.ll @@ -0,0 +1,31 @@ +; If there's a call in the loop which dominates the backedge, we +; don't need a safepoint poll (since the callee must contain a +; poll test). +;; RUN: opt %s -place-safepoints -S | FileCheck %s + +declare void @foo() + +define void @test1() { +; CHECK-LABEL: test1 + +entry: +; CHECK-LABEL: entry +; CHECK: statepoint + br label %loop + +loop: +; CHECK-LABEL: loop +; CHECK: @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo +; CHECK-NOT: statepoint + call void @foo() + br label %loop +} + +; This function is inlined when inserting a poll. +declare void @do_safepoint() +define void @gc.safepoint_poll() { +; CHECK-LABEL: gc.safepoint_poll +entry: + call void @do_safepoint() + ret void +} diff --git a/test/Transforms/PlaceSafepoints/finite-loops.ll b/test/Transforms/PlaceSafepoints/finite-loops.ll new file mode 100644 index 00000000000..a66aa28fc4a --- /dev/null +++ b/test/Transforms/PlaceSafepoints/finite-loops.ll @@ -0,0 +1,80 @@ +; Tests to ensure that we are not placing backedge safepoints in +; loops which are clearly finite. +;; RUN: opt %s -place-safepoints -S | FileCheck %s + + +; A simple counted loop with trivially known range +define void @test1(i32) { +; CHECK-LABEL: test1 +; CHECK-LABEL: entry +; CHECK: statepoint +; CHECK-LABEL: loop +; CHECK-NOT: statepoint + +entry: + br label %loop + +loop: + %counter = phi i32 [ 0 , %entry ], [ %counter.inc , %loop ] + %counter.inc = add i32 %counter, 1 + %counter.cmp = icmp slt i32 %counter.inc, 16 + br i1 %counter.cmp, label %loop, label %exit + +exit: + ret void +} + +; The same counted loop, but with an unknown early exit +define void @test2(i32) { +; CHECK-LABEL: test2 +; CHECK-LABEL: entry +; CHECK: statepoint +; CHECK-LABEL: loop +; CHECK-NOT: statepoint + +entry: + br label %loop + +loop: + %counter = phi i32 [ 0 , %entry ], [ %counter.inc , %continue ] + %counter.inc = add i32 %counter, 1 + %counter.cmp = icmp slt i32 %counter.inc, 16 + br i1 undef, label %continue, label %exit + +continue: + br i1 %counter.cmp, label %loop, label %exit + +exit: + ret void +} + +; The range is a 8 bit value and we can't overflow +define void @test3(i8 %upper) { +; CHECK-LABEL: test3 +; CHECK-LABEL: entry +; CHECK: statepoint +; CHECK-LABEL: loop +; CHECK-NOT: statepoint + +entry: + br label %loop + +loop: + %counter = phi i8 [ 0 , %entry ], [ %counter.inc , %loop ] + %counter.inc = add nsw i8 %counter, 1 + %counter.cmp = icmp slt i8 %counter.inc, %upper + br i1 %counter.cmp, label %loop, label %exit + +exit: + ret void +} + + +; This function is inlined when inserting a poll. +declare void @do_safepoint() +define void @gc.safepoint_poll() { +; CHECK-LABEL: gc.safepoint_poll +entry: + call void @do_safepoint() + ret void +} diff --git a/test/Transforms/PlaceSafepoints/split-backedge.ll b/test/Transforms/PlaceSafepoints/split-backedge.ll new file mode 100644 index 00000000000..00243ae3c03 --- /dev/null +++ b/test/Transforms/PlaceSafepoints/split-backedge.ll @@ -0,0 +1,46 @@ +;; A very basic test to make sure that splitting the backedge keeps working +;; RUN: opt -place-safepoints -spp-split-backedge=1 -S %s | FileCheck %s + +define void @test(i32, i1 %cond) { +; CHECK-LABEL: @test +; CHECK-LABEL: loop.loop_crit_edge +; CHECK: gc.statepoint +; CHECK-NEXT: br label %loop +entry: + br label %loop + +loop: + br i1 %cond, label %loop, label %exit + +exit: + ret void +} + +; Test for the case where a single conditional branch jumps to two +; different loop header blocks. Since we're currently using LoopSimplfy +; this doesn't hit the interesting case, but once we remove that, we need +; to be sure this keeps working. +define void @test2(i32, i1 %cond) { +; CHECK-LABEL: @test2 +; CHECK-LABE: loop.loopexit.split +; CHECK: gc.statepoint +; CHECK-NEXT: br label %loop +; CHECK-LABEL: loop2.loop2_crit_edge +; CHECK: gc.statepoint +; CHECK-NEXT: br label %loop2 +entry: + br label %loop + +loop: + br label %loop2 + +loop2: + br i1 %cond, label %loop, label %loop2 +} + +declare void @do_safepoint() +define void @gc.safepoint_poll() { +entry: + call void @do_safepoint() + ret void +}