xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/narrow-switch.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; Vary legal integer types in data layout.
3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S -default-data-layout=n32    | FileCheck %s --check-prefix=ALL --check-prefix=CHECK32
4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S -default-data-layout=n32:64 | FileCheck %s --check-prefix=ALL --check-prefix=CHECK64
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; In all cases, the data-layout is irrelevant. We should shrink as much as possible in InstCombine
7*9880d681SAndroid Build Coastguard Worker; and allow the backend to expand as much as needed to ensure optimal codegen for any target.
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine i32 @positive1(i64 %a) {
10*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: @positive1(
11*9880d681SAndroid Build Coastguard Worker; ALL:         switch i32
12*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i32 10, label %return
13*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i32 100, label %sw.bb1
14*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i32 1001, label %sw.bb2
15*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    ]
16*9880d681SAndroid Build Coastguard Worker;
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  %and = and i64 %a, 4294967295
19*9880d681SAndroid Build Coastguard Worker  switch i64 %and, label %sw.default [
20*9880d681SAndroid Build Coastguard Worker  i64 10, label %return
21*9880d681SAndroid Build Coastguard Worker  i64 100, label %sw.bb1
22*9880d681SAndroid Build Coastguard Worker  i64 1001, label %sw.bb2
23*9880d681SAndroid Build Coastguard Worker  ]
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workersw.bb1:
26*9880d681SAndroid Build Coastguard Worker  br label %return
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workersw.bb2:
29*9880d681SAndroid Build Coastguard Worker  br label %return
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workersw.default:
32*9880d681SAndroid Build Coastguard Worker  br label %return
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerreturn:
35*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
36*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine i32 @negative1(i64 %a) {
40*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: @negative1(
41*9880d681SAndroid Build Coastguard Worker; ALL:         switch i32
42*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i32 -10, label %return
43*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i32 -100, label %sw.bb1
44*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i32 -1001, label %sw.bb2
45*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    ]
46*9880d681SAndroid Build Coastguard Worker;
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker  %or = or i64 %a, -4294967296
49*9880d681SAndroid Build Coastguard Worker  switch i64 %or, label %sw.default [
50*9880d681SAndroid Build Coastguard Worker  i64 -10, label %return
51*9880d681SAndroid Build Coastguard Worker  i64 -100, label %sw.bb1
52*9880d681SAndroid Build Coastguard Worker  i64 -1001, label %sw.bb2
53*9880d681SAndroid Build Coastguard Worker  ]
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workersw.bb1:
56*9880d681SAndroid Build Coastguard Worker  br label %return
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Workersw.bb2:
59*9880d681SAndroid Build Coastguard Worker  br label %return
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workersw.default:
62*9880d681SAndroid Build Coastguard Worker  br label %return
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerreturn:
65*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
66*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; Make sure truncating a constant int larger than 64-bit doesn't trigger an
70*9880d681SAndroid Build Coastguard Worker; assertion.
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine i32 @trunc72to68(i72 %a) {
73*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: @trunc72to68(
74*9880d681SAndroid Build Coastguard Worker; ALL:         switch i68
75*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i68 10, label %return
76*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i68 100, label %sw.bb1
77*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i68 1001, label %sw.bb2
78*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    ]
79*9880d681SAndroid Build Coastguard Worker;
80*9880d681SAndroid Build Coastguard Workerentry:
81*9880d681SAndroid Build Coastguard Worker  %and = and i72 %a, 295147905179352825855
82*9880d681SAndroid Build Coastguard Worker  switch i72 %and, label %sw.default [
83*9880d681SAndroid Build Coastguard Worker  i72 10, label %return
84*9880d681SAndroid Build Coastguard Worker  i72 100, label %sw.bb1
85*9880d681SAndroid Build Coastguard Worker  i72 1001, label %sw.bb2
86*9880d681SAndroid Build Coastguard Worker  ]
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workersw.bb1:
89*9880d681SAndroid Build Coastguard Worker  br label %return
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workersw.bb2:
92*9880d681SAndroid Build Coastguard Worker  br label %return
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workersw.default:
95*9880d681SAndroid Build Coastguard Worker  br label %return
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerreturn:
98*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
99*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; Make sure to avoid assertion crashes and use the type before
103*9880d681SAndroid Build Coastguard Worker; truncation to generate the sub constant expressions that leads
104*9880d681SAndroid Build Coastguard Worker; to the recomputed condition.
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdefine void @trunc64to59(i64 %a) {
107*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: @trunc64to59(
108*9880d681SAndroid Build Coastguard Worker; ALL:         switch i59
109*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i59 0, label %sw.bb1
110*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    i59 18717182647723699, label %sw.bb2
111*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    ]
112*9880d681SAndroid Build Coastguard Worker;
113*9880d681SAndroid Build Coastguard Workerentry:
114*9880d681SAndroid Build Coastguard Worker  %tmp0 = and i64 %a, 15
115*9880d681SAndroid Build Coastguard Worker  %tmp1 = mul i64 %tmp0, -6425668444178048401
116*9880d681SAndroid Build Coastguard Worker  %tmp2 = add i64 %tmp1, 5170979678563097242
117*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp2, 1627972535142754813
118*9880d681SAndroid Build Coastguard Worker  switch i64 %tmp3, label %sw.default [
119*9880d681SAndroid Build Coastguard Worker  i64 847514119312061490, label %sw.bb1
120*9880d681SAndroid Build Coastguard Worker  i64 866231301959785189, label %sw.bb2
121*9880d681SAndroid Build Coastguard Worker  ]
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workersw.bb1:
124*9880d681SAndroid Build Coastguard Worker  br label %sw.default
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workersw.bb2:
127*9880d681SAndroid Build Coastguard Worker  br label %sw.default
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workersw.default:
130*9880d681SAndroid Build Coastguard Worker  ret void
131*9880d681SAndroid Build Coastguard Worker}
132