xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/X86/switch-phi-const.ll (revision 02b02cd050273bae5c6d3e5f9f6a30067839bff6)
1f0ea9c9cSMatthias Braun; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2f0ea9c9cSMatthias Braun; RUN: opt %s -mtriple=x86_64-- -codegenprepare -S | FileCheck %s
3f0ea9c9cSMatthias Braun@g = global i32 0
4f0ea9c9cSMatthias Braun@effect = global i32 0
5f0ea9c9cSMatthias Braun
6f0ea9c9cSMatthias Braundefine void @switch_phi_const(i32 %x) {
7f0ea9c9cSMatthias Braun; CHECK-LABEL: @switch_phi_const(
8f0ea9c9cSMatthias Braun; CHECK-NEXT:  bb0:
9f0ea9c9cSMatthias Braun; CHECK-NEXT:    switch i32 [[X:%.*]], label [[DEFAULT:%.*]] [
10f0ea9c9cSMatthias Braun; CHECK-NEXT:    i32 13, label [[CASE_13:%.*]]
11f0ea9c9cSMatthias Braun; CHECK-NEXT:    i32 42, label [[CASE_42:%.*]]
12f0ea9c9cSMatthias Braun; CHECK-NEXT:    i32 50, label [[CASE_50_51:%.*]]
13f0ea9c9cSMatthias Braun; CHECK-NEXT:    i32 51, label [[CASE_50_51]]
14f0ea9c9cSMatthias Braun; CHECK-NEXT:    i32 55, label [[CASE_55:%.*]]
15f0ea9c9cSMatthias Braun; CHECK-NEXT:    i32 7, label [[CASE_7:%.*]]
16f0ea9c9cSMatthias Braun; CHECK-NEXT:    ]
17f0ea9c9cSMatthias Braun; CHECK:       case_13:
18f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[X0:%.*]] = phi i32 [ [[X]], [[BB0:%.*]] ], [ [[X_LOOPBACK:%.*]], [[CASE_7]] ]
19d9e51e75SMatt Arsenault; CHECK-NEXT:    store i32 13, ptr @effect, align 4
20f0ea9c9cSMatthias Braun; CHECK-NEXT:    br label [[CASE_42]]
21f0ea9c9cSMatthias Braun; CHECK:       case_42:
22f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[X1:%.*]] = phi i32 [ [[X]], [[BB0]] ], [ [[X0]], [[CASE_13]] ]
23d9e51e75SMatt Arsenault; CHECK-NEXT:    store i32 [[X1]], ptr @effect, align 4
24f0ea9c9cSMatthias Braun; CHECK-NEXT:    br label [[CASE_50_51]]
25f0ea9c9cSMatthias Braun; CHECK:       case_50_51:
26f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[X2:%.*]] = phi i32 [ 50, [[BB0]] ], [ 50, [[BB0]] ], [ [[X1]], [[CASE_42]] ]
27f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[X2_2:%.*]] = phi i32 [ 51, [[BB0]] ], [ 51, [[BB0]] ], [ [[X1]], [[CASE_42]] ]
28d9e51e75SMatt Arsenault; CHECK-NEXT:    store i32 [[X2]], ptr @effect, align 4
29d9e51e75SMatt Arsenault; CHECK-NEXT:    store i32 [[X2_2]], ptr @effect, align 4
30f0ea9c9cSMatthias Braun; CHECK-NEXT:    br label [[CASE_55]]
31f0ea9c9cSMatthias Braun; CHECK:       case_55:
32f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[X3:%.*]] = phi i32 [ 42, [[BB0]] ], [ 55, [[CASE_50_51]] ]
33d9e51e75SMatt Arsenault; CHECK-NEXT:    store i32 [[X3]], ptr @effect, align 4
34f0ea9c9cSMatthias Braun; CHECK-NEXT:    br label [[DEFAULT]]
35f0ea9c9cSMatthias Braun; CHECK:       case_7:
36d9e51e75SMatt Arsenault; CHECK-NEXT:    [[X_LOOPBACK]] = load i32, ptr @g, align 4
37d9e51e75SMatt Arsenault; CHECK-NEXT:    store i32 7, ptr @effect, align 4
38f0ea9c9cSMatthias Braun; CHECK-NEXT:    br label [[CASE_13]]
39f0ea9c9cSMatthias Braun; CHECK:       default:
40f0ea9c9cSMatthias Braun; CHECK-NEXT:    ret void
41f0ea9c9cSMatthias Braun;
42f0ea9c9cSMatthias Braunbb0:
43f0ea9c9cSMatthias Braun  switch i32 %x, label %default [
44f0ea9c9cSMatthias Braun  i32 13, label %case_13
45f0ea9c9cSMatthias Braun  i32 42, label %case_42
46f0ea9c9cSMatthias Braun  i32 50, label %case_50_51
47f0ea9c9cSMatthias Braun  i32 51, label %case_50_51
48f0ea9c9cSMatthias Braun  i32 55, label %case_55
49f0ea9c9cSMatthias Braun  i32 7, label %case_7
50f0ea9c9cSMatthias Braun  ]
51f0ea9c9cSMatthias Braun
52f0ea9c9cSMatthias Brauncase_13:
53f0ea9c9cSMatthias Braun  ; We should replace 13 with %x
54f0ea9c9cSMatthias Braun  %x0 = phi i32 [ 13, %bb0 ], [ %x_loopback, %case_7 ]
55d9e51e75SMatt Arsenault  store i32 13, ptr @effect, align 4
56f0ea9c9cSMatthias Braun  br label %case_42
57f0ea9c9cSMatthias Braun
58f0ea9c9cSMatthias Brauncase_42:
59f0ea9c9cSMatthias Braun  ; We should replace 42 with %x
60f0ea9c9cSMatthias Braun  %x1 = phi i32 [ 42, %bb0 ], [ %x0, %case_13 ]
61d9e51e75SMatt Arsenault  store i32 %x1, ptr @effect, align 4
62f0ea9c9cSMatthias Braun  br label %case_50_51
63f0ea9c9cSMatthias Braun
64f0ea9c9cSMatthias Brauncase_50_51:
65f0ea9c9cSMatthias Braun  ; Must not replace the PHI argument: Case values 50 and 51 jump here.
66f0ea9c9cSMatthias Braun  %x2 = phi i32 [ 50, %bb0 ], [ 50, %bb0 ], [ %x1, %case_42 ]
67f0ea9c9cSMatthias Braun  %x2.2 = phi i32 [ 51, %bb0 ], [ 51, %bb0 ], [ %x1, %case_42 ]
68d9e51e75SMatt Arsenault  store i32 %x2, ptr @effect, align 4
69d9e51e75SMatt Arsenault  store i32 %x2.2, ptr @effect, align 4
70f0ea9c9cSMatthias Braun  br label %case_55
71f0ea9c9cSMatthias Braun
72f0ea9c9cSMatthias Brauncase_55:
73f0ea9c9cSMatthias Braun  ; We must not replace any of the PHI arguments:
74f0ea9c9cSMatthias Braun  ; - 42 is the wrong constant
75f0ea9c9cSMatthias Braun  ; - %case_42 is not the switch predecessor block.
76f0ea9c9cSMatthias Braun  %x3 = phi i32 [ 42, %bb0 ], [ 55, %case_50_51 ]
77d9e51e75SMatt Arsenault  store i32 %x3, ptr @effect, align 4
78f0ea9c9cSMatthias Braun  br label %default
79f0ea9c9cSMatthias Braun
80f0ea9c9cSMatthias Brauncase_7:
81d9e51e75SMatt Arsenault  %x_loopback = load i32, ptr @g, align 4
82d9e51e75SMatt Arsenault  store i32 7, ptr @effect, align 4
83f0ea9c9cSMatthias Braun  br label %case_13
84f0ea9c9cSMatthias Braun
85f0ea9c9cSMatthias Braundefault:
86f0ea9c9cSMatthias Braun  ret void
87f0ea9c9cSMatthias Braun}
88f0ea9c9cSMatthias Braun
89*02b02cd0SNikita Popovdefine void @switch_phi_const_multiple_phis(i32 %x, i1 %c) {
90f0ea9c9cSMatthias Braun; CHECK-LABEL: @switch_phi_const_multiple_phis(
91f0ea9c9cSMatthias Braun; CHECK-NEXT:  bb0:
92*02b02cd0SNikita Popov; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB1:%.*]], label [[CASE_13:%.*]]
93f0ea9c9cSMatthias Braun; CHECK:       bb1:
94f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[X:%.*]], 13
95f0ea9c9cSMatthias Braun; CHECK-NEXT:    br i1 [[COND]], label [[CASE_13]], label [[DEFAULT:%.*]]
96f0ea9c9cSMatthias Braun; CHECK:       case_13:
97f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[X0:%.*]] = phi i32 [ [[X]], [[BB1]] ], [ 1, [[BB0:%.*]] ]
98f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[N0:%.*]] = phi i32 [ 14, [[BB1]] ], [ 1, [[BB0]] ]
99f0ea9c9cSMatthias Braun; CHECK-NEXT:    [[X1:%.*]] = phi i32 [ 27, [[BB0]] ], [ [[X]], [[BB1]] ]
100d9e51e75SMatt Arsenault; CHECK-NEXT:    store volatile i32 [[X0]], ptr @effect, align 4
101d9e51e75SMatt Arsenault; CHECK-NEXT:    store volatile i32 [[N0]], ptr @effect, align 4
102d9e51e75SMatt Arsenault; CHECK-NEXT:    store volatile i32 [[X1]], ptr @effect, align 4
103f0ea9c9cSMatthias Braun; CHECK-NEXT:    ret void
104f0ea9c9cSMatthias Braun; CHECK:       default:
105f0ea9c9cSMatthias Braun; CHECK-NEXT:    ret void
106f0ea9c9cSMatthias Braun;
107f0ea9c9cSMatthias Braunbb0:
108*02b02cd0SNikita Popov  br i1 %c, label %bb1, label %case_13
109f0ea9c9cSMatthias Braun
110f0ea9c9cSMatthias Braunbb1:
111f0ea9c9cSMatthias Braun  switch i32 %x, label %default [
112f0ea9c9cSMatthias Braun  i32 13, label %case_13
113f0ea9c9cSMatthias Braun  ]
114f0ea9c9cSMatthias Braun
115f0ea9c9cSMatthias Brauncase_13:
116f0ea9c9cSMatthias Braun  ; Check that replacement works for multiple PHIs.
117f0ea9c9cSMatthias Braun  ; Should perform replacement for %x0, %x1 but not %n0
118f0ea9c9cSMatthias Braun  %x0 = phi i32 [13, %bb1], [1, %bb0]
119f0ea9c9cSMatthias Braun  %n0 = phi i32 [14, %bb1], [1, %bb0]
120f0ea9c9cSMatthias Braun  %x1 = phi i32 [27, %bb0], [13, %bb1]
121d9e51e75SMatt Arsenault  store volatile i32 %x0, ptr @effect, align 4
122d9e51e75SMatt Arsenault  store volatile i32 %n0, ptr @effect, align 4
123d9e51e75SMatt Arsenault  store volatile i32 %x1, ptr @effect, align 4
124f0ea9c9cSMatthias Braun  ret void
125f0ea9c9cSMatthias Braun
126f0ea9c9cSMatthias Braundefault:
127f0ea9c9cSMatthias Braun  ret void
128f0ea9c9cSMatthias Braun}
129de9ad98dSMatthias Braun
130*02b02cd0SNikita Popovdefine void @switch_phi_const_degenerate(i1 %c) {
131de9ad98dSMatthias Braun; CHECK-LABEL: @switch_phi_const_degenerate(
132de9ad98dSMatthias Braun; CHECK-NEXT:  bb0:
133*02b02cd0SNikita Popov; CHECK-NEXT:    br i1 [[C:%.*]], label [[CASE_42:%.*]], label [[BB1:%.*]]
134de9ad98dSMatthias Braun; CHECK:       bb1:
135de9ad98dSMatthias Braun; CHECK-NEXT:    br label [[CASE_42]]
136de9ad98dSMatthias Braun; CHECK:       case_42:
137de9ad98dSMatthias Braun; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[BB0:%.*]] ], [ 42, [[BB1]] ]
138d9e51e75SMatt Arsenault; CHECK-NEXT:    store volatile i32 [[X]], ptr @effect, align 4
139de9ad98dSMatthias Braun; CHECK-NEXT:    ret void
140de9ad98dSMatthias Braun;
141de9ad98dSMatthias Braunbb0:
142*02b02cd0SNikita Popov  br i1 %c, label %case_42, label %bb1
143de9ad98dSMatthias Braun
144de9ad98dSMatthias Braunbb1:
145de9ad98dSMatthias Braun  switch i32 42, label %unreachable [
146de9ad98dSMatthias Braun  i32 42, label %case_42
147de9ad98dSMatthias Braun  ]
148de9ad98dSMatthias Braun
149de9ad98dSMatthias Brauncase_42:
150de9ad98dSMatthias Braun  ; We should not end up in an endless loop 42 with the switch condition 42.
151de9ad98dSMatthias Braun  %x = phi i32 [0, %bb0], [42, %bb1]
152d9e51e75SMatt Arsenault  store volatile i32 %x, ptr @effect, align 4
153de9ad98dSMatthias Braun  ret void
154de9ad98dSMatthias Braun
155de9ad98dSMatthias Braununreachable:
156de9ad98dSMatthias Braun  unreachable
157de9ad98dSMatthias Braun}
1588d03c49fSMatthias Braun
1598d03c49fSMatthias Braun@g64 = global i64 0
1608d03c49fSMatthias Braun@effect64 = global i64 0
1618d03c49fSMatthias Braun
1628d03c49fSMatthias Braundefine void @switch_trunc_phi_const(i32 %x) {
1638d03c49fSMatthias Braun; CHECK-LABEL: @switch_trunc_phi_const(
1648d03c49fSMatthias Braun; CHECK-NEXT:  bb0:
1658d03c49fSMatthias Braun; CHECK-NEXT:    [[TMP0:%.*]] = zext i32 [[X:%.*]] to i64
1668d03c49fSMatthias Braun; CHECK-NEXT:    [[TMP1:%.*]] = zext i32 [[X]] to i64
1678d03c49fSMatthias Braun; CHECK-NEXT:    switch i32 [[X]], label [[DEFAULT:%.*]] [
1688d03c49fSMatthias Braun; CHECK-NEXT:    i32 13, label [[CASE_13:%.*]]
1698d03c49fSMatthias Braun; CHECK-NEXT:    i32 42, label [[CASE_42:%.*]]
1708d03c49fSMatthias Braun; CHECK-NEXT:    i32 55, label [[CASE_55:%.*]]
1718d03c49fSMatthias Braun; CHECK-NEXT:    i32 7, label [[CASE_7:%.*]]
1728d03c49fSMatthias Braun; CHECK-NEXT:    ]
1738d03c49fSMatthias Braun; CHECK:       case_13:
1748d03c49fSMatthias Braun; CHECK-NEXT:    [[X0:%.*]] = phi i64 [ [[TMP0]], [[BB0:%.*]] ], [ [[X7:%.*]], [[CASE_7]] ]
175d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 13, ptr @effect64, align 4
1768d03c49fSMatthias Braun; CHECK-NEXT:    br label [[CASE_42]]
1778d03c49fSMatthias Braun; CHECK:       case_42:
1788d03c49fSMatthias Braun; CHECK-NEXT:    [[X1:%.*]] = phi i64 [ [[TMP1]], [[BB0]] ], [ [[X0]], [[CASE_13]] ]
179d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 [[X1]], ptr @effect64, align 4
1808d03c49fSMatthias Braun; CHECK-NEXT:    br label [[CASE_55]]
1818d03c49fSMatthias Braun; CHECK:       case_55:
1828d03c49fSMatthias Braun; CHECK-NEXT:    [[X2:%.*]] = phi i64 [ 3895, [[BB0]] ], [ 55, [[CASE_42]] ]
183d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 [[X2]], ptr @effect64, align 4
1848d03c49fSMatthias Braun; CHECK-NEXT:    br label [[DEFAULT]]
1858d03c49fSMatthias Braun; CHECK:       case_7:
186d9e51e75SMatt Arsenault; CHECK-NEXT:    [[X7]] = load i64, ptr @g64, align 4
187d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 7, ptr @effect64, align 4
1888d03c49fSMatthias Braun; CHECK-NEXT:    br label [[CASE_13]]
1898d03c49fSMatthias Braun; CHECK:       default:
1908d03c49fSMatthias Braun; CHECK-NEXT:    ret void
1918d03c49fSMatthias Braun;
1928d03c49fSMatthias Braunbb0:
1938d03c49fSMatthias Braun  switch i32 %x, label %default [
1948d03c49fSMatthias Braun  i32 13, label %case_13
1958d03c49fSMatthias Braun  i32 42, label %case_42
1968d03c49fSMatthias Braun  i32 55, label %case_55
1978d03c49fSMatthias Braun  i32 7, label %case_7
1988d03c49fSMatthias Braun  ]
1998d03c49fSMatthias Braun
2008d03c49fSMatthias Brauncase_13:
2018d03c49fSMatthias Braun  ; We should replace 13 with zext %x to i64
2028d03c49fSMatthias Braun  %x0 = phi i64 [ 13, %bb0 ], [ %x7, %case_7 ]
203d9e51e75SMatt Arsenault  store i64 13, ptr @effect64, align 4
2048d03c49fSMatthias Braun  br label %case_42
2058d03c49fSMatthias Braun
2068d03c49fSMatthias Brauncase_42:
2078d03c49fSMatthias Braun  ; We should replace 42 with zext i32 %x to i64
2088d03c49fSMatthias Braun  %x1 = phi i64 [ 42, %bb0 ], [ %x0, %case_13 ]
209d9e51e75SMatt Arsenault  store i64 %x1, ptr @effect64, align 4
2108d03c49fSMatthias Braun  br label %case_55
2118d03c49fSMatthias Braun
2128d03c49fSMatthias Brauncase_55:
2138d03c49fSMatthias Braun  ; We must not replace any of the PHI arguments! (3898 == 0xf00 + 55)
2148d03c49fSMatthias Braun  %x2 = phi i64 [ 3895, %bb0 ], [ 55, %case_42 ]
215d9e51e75SMatt Arsenault  store i64 %x2, ptr @effect64, align 4
2168d03c49fSMatthias Braun  br label %default
2178d03c49fSMatthias Braun
2188d03c49fSMatthias Brauncase_7:
219d9e51e75SMatt Arsenault  %x7 = load i64, ptr @g64, align 4
220d9e51e75SMatt Arsenault  store i64 7, ptr @effect64, align 4
2218d03c49fSMatthias Braun  br label %case_13
2228d03c49fSMatthias Braun
2238d03c49fSMatthias Braundefault:
2248d03c49fSMatthias Braun  ret void
2258d03c49fSMatthias Braun}
226