121 lines · plain
1; RUN: opt -passes=licm < %s -S | FileCheck %s2; RUN: opt -aa-pipeline=basic-aa -passes='require<aa>,require<target-ir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' < %s -S | FileCheck %s3 4define void @test1(i64 %n) {5; CHECK-LABEL: @test16; CHECK: fence7; CHECK-LABEL: loop:8entry:9 br label %loop10loop:11 %iv = phi i64 [0, %entry], [%iv.next, %loop]12 fence release13 %iv.next = add i64 %iv, 114 %test = icmp slt i64 %iv, %n15 br i1 %test, label %loop, label %exit16exit:17 ret void18}19 20define void @test2(i64 %n) {21; CHECK-LABEL: @test222; CHECK: fence23; CHECK-LABEL: loop:24entry:25 br label %loop26loop:27 %iv = phi i64 [0, %entry], [%iv.next, %loop]28 fence acquire29 %iv.next = add i64 %iv, 130 %test = icmp slt i64 %iv, %n31 br i1 %test, label %loop, label %exit32exit:33 ret void34}35 36define void @test3(i64 %n) {37; CHECK-LABEL: @test338; CHECK: fence39; CHECK-LABEL: loop:40entry:41 br label %loop42loop:43 %iv = phi i64 [0, %entry], [%iv.next, %loop]44 fence acq_rel45 %iv.next = add i64 %iv, 146 %test = icmp slt i64 %iv, %n47 br i1 %test, label %loop, label %exit48exit:49 ret void50}51 52define void @test4(i64 %n) {53; CHECK-LABEL: @test454; CHECK: fence55; CHECK-LABEL: loop:56entry:57 br label %loop58loop:59 %iv = phi i64 [0, %entry], [%iv.next, %loop]60 fence seq_cst61 %iv.next = add i64 %iv, 162 %test = icmp slt i64 %iv, %n63 br i1 %test, label %loop, label %exit64exit:65 ret void66}67 68define void @testneg1(i64 %n, ptr %p) {69; CHECK-LABEL: @testneg170; CHECK-LABEL: loop:71; CHECK: fence72entry:73 br label %loop74loop:75 %iv = phi i64 [0, %entry], [%iv.next, %loop]76 store i64 %iv, ptr %p77 fence release78 %iv.next = add i64 %iv, 179 %test = icmp slt i64 %iv, %n80 br i1 %test, label %loop, label %exit81exit:82 ret void83}84 85define void @testneg2(ptr %p) {86; CHECK-LABEL: @testneg287; CHECK-LABEL: loop:88; CHECK: fence89entry:90 br label %loop91loop:92 %iv = phi i64 [0, %entry], [%iv.next, %loop]93 fence acquire94 %n = load i64, ptr %p95 %iv.next = add i64 %iv, 196 %test = icmp slt i64 %iv, %n97 br i1 %test, label %loop, label %exit98exit:99 ret void100}101 102; Note: While a false negative for LICM on it's own, O3 does get this103; case by combining the fences.104define void @testfn1(i64 %n, ptr %p) {105; CHECK-LABEL: @testfn1106; CHECK-LABEL: loop:107; CHECK: fence108entry:109 br label %loop110loop:111 %iv = phi i64 [0, %entry], [%iv.next, %loop]112 fence release113 fence release114 %iv.next = add i64 %iv, 1115 %test = icmp slt i64 %iv, %n116 br i1 %test, label %loop, label %exit117exit:118 ret void119}120 121