113 lines · plain
1; RUN: opt -passes=correlated-propagation -S < %s | FileCheck %s2 3declare void @llvm.experimental.guard(i1,...)4 5define i1 @test1(i32 %a) {6; CHECK-LABEL: @test1(7; CHECK: %alive = icmp eq i32 %a, 88; CHECK-NEXT: %result = or i1 false, %alive9 %cmp = icmp ult i32 %a, 1610 call void(i1,...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]11 %dead = icmp eq i32 %a, 1612 %alive = icmp eq i32 %a, 813 %result = or i1 %dead, %alive14 ret i1 %result15}16 17define i1 @test2(i32 %a) {18; CHECK-LABEL: @test2(19; CHECK: continue:20; CHECK-NEXT: %alive = icmp eq i32 %a, 821; CHECK-NEXT: %result = or i1 false, %alive22 %cmp = icmp ult i32 %a, 1623 call void(i1,...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]24 br label %continue25 26continue:27 %dead = icmp eq i32 %a, 1628 %alive = icmp eq i32 %a, 829 %result = or i1 %dead, %alive30 ret i1 %result31}32 33define i1 @test3(i32 %a, i1 %flag) {34; CHECK-LABEL: @test3(35; CHECK: continue:36; CHECK-NEXT: %alive.1 = icmp eq i32 %a, 1637; CHECK-NEXT: %alive.2 = icmp eq i32 %a, 838; CHECK-NEXT: %result = or i1 %alive.1, %alive.239 br i1 %flag, label %true, label %false40 41true:42 %cmp = icmp ult i32 %a, 1643 call void(i1,...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]44 br label %continue45 46false:47 br label %continue48 49continue:50 %alive.1 = icmp eq i32 %a, 1651 %alive.2 = icmp eq i32 %a, 852 %result = or i1 %alive.1, %alive.253 ret i1 %result54}55 56define i1 @test4(i32 %a, i1 %flag) {57; CHECK-LABEL: @test4(58; CHECK: continue:59; CHECK-NEXT: %alive = icmp eq i32 %a, 1260; CHECK-NEXT: %result = or i1 false, %alive61 br i1 %flag, label %true, label %false62 63true:64 %cmp.t = icmp ult i32 %a, 1665 call void(i1,...) @llvm.experimental.guard(i1 %cmp.t) [ "deopt"() ]66 br label %continue67 68false:69 %cmp.f = icmp ult i32 %a, 1270 call void(i1,...) @llvm.experimental.guard(i1 %cmp.f) [ "deopt"() ]71 br label %continue72 73continue:74 %dead = icmp eq i32 %a, 1675 %alive = icmp eq i32 %a, 1276 %result = or i1 %dead, %alive77 ret i1 %result78}79 80define i1 @test5(i32 %a) {81; CHECK-LABEL: @test5(82; CHECK: continue:83; CHECK-NEXT: %alive = icmp eq i32 %a.plus.8, 1684; CHECK-NEXT: %result = or i1 false, %alive85 %cmp = icmp ult i32 %a, 1686 call void(i1,...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]87 %a.plus.8 = add i32 %a, 888 br label %continue89 90continue:91 %dead = icmp eq i32 %a.plus.8, 2492 %alive = icmp eq i32 %a.plus.8, 1693 %result = or i1 %dead, %alive94 ret i1 %result95}96 97; Check that we handle the case when the guard is the very first instruction in98; a basic block.99define i1 @test6(i32 %a) {100; CHECK-LABEL: @test6(101; CHECK: %alive = icmp eq i32 %a, 8102; CHECK-NEXT: %result = or i1 false, %alive103 %cmp = icmp ult i32 %a, 16104 br label %continue105 106continue:107 call void(i1,...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]108 %dead = icmp eq i32 %a, 16109 %alive = icmp eq i32 %a, 8110 %result = or i1 %dead, %alive111 ret i1 %result112}113