Home | History | Annotate | Download | only in SimplifyCFG
      1 ; RUN: opt < %s -simplifycfg -S | FileCheck %s
      2 
      3 ; Test basic folding to a conditional branch.
      4 define i32 @foo(i64 %x, i64 %y) nounwind {
      5 ; CHECK-LABEL: @foo(
      6 entry:
      7     %eq = icmp eq i64 %x, %y
      8     br i1 %eq, label %b, label %switch
      9 switch:
     10     %lt = icmp slt i64 %x, %y
     11 ; CHECK: br i1 %lt, label %a, label %b
     12     %qux = select i1 %lt, i32 0, i32 2
     13     switch i32 %qux, label %bees [
     14         i32 0, label %a
     15         i32 1, label %b
     16         i32 2, label %b
     17     ]
     18 a:
     19     tail call void @bees.a() nounwind
     20     ret i32 1
     21 ; CHECK: b:
     22 ; CHECK-NEXT: %retval = phi i32 [ 0, %switch ], [ 2, %entry ]
     23 b:
     24     %retval = phi i32 [0, %switch], [0, %switch], [2, %entry]
     25     tail call void @bees.b() nounwind
     26     ret i32 %retval
     27 ; CHECK-NOT: bees:
     28 bees:
     29     tail call void @llvm.trap() nounwind
     30     unreachable
     31 }
     32 
     33 ; Test basic folding to an unconditional branch.
     34 define i32 @bar(i64 %x, i64 %y) nounwind {
     35 ; CHECK-LABEL: @bar(
     36 entry:
     37 ; CHECK-NEXT: entry:
     38 ; CHECK-NEXT: tail call void @bees.a() [[NUW:#[0-9]+]]
     39 ; CHECK-NEXT: ret i32 0
     40     %lt = icmp slt i64 %x, %y
     41     %qux = select i1 %lt, i32 0, i32 2
     42     switch i32 %qux, label %bees [
     43         i32 0, label %a
     44         i32 1, label %b
     45         i32 2, label %a
     46     ]
     47 a:
     48     %retval = phi i32 [0, %entry], [0, %entry], [1, %b]
     49     tail call void @bees.a() nounwind
     50     ret i32 0
     51 b:
     52     tail call void @bees.b() nounwind
     53     br label %a
     54 bees:
     55     tail call void @llvm.trap() nounwind
     56     unreachable
     57 }
     58 
     59 ; Test the edge case where both values from the select are the default case.
     60 define void @bazz(i64 %x, i64 %y) nounwind {
     61 ; CHECK-LABEL: @bazz(
     62 entry:
     63 ; CHECK-NEXT: entry:
     64 ; CHECK-NEXT: tail call void @bees.b() [[NUW]]
     65 ; CHECK-NEXT: ret void
     66     %lt = icmp slt i64 %x, %y
     67     %qux = select i1 %lt, i32 10, i32 12
     68     switch i32 %qux, label %b [
     69         i32 0, label %a
     70         i32 1, label %bees
     71         i32 2, label %bees
     72     ]
     73 a:
     74     tail call void @bees.a() nounwind
     75     ret void
     76 b:
     77     tail call void @bees.b() nounwind
     78     ret void
     79 bees:
     80     tail call void @llvm.trap()
     81     unreachable
     82 }
     83 
     84 ; Test the edge case where both values from the select are equal.
     85 define void @quux(i64 %x, i64 %y) nounwind {
     86 ; CHECK-LABEL: @quux(
     87 entry:
     88 ; CHECK-NEXT: entry:
     89 ; CHECK-NEXT: tail call void @bees.a() [[NUW]]
     90 ; CHECK-NEXT: ret void
     91     %lt = icmp slt i64 %x, %y
     92     %qux = select i1 %lt, i32 0, i32 0
     93     switch i32 %qux, label %b [
     94         i32 0, label %a
     95         i32 1, label %bees
     96         i32 2, label %bees
     97     ]
     98 a:
     99     tail call void @bees.a() nounwind
    100     ret void
    101 b:
    102     tail call void @bees.b() nounwind
    103     ret void
    104 bees:
    105     tail call void @llvm.trap()
    106     unreachable
    107 }
    108 
    109 ; A final test, for phi node munging.
    110 define i32 @xyzzy(i64 %x, i64 %y) {
    111 ; CHECK-LABEL: @xyzzy(
    112 entry:
    113     %eq = icmp eq i64 %x, %y
    114     br i1 %eq, label %r, label %cont
    115 cont:
    116 ; CHECK: %lt = icmp slt i64 %x, %y
    117     %lt = icmp slt i64 %x, %y
    118 ; CHECK-NEXT: select i1 %lt, i32 -1, i32 1
    119     %qux = select i1 %lt, i32 0, i32 2
    120     switch i32 %qux, label %bees [
    121         i32 0, label %a
    122         i32 1, label %r
    123         i32 2, label %r
    124     ]
    125 r:
    126     %val = phi i32 [0, %entry], [1, %cont], [1, %cont]
    127     ret i32 %val
    128 a:
    129     ret i32 -1
    130 ; CHECK-NOT: bees:
    131 bees:
    132     tail call void @llvm.trap()
    133     unreachable
    134 }
    135 
    136 declare void @llvm.trap() nounwind noreturn
    137 declare void @bees.a() nounwind
    138 declare void @bees.b() nounwind
    139 
    140 ; CHECK: attributes [[NUW]] = { nounwind }
    141 ; CHECK: attributes #1 = { noreturn nounwind }
    142