1// Test lowering FIR to LLVM IR of fir.select{|_rank|_case}
2
3// RUN: tco %s | FileCheck %s
4
5// CHECK-LABEL: @f
6func.func @f(%a : i32) -> i32 {
7   %1 = arith.constant 1 : i32
8   %2 = arith.constant 42 : i32
9// CHECK: switch i32 %{{.*}}, label %{{.*}} [
10// CHECK:   i32 1, label %{{.*}}
11// CHECK: ]
12   fir.select %a : i32 [1, ^bb2(%1:i32), unit, ^bb3(%2:i32)]
13^bb2(%3 : i32) :
14   return %3 : i32
15^bb3(%4 : i32) :
16   %5 = arith.addi %4, %4 : i32
17   // CHECK: ret i32
18   return %5 : i32
19}
20
21// CHECK-LABEL: @g
22func.func @g(%a : i32) -> i32 {
23   %1 = arith.constant 1 : i32
24   %2 = arith.constant 42 : i32
25
26// CHECK: switch i32 %{{.*}}, label %{{.*}} [
27// CHECK:  i32 1, label %{{.*}}
28// CHECK:  i32 -1, label %{{.*}}
29// CHECK: ]
30   fir.select_rank %a : i32 [1, ^bb2(%1:i32), -1, ^bb4, unit, ^bb3(%2:i32)]
31^bb2(%3 : i32) :
32   return %3 : i32
33^bb3(%4 : i32) :
34   %5 = arith.addi %4, %4 : i32
35   return %5 : i32
36^bb4:
37   // CHECK: ret i32
38   return %a : i32
39}
40
41// CHECK-LABEL: @h
42func.func @h(%a : i32) -> i32 {
43   %1 = arith.constant 1 : i32
44   %2 = arith.constant 42 : i32
45   %b1 = arith.constant 4 : i32
46   %b2 = arith.constant 14 : i32
47   %b3 = arith.constant 82 : i32
48   %b4 = arith.constant 96 : i32
49   // CHECK-DAG: icmp eq i32 %{{.*}}, 1
50   // CHECK-DAG: icmp sle i32 4, %{{.*}}
51   // CHECK-DAG: icmp sle i32 %{{.*}}, 14
52   // CHECK-DAG: icmp sle i32 82, %{{.*}}
53   // CHECK-DAG: icmp sle i32 %{{.*}}, 96
54   fir.select_case %a : i32 [#fir.point, %1, ^bb2(%1:i32), #fir.lower, %b1, ^bb4, #fir.upper, %b2, ^bb6, #fir.interval, %b3, %b4, ^bb5, unit, ^bb3(%2:i32)]
55^bb2(%3 : i32) :
56   return %3 : i32
57^bb3(%4 : i32) :
58   %5 = arith.addi %4, %4 : i32
59   cf.br ^bb2(%5 : i32)
60^bb4:
61   return %a : i32
62^bb5:
63   return %1 : i32
64^bb6:
65   %x = arith.addi %b4, %b3 : i32
66   // CHECK: ret i32
67   return %x : i32
68}
69