149 lines · plain
1; RUN: opt < %s -passes=gvn -enable-pre -S | FileCheck %s2; RUN: opt < %s -passes="gvn<pre>" -enable-pre=false -S | FileCheck %s3 4declare void @may_exit() nounwind5 6declare void @may_exit_1(i32) nounwind7 8define i32 @main(i32 %p, i32 %q) {9 10; CHECK-LABEL: @main(11 12block1:13 %cmp = icmp eq i32 %p, %q14 br i1 %cmp, label %block2, label %block315 16block2:17 %a = add i32 %p, 118 br label %block419 20block3:21 br label %block422; CHECK: %.pre = add i32 %p, 123; CHECK-NEXT: br label %block424 25block4:26 %b = add i32 %p, 127 ret i32 %b28; CHECK: %b.pre-phi = phi i32 [ %.pre, %block3 ], [ %a, %block2 ]29; CHECK-NEXT: ret i32 %b.pre-phi30}31 32; Don't PRE across implicit control flow.33define i32 @test2(i32 %p, i32 %q) {34 35; CHECK-LABEL: @test236; CHECK: block1:37 38block1:39 %cmp = icmp eq i32 %p, %q40 br i1 %cmp, label %block2, label %block341 42block2:43 %a = sdiv i32 %p, %q44 br label %block445 46block3:47 br label %block448 49; CHECK: block4:50; CHECK-NEXT: call void @may_exit(51; CHECK-NEXT: %b = sdiv52; CHECK-NEXT: ret i32 %b53 54block4:55 call void @may_exit() nounwind56 %b = sdiv i32 %p, %q57 ret i32 %b58}59 60; Don't PRE across implicit control flow.61define i32 @test3(i32 %p, i32 %q, i1 %r) {62 63; CHECK-LABEL: @test364; CHECK: block1:65 66block1:67 br i1 %r, label %block2, label %block368 69block2:70 %a = sdiv i32 %p, %q71 br label %block472 73block3:74 br label %block475 76block4:77 78; CHECK: block4:79; CHECK-NEXT: phi i3280; CHECK-NEXT: call void @may_exit_1(81; CHECK-NEXT: %b = sdiv82; CHECK-NEXT: ret i32 %b83 84 %phi = phi i32 [ 0, %block3 ], [ %a, %block2 ]85 call void @may_exit_1(i32 %phi) nounwind86 %b = sdiv i32 %p, %q87 ret i32 %b88 89}90 91; It's OK to PRE an instruction that is guaranteed to be safe to execute92; speculatively.93; TODO: Does it make any sense in this case?94define i32 @test4(i32 %p, i32 %q) {95 96; CHECK-LABEL: @test497; CHECK: block1:98 99block1:100 %cmp = icmp eq i32 %p, %q101 br i1 %cmp, label %block2, label %block3102 103block2:104 %a = sdiv i32 %p, 6105 br label %block4106 107block3:108 br label %block4109 110; CHECK: block4:111; CHECK-NEXT: %b.pre-phi = phi i32112; CHECK-NEXT: call void @may_exit(113; CHECK-NEXT: ret i32 %b114 115block4:116 call void @may_exit() nounwind117 %b = sdiv i32 %p, 6118 ret i32 %b119}120 121; It is OK to PRE across implicit control flow if we don't insert new122; instructions.123define i32 @test5(i1 %cond, i32 %p, i32 %q) {124 125; CHECK-LABEL: @test5126; CHECK: block1:127 128block1:129 br i1 %cond, label %block2, label %block3130 131block2:132 %a = sdiv i32 %p, %q133 br label %block4134 135block3:136 %b = sdiv i32 %p, %q137 br label %block4138 139; CHECK: block4:140; CHECK-NEXT: %c.pre-phi = phi i32 [ %b, %block3 ], [ %a, %block2 ]141; CHECK-NEXT: call void @may_exit()142; CHECK-NEXT: ret i32 %c.pre-phi143 144block4:145 call void @may_exit() nounwind146 %c = sdiv i32 %p, %q147 ret i32 %c148}149