brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 2be61b9 Raw
144 lines · plain
1; Tests to ensure that we are not placing backedge safepoints in2; loops which are clearly finite.3;; RUN: opt < %s -passes=place-safepoints -spp-counted-loop-trip-width=32 -S | FileCheck %s4;; RUN: opt < %s -passes=place-safepoints -spp-counted-loop-trip-width=64 -S | FileCheck %s -check-prefix=COUNTED-645 6 7; A simple counted loop with trivially known range8define void @test1(i32) gc "statepoint-example" {9; CHECK-LABEL: test110; CHECK-LABEL: entry11; CHECK: call void @do_safepoint12; CHECK-LABEL: loop13; CHECK-NOT: call void @do_safepoint14; CHECK-LABEL: exit15 16entry:17  br label %loop18 19loop:20  %counter = phi i32 [ 0 , %entry ], [ %counter.inc , %loop ]21  %counter.inc = add i32 %counter, 122  %counter.cmp = icmp slt i32 %counter.inc, 1623  br i1 %counter.cmp, label %loop, label %exit24 25exit:26  ret void27}28 29; The same counted loop, but with an unknown early exit30define void @test2(i1 %c, i32) gc "statepoint-example" {31; CHECK-LABEL: test232; CHECK-LABEL: entry33; CHECK: call void @do_safepoint34; CHECK-LABEL: loop35; CHECK-NOT: call void @do_safepoint36; CHECK-LABEL: exit37 38entry:39  br label %loop40 41loop:42  %counter = phi i32 [ 0 , %entry ], [ %counter.inc , %continue ]43  %counter.inc = add i32 %counter, 144  %counter.cmp = icmp slt i32 %counter.inc, 1645  br i1 %c, label %continue, label %exit46 47continue:48  br i1 %counter.cmp, label %loop, label %exit49 50exit:51  ret void52}53 54; The range is a 8 bit value and we can't overflow55define void @test3(i8 %upper) gc "statepoint-example" {56; CHECK-LABEL: test357; CHECK-LABEL: entry58; CHECK: call void @do_safepoint59; CHECK-LABEL: loop60; CHECK-NOT: call void @do_safepoint61; CHECK-LABEL: exit62 63entry:64  br label %loop65 66loop:67  %counter = phi i8 [ 0 , %entry ], [ %counter.inc , %loop ]68  %counter.inc = add nsw i8 %counter, 169  %counter.cmp = icmp slt i8 %counter.inc, %upper70  br i1 %counter.cmp, label %loop, label %exit71 72exit:73  ret void74}75 76; The range is a 64 bit value77define void @test4(i64 %upper) gc "statepoint-example" {78; CHECK-LABEL: test479; CHECK-LABEL: entry80; CHECK: call void @do_safepoint81; CHECK-LABEL: loop82; CHECK: call void @do_safepoint83; CHECK-LABEL: exit84 85; COUNTED-64-LABEL: test486; COUNTED-64-LABEL: entry87; COUNTED-64: call void @do_safepoint88; COUNTED-64-LABEL: loop89; COUNTED-64-NOT: call void @do_safepoint90; COUNTED-64-LABEL: exit91 92entry:93  br label %loop94 95loop:96  %counter = phi i64 [ 0 , %entry ], [ %counter.inc , %loop ]97  %counter.inc = add i64 %counter, 198  %counter.cmp = icmp slt i64 %counter.inc, %upper99  br i1 %counter.cmp, label %loop, label %exit100 101exit:102  ret void103}104 105; This loop can run infinitely (for %upper == INT64_MAX) so it needs a106; safepoint.107define void @test5(i64 %upper) gc "statepoint-example" {108; CHECK-LABEL: test5109; CHECK-LABEL: entry110; CHECK: call void @do_safepoint111; CHECK-LABEL: loop112; CHECK: call void @do_safepoint113; CHECK-LABEL: exit114 115; COUNTED-64-LABEL: test5116; COUNTED-64-LABEL: entry117; COUNTED-64: call void @do_safepoint118; COUNTED-64-LABEL: loop119; COUNTED-64: call void @do_safepoint120; COUNTED-64-LABEL: exit121 122entry:123  br label %loop124 125loop:126  %counter = phi i64 [ 0 , %entry ], [ %counter.inc , %loop ]127  %counter.inc = add i64 %counter, 1128  %counter.cmp = icmp sle i64 %counter.inc, %upper129  br i1 %counter.cmp, label %loop, label %exit130 131exit:132  ret void133}134 135 136; This function is inlined when inserting a poll.137declare void @do_safepoint()138define void @gc.safepoint_poll() {139; CHECK-LABEL: gc.safepoint_poll140entry:141  call void @do_safepoint()142  ret void143}144