xref: /llvm-project/llvm/test/Transforms/LoopVectorize/predicate-switch.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
105f986e1SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
205f986e1SFlorian Hahn; RUN: opt -p loop-vectorize -force-vector-width=2 -force-vector-interleave=1 -S %s | FileCheck --check-prefixes=IC1 %s
305f986e1SFlorian Hahn; RUN: opt -p loop-vectorize -force-vector-width=2 -force-vector-interleave=2 -S %s | FileCheck --check-prefixes=IC2 %s
405f986e1SFlorian Hahn
505f986e1SFlorian Hahndefine void @switch4_default_common_dest_with_case(ptr %start, ptr %end) {
605f986e1SFlorian Hahn; IC1-LABEL: define void @switch4_default_common_dest_with_case(
705f986e1SFlorian Hahn; IC1-SAME: ptr [[START:%.*]], ptr [[END:%.*]]) {
805f986e1SFlorian Hahn; IC1-NEXT:  [[ENTRY:.*]]:
9f0df4fbdSFlorian Hahn; IC1-NEXT:    [[START2:%.*]] = ptrtoint ptr [[START]] to i64
10f0df4fbdSFlorian Hahn; IC1-NEXT:    [[END1:%.*]] = ptrtoint ptr [[END]] to i64
11f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP0:%.*]] = sub i64 [[END1]], [[START2]]
12f0df4fbdSFlorian Hahn; IC1-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 2
13f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
14f0df4fbdSFlorian Hahn; IC1:       [[VECTOR_PH]]:
15f0df4fbdSFlorian Hahn; IC1-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 2
16f0df4fbdSFlorian Hahn; IC1-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]
17f0df4fbdSFlorian Hahn; IC1-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[START]], i64 [[N_VEC]]
18f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[VECTOR_BODY:.*]]
19f0df4fbdSFlorian Hahn; IC1:       [[VECTOR_BODY]]:
20f0df4fbdSFlorian Hahn; IC1-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE13:.*]] ]
21f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 0
22f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 1
23f0df4fbdSFlorian Hahn; IC1-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[START]], i64 [[TMP1]]
24f0df4fbdSFlorian Hahn; IC1-NEXT:    [[NEXT_GEP3:%.*]] = getelementptr i8, ptr [[START]], i64 [[TMP2]]
25f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP3:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i32 0
26f0df4fbdSFlorian Hahn; IC1-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i8>, ptr [[TMP3]], align 1
27*38fffa63SPaul Walker; IC1-NEXT:    [[TMP7:%.*]] = icmp eq <2 x i8> [[WIDE_LOAD]], splat (i8 -12)
28*38fffa63SPaul Walker; IC1-NEXT:    [[TMP4:%.*]] = icmp eq <2 x i8> [[WIDE_LOAD]], splat (i8 13)
29f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP11:%.*]] = or <2 x i1> [[TMP7]], [[TMP4]]
30*38fffa63SPaul Walker; IC1-NEXT:    [[TMP10:%.*]] = xor <2 x i1> [[TMP11]], splat (i1 true)
31f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP5:%.*]] = extractelement <2 x i1> [[TMP4]], i32 0
32f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP5]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
33f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_IF]]:
34f0df4fbdSFlorian Hahn; IC1-NEXT:    store i8 0, ptr [[NEXT_GEP]], align 1
35f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[PRED_STORE_CONTINUE]]
36f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_CONTINUE]]:
37f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP6:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
38f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP6]], label %[[PRED_STORE_IF4:.*]], label %[[PRED_STORE_CONTINUE5:.*]]
39f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_IF4]]:
40f0df4fbdSFlorian Hahn; IC1-NEXT:    store i8 0, ptr [[NEXT_GEP3]], align 1
41f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[PRED_STORE_CONTINUE5]]
42f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_CONTINUE5]]:
43f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP8:%.*]] = extractelement <2 x i1> [[TMP7]], i32 0
44f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP8]], label %[[PRED_STORE_IF6:.*]], label %[[PRED_STORE_CONTINUE7:.*]]
45f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_IF6]]:
46f0df4fbdSFlorian Hahn; IC1-NEXT:    store i8 42, ptr [[NEXT_GEP]], align 1
47f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[PRED_STORE_CONTINUE7]]
48f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_CONTINUE7]]:
49f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP9:%.*]] = extractelement <2 x i1> [[TMP7]], i32 1
50f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP9]], label %[[PRED_STORE_IF8:.*]], label %[[PRED_STORE_CONTINUE9:.*]]
51f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_IF8]]:
52f0df4fbdSFlorian Hahn; IC1-NEXT:    store i8 42, ptr [[NEXT_GEP3]], align 1
53f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[PRED_STORE_CONTINUE9]]
54f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_CONTINUE9]]:
55db0603cbSFlorian Hahn; IC1-NEXT:    [[TMP13:%.*]] = extractelement <2 x i1> [[TMP10]], i32 0
56f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP13]], label %[[PRED_STORE_IF10:.*]], label %[[PRED_STORE_CONTINUE11:.*]]
57f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_IF10]]:
58f0df4fbdSFlorian Hahn; IC1-NEXT:    store i8 2, ptr [[NEXT_GEP]], align 1
59f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[PRED_STORE_CONTINUE11]]
60f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_CONTINUE11]]:
61db0603cbSFlorian Hahn; IC1-NEXT:    [[TMP14:%.*]] = extractelement <2 x i1> [[TMP10]], i32 1
62f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP14]], label %[[PRED_STORE_IF12:.*]], label %[[PRED_STORE_CONTINUE13]]
63f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_IF12]]:
64f0df4fbdSFlorian Hahn; IC1-NEXT:    store i8 2, ptr [[NEXT_GEP3]], align 1
65f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[PRED_STORE_CONTINUE13]]
66f0df4fbdSFlorian Hahn; IC1:       [[PRED_STORE_CONTINUE13]]:
67f0df4fbdSFlorian Hahn; IC1-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
68f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP15:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
69f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP15]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
70f0df4fbdSFlorian Hahn; IC1:       [[MIDDLE_BLOCK]]:
71f0df4fbdSFlorian Hahn; IC1-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
72f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
73f0df4fbdSFlorian Hahn; IC1:       [[SCALAR_PH]]:
74f0df4fbdSFlorian Hahn; IC1-NEXT:    [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], %[[MIDDLE_BLOCK]] ], [ [[START]], %[[ENTRY]] ]
7505f986e1SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_HEADER:.*]]
7605f986e1SFlorian Hahn; IC1:       [[LOOP_HEADER]]:
77f0df4fbdSFlorian Hahn; IC1-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
7805f986e1SFlorian Hahn; IC1-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 1
7905f986e1SFlorian Hahn; IC1-NEXT:    switch i8 [[L]], label %[[DEFAULT:.*]] [
8005f986e1SFlorian Hahn; IC1-NEXT:      i8 -12, label %[[IF_THEN_1:.*]]
8105f986e1SFlorian Hahn; IC1-NEXT:      i8 13, label %[[IF_THEN_2:.*]]
8205f986e1SFlorian Hahn; IC1-NEXT:      i8 0, label %[[DEFAULT]]
8305f986e1SFlorian Hahn; IC1-NEXT:    ]
8405f986e1SFlorian Hahn; IC1:       [[IF_THEN_1]]:
8505f986e1SFlorian Hahn; IC1-NEXT:    store i8 42, ptr [[PTR_IV]], align 1
8605f986e1SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_LATCH]]
8705f986e1SFlorian Hahn; IC1:       [[IF_THEN_2]]:
8805f986e1SFlorian Hahn; IC1-NEXT:    store i8 0, ptr [[PTR_IV]], align 1
8905f986e1SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_LATCH]]
9005f986e1SFlorian Hahn; IC1:       [[DEFAULT]]:
9105f986e1SFlorian Hahn; IC1-NEXT:    store i8 2, ptr [[PTR_IV]], align 1
9205f986e1SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_LATCH]]
9305f986e1SFlorian Hahn; IC1:       [[LOOP_LATCH]]:
9405f986e1SFlorian Hahn; IC1-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i8, ptr [[PTR_IV]], i64 1
9505f986e1SFlorian Hahn; IC1-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]
96f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP3:![0-9]+]]
9705f986e1SFlorian Hahn; IC1:       [[EXIT]]:
9805f986e1SFlorian Hahn; IC1-NEXT:    ret void
9905f986e1SFlorian Hahn;
10005f986e1SFlorian Hahn; IC2-LABEL: define void @switch4_default_common_dest_with_case(
10105f986e1SFlorian Hahn; IC2-SAME: ptr [[START:%.*]], ptr [[END:%.*]]) {
10205f986e1SFlorian Hahn; IC2-NEXT:  [[ENTRY:.*]]:
103f0df4fbdSFlorian Hahn; IC2-NEXT:    [[START2:%.*]] = ptrtoint ptr [[START]] to i64
104f0df4fbdSFlorian Hahn; IC2-NEXT:    [[END1:%.*]] = ptrtoint ptr [[END]] to i64
105f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP0:%.*]] = sub i64 [[END1]], [[START2]]
106f0df4fbdSFlorian Hahn; IC2-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 4
107f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
108f0df4fbdSFlorian Hahn; IC2:       [[VECTOR_PH]]:
109f0df4fbdSFlorian Hahn; IC2-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 4
110f0df4fbdSFlorian Hahn; IC2-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]]
111f0df4fbdSFlorian Hahn; IC2-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[START]], i64 [[N_VEC]]
112f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[VECTOR_BODY:.*]]
113f0df4fbdSFlorian Hahn; IC2:       [[VECTOR_BODY]]:
114f0df4fbdSFlorian Hahn; IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE28:.*]] ]
115f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 0
116f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 1
117f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP3:%.*]] = add i64 [[INDEX]], 2
118f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP4:%.*]] = add i64 [[INDEX]], 3
119f0df4fbdSFlorian Hahn; IC2-NEXT:    [[NEXT_GEP:%.*]] = getelementptr i8, ptr [[START]], i64 [[TMP1]]
120f0df4fbdSFlorian Hahn; IC2-NEXT:    [[NEXT_GEP3:%.*]] = getelementptr i8, ptr [[START]], i64 [[TMP2]]
121f0df4fbdSFlorian Hahn; IC2-NEXT:    [[NEXT_GEP4:%.*]] = getelementptr i8, ptr [[START]], i64 [[TMP3]]
122f0df4fbdSFlorian Hahn; IC2-NEXT:    [[NEXT_GEP5:%.*]] = getelementptr i8, ptr [[START]], i64 [[TMP4]]
123f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP5:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i32 0
124f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[NEXT_GEP]], i32 2
125f0df4fbdSFlorian Hahn; IC2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i8>, ptr [[TMP5]], align 1
126f0df4fbdSFlorian Hahn; IC2-NEXT:    [[WIDE_LOAD6:%.*]] = load <2 x i8>, ptr [[TMP6]], align 1
127*38fffa63SPaul Walker; IC2-NEXT:    [[TMP13:%.*]] = icmp eq <2 x i8> [[WIDE_LOAD]], splat (i8 -12)
128*38fffa63SPaul Walker; IC2-NEXT:    [[TMP14:%.*]] = icmp eq <2 x i8> [[WIDE_LOAD6]], splat (i8 -12)
129*38fffa63SPaul Walker; IC2-NEXT:    [[TMP7:%.*]] = icmp eq <2 x i8> [[WIDE_LOAD]], splat (i8 13)
130*38fffa63SPaul Walker; IC2-NEXT:    [[TMP8:%.*]] = icmp eq <2 x i8> [[WIDE_LOAD6]], splat (i8 13)
131f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP21:%.*]] = or <2 x i1> [[TMP13]], [[TMP7]]
132f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP22:%.*]] = or <2 x i1> [[TMP14]], [[TMP8]]
133*38fffa63SPaul Walker; IC2-NEXT:    [[TMP19:%.*]] = xor <2 x i1> [[TMP21]], splat (i1 true)
134*38fffa63SPaul Walker; IC2-NEXT:    [[TMP20:%.*]] = xor <2 x i1> [[TMP22]], splat (i1 true)
135f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP9:%.*]] = extractelement <2 x i1> [[TMP7]], i32 0
136f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP9]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
137f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF]]:
138f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 0, ptr [[NEXT_GEP]], align 1
139f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE]]
140f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE]]:
141f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP10:%.*]] = extractelement <2 x i1> [[TMP7]], i32 1
142f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP10]], label %[[PRED_STORE_IF7:.*]], label %[[PRED_STORE_CONTINUE8:.*]]
143f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF7]]:
144f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 0, ptr [[NEXT_GEP3]], align 1
145f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE8]]
146f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE8]]:
147f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP11:%.*]] = extractelement <2 x i1> [[TMP8]], i32 0
148f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP11]], label %[[PRED_STORE_IF9:.*]], label %[[PRED_STORE_CONTINUE10:.*]]
149f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF9]]:
150f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 0, ptr [[NEXT_GEP4]], align 1
151f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE10]]
152f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE10]]:
153f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP12:%.*]] = extractelement <2 x i1> [[TMP8]], i32 1
154f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP12]], label %[[PRED_STORE_IF11:.*]], label %[[PRED_STORE_CONTINUE12:.*]]
155f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF11]]:
156f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 0, ptr [[NEXT_GEP5]], align 1
157f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE12]]
158f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE12]]:
159f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP15:%.*]] = extractelement <2 x i1> [[TMP13]], i32 0
160f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP15]], label %[[PRED_STORE_IF13:.*]], label %[[PRED_STORE_CONTINUE14:.*]]
161f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF13]]:
162f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 42, ptr [[NEXT_GEP]], align 1
163f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE14]]
164f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE14]]:
165f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP16:%.*]] = extractelement <2 x i1> [[TMP13]], i32 1
166f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP16]], label %[[PRED_STORE_IF15:.*]], label %[[PRED_STORE_CONTINUE16:.*]]
167f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF15]]:
168f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 42, ptr [[NEXT_GEP3]], align 1
169f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE16]]
170f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE16]]:
171f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP17:%.*]] = extractelement <2 x i1> [[TMP14]], i32 0
172f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP17]], label %[[PRED_STORE_IF17:.*]], label %[[PRED_STORE_CONTINUE18:.*]]
173f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF17]]:
174f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 42, ptr [[NEXT_GEP4]], align 1
175f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE18]]
176f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE18]]:
177f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP18:%.*]] = extractelement <2 x i1> [[TMP14]], i32 1
178f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP18]], label %[[PRED_STORE_IF19:.*]], label %[[PRED_STORE_CONTINUE20:.*]]
179f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF19]]:
180f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 42, ptr [[NEXT_GEP5]], align 1
181f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE20]]
182f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE20]]:
183db0603cbSFlorian Hahn; IC2-NEXT:    [[TMP25:%.*]] = extractelement <2 x i1> [[TMP19]], i32 0
184f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP25]], label %[[PRED_STORE_IF21:.*]], label %[[PRED_STORE_CONTINUE22:.*]]
185f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF21]]:
186f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 2, ptr [[NEXT_GEP]], align 1
187f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE22]]
188f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE22]]:
189db0603cbSFlorian Hahn; IC2-NEXT:    [[TMP26:%.*]] = extractelement <2 x i1> [[TMP19]], i32 1
190f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP26]], label %[[PRED_STORE_IF23:.*]], label %[[PRED_STORE_CONTINUE24:.*]]
191f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF23]]:
192f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 2, ptr [[NEXT_GEP3]], align 1
193f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE24]]
194f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE24]]:
195db0603cbSFlorian Hahn; IC2-NEXT:    [[TMP27:%.*]] = extractelement <2 x i1> [[TMP20]], i32 0
196f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP27]], label %[[PRED_STORE_IF25:.*]], label %[[PRED_STORE_CONTINUE26:.*]]
197f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF25]]:
198f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 2, ptr [[NEXT_GEP4]], align 1
199f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE26]]
200f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE26]]:
201db0603cbSFlorian Hahn; IC2-NEXT:    [[TMP28:%.*]] = extractelement <2 x i1> [[TMP20]], i32 1
202f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP28]], label %[[PRED_STORE_IF27:.*]], label %[[PRED_STORE_CONTINUE28]]
203f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_IF27]]:
204f0df4fbdSFlorian Hahn; IC2-NEXT:    store i8 2, ptr [[NEXT_GEP5]], align 1
205f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[PRED_STORE_CONTINUE28]]
206f0df4fbdSFlorian Hahn; IC2:       [[PRED_STORE_CONTINUE28]]:
207f0df4fbdSFlorian Hahn; IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
208f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP29:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
209f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP29]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
210f0df4fbdSFlorian Hahn; IC2:       [[MIDDLE_BLOCK]]:
211f0df4fbdSFlorian Hahn; IC2-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
212f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
213f0df4fbdSFlorian Hahn; IC2:       [[SCALAR_PH]]:
214f0df4fbdSFlorian Hahn; IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi ptr [ [[IND_END]], %[[MIDDLE_BLOCK]] ], [ [[START]], %[[ENTRY]] ]
21505f986e1SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_HEADER:.*]]
21605f986e1SFlorian Hahn; IC2:       [[LOOP_HEADER]]:
217f0df4fbdSFlorian Hahn; IC2-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
21805f986e1SFlorian Hahn; IC2-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 1
21905f986e1SFlorian Hahn; IC2-NEXT:    switch i8 [[L]], label %[[DEFAULT:.*]] [
22005f986e1SFlorian Hahn; IC2-NEXT:      i8 -12, label %[[IF_THEN_1:.*]]
22105f986e1SFlorian Hahn; IC2-NEXT:      i8 13, label %[[IF_THEN_2:.*]]
22205f986e1SFlorian Hahn; IC2-NEXT:      i8 0, label %[[DEFAULT]]
22305f986e1SFlorian Hahn; IC2-NEXT:    ]
22405f986e1SFlorian Hahn; IC2:       [[IF_THEN_1]]:
22505f986e1SFlorian Hahn; IC2-NEXT:    store i8 42, ptr [[PTR_IV]], align 1
22605f986e1SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_LATCH]]
22705f986e1SFlorian Hahn; IC2:       [[IF_THEN_2]]:
22805f986e1SFlorian Hahn; IC2-NEXT:    store i8 0, ptr [[PTR_IV]], align 1
22905f986e1SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_LATCH]]
23005f986e1SFlorian Hahn; IC2:       [[DEFAULT]]:
23105f986e1SFlorian Hahn; IC2-NEXT:    store i8 2, ptr [[PTR_IV]], align 1
23205f986e1SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_LATCH]]
23305f986e1SFlorian Hahn; IC2:       [[LOOP_LATCH]]:
23405f986e1SFlorian Hahn; IC2-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i8, ptr [[PTR_IV]], i64 1
23505f986e1SFlorian Hahn; IC2-NEXT:    [[EC:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]
236f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP3:![0-9]+]]
23705f986e1SFlorian Hahn; IC2:       [[EXIT]]:
23805f986e1SFlorian Hahn; IC2-NEXT:    ret void
23905f986e1SFlorian Hahn;
24005f986e1SFlorian Hahnentry:
24105f986e1SFlorian Hahn  br label %loop.header
24205f986e1SFlorian Hahn
24305f986e1SFlorian Hahnloop.header:
24405f986e1SFlorian Hahn  %ptr.iv = phi ptr [ %start, %entry ], [ %ptr.iv.next, %loop.latch ]
24505f986e1SFlorian Hahn  %l = load i8, ptr %ptr.iv, align 1
24605f986e1SFlorian Hahn  switch i8 %l, label %default [
24705f986e1SFlorian Hahn  i8 -12, label %if.then.1
24805f986e1SFlorian Hahn  i8 13, label %if.then.2
24905f986e1SFlorian Hahn  i8 0, label %default
25005f986e1SFlorian Hahn  ]
25105f986e1SFlorian Hahn
25205f986e1SFlorian Hahnif.then.1:
25305f986e1SFlorian Hahn  store i8 42, ptr %ptr.iv, align 1
25405f986e1SFlorian Hahn  br label %loop.latch
25505f986e1SFlorian Hahn
25605f986e1SFlorian Hahnif.then.2:
25705f986e1SFlorian Hahn  store i8 0, ptr %ptr.iv, align 1
25805f986e1SFlorian Hahn  br label %loop.latch
25905f986e1SFlorian Hahn
26005f986e1SFlorian Hahndefault:
26105f986e1SFlorian Hahn  store i8 2, ptr %ptr.iv, align 1
26205f986e1SFlorian Hahn  br label %loop.latch
26305f986e1SFlorian Hahn
26405f986e1SFlorian Hahnloop.latch:
26505f986e1SFlorian Hahn  %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 1
26605f986e1SFlorian Hahn  %ec = icmp eq ptr %ptr.iv.next, %end
26705f986e1SFlorian Hahn  br i1 %ec, label %exit, label %loop.header
26805f986e1SFlorian Hahn
26905f986e1SFlorian Hahnexit:
27005f986e1SFlorian Hahn  ret void
27105f986e1SFlorian Hahn}
27285570353SFlorian Hahn
27385570353SFlorian Hahndefine void @switch_exiting(ptr %start) {
27485570353SFlorian Hahn; IC1-LABEL: define void @switch_exiting(
27585570353SFlorian Hahn; IC1-SAME: ptr [[START:%.*]]) {
27685570353SFlorian Hahn; IC1-NEXT:  [[ENTRY:.*]]:
27785570353SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_HEADER:.*]]
27885570353SFlorian Hahn; IC1:       [[LOOP_HEADER]]:
27985570353SFlorian Hahn; IC1-NEXT:    [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
28085570353SFlorian Hahn; IC1-NEXT:    switch i64 [[IV]], label %[[LOOP_LATCH]] [
28185570353SFlorian Hahn; IC1-NEXT:      i64 -12, label %[[IF_THEN:.*]]
28285570353SFlorian Hahn; IC1-NEXT:      i64 100, label %[[EXIT:.*]]
28385570353SFlorian Hahn; IC1-NEXT:    ]
28485570353SFlorian Hahn; IC1:       [[IF_THEN]]:
28585570353SFlorian Hahn; IC1-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 [[IV]]
28685570353SFlorian Hahn; IC1-NEXT:    store i64 42, ptr [[GEP]], align 1
28785570353SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_LATCH]]
28885570353SFlorian Hahn; IC1:       [[LOOP_LATCH]]:
28985570353SFlorian Hahn; IC1-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
29085570353SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_HEADER]]
29185570353SFlorian Hahn; IC1:       [[EXIT]]:
29285570353SFlorian Hahn; IC1-NEXT:    ret void
29385570353SFlorian Hahn;
29485570353SFlorian Hahn; IC2-LABEL: define void @switch_exiting(
29585570353SFlorian Hahn; IC2-SAME: ptr [[START:%.*]]) {
29685570353SFlorian Hahn; IC2-NEXT:  [[ENTRY:.*]]:
29785570353SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_HEADER:.*]]
29885570353SFlorian Hahn; IC2:       [[LOOP_HEADER]]:
29985570353SFlorian Hahn; IC2-NEXT:    [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
30085570353SFlorian Hahn; IC2-NEXT:    switch i64 [[IV]], label %[[LOOP_LATCH]] [
30185570353SFlorian Hahn; IC2-NEXT:      i64 -12, label %[[IF_THEN:.*]]
30285570353SFlorian Hahn; IC2-NEXT:      i64 100, label %[[EXIT:.*]]
30385570353SFlorian Hahn; IC2-NEXT:    ]
30485570353SFlorian Hahn; IC2:       [[IF_THEN]]:
30585570353SFlorian Hahn; IC2-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 [[IV]]
30685570353SFlorian Hahn; IC2-NEXT:    store i64 42, ptr [[GEP]], align 1
30785570353SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_LATCH]]
30885570353SFlorian Hahn; IC2:       [[LOOP_LATCH]]:
30985570353SFlorian Hahn; IC2-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
31085570353SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_HEADER]]
31185570353SFlorian Hahn; IC2:       [[EXIT]]:
31285570353SFlorian Hahn; IC2-NEXT:    ret void
31385570353SFlorian Hahn;
31485570353SFlorian Hahnentry:
31585570353SFlorian Hahn  br label %loop.header
31685570353SFlorian Hahn
31785570353SFlorian Hahnloop.header:
31885570353SFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
31985570353SFlorian Hahn  switch i64 %iv, label %loop.latch [
32085570353SFlorian Hahn  i64 -12, label %if.then
32185570353SFlorian Hahn  i64 100, label %exit
32285570353SFlorian Hahn  ]
32385570353SFlorian Hahn
32485570353SFlorian Hahnif.then:
32585570353SFlorian Hahn  %gep = getelementptr inbounds i64, ptr %start, i64 %iv
32685570353SFlorian Hahn  store i64 42, ptr %gep, align 1
32785570353SFlorian Hahn  br label %loop.latch
32885570353SFlorian Hahn
32985570353SFlorian Hahnloop.latch:
33085570353SFlorian Hahn  %iv.next = add i64 %iv, 1
33185570353SFlorian Hahn  br label %loop.header
33285570353SFlorian Hahn
33385570353SFlorian Hahnexit:
33485570353SFlorian Hahn  ret void
33585570353SFlorian Hahn}
33685570353SFlorian Hahn
33785570353SFlorian Hahndefine void @switch_to_header(ptr %start) {
33885570353SFlorian Hahn; IC1-LABEL: define void @switch_to_header(
33985570353SFlorian Hahn; IC1-SAME: ptr [[START:%.*]]) {
34085570353SFlorian Hahn; IC1-NEXT:  [[ENTRY:.*]]:
34185570353SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_HEADER:.*]]
34285570353SFlorian Hahn; IC1:       [[LOOP_HEADER]]:
343*38fffa63SPaul Walker; IC1-NEXT:    [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[IF_THEN1:.*]] ]
34485570353SFlorian Hahn; IC1-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
34585570353SFlorian Hahn; IC1-NEXT:    switch i64 [[IV]], label %[[LOOP_LATCH:.*]] [
346*38fffa63SPaul Walker; IC1-NEXT:      i64 120, label %[[IF_THEN1]]
34785570353SFlorian Hahn; IC1-NEXT:      i64 100, label %[[LOOP_LATCH]]
34885570353SFlorian Hahn; IC1-NEXT:    ]
349*38fffa63SPaul Walker; IC1:       [[IF_THEN1]]:
35085570353SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_HEADER]]
35185570353SFlorian Hahn; IC1:       [[IF_THEN:.*:]]
35285570353SFlorian Hahn; IC1-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 poison
35385570353SFlorian Hahn; IC1-NEXT:    store i64 42, ptr [[GEP]], align 1
35485570353SFlorian Hahn; IC1-NEXT:    unreachable
35585570353SFlorian Hahn; IC1:       [[LOOP_LATCH]]:
35685570353SFlorian Hahn; IC1-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 100
357*38fffa63SPaul Walker; IC1-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[IF_THEN1]]
35885570353SFlorian Hahn; IC1:       [[EXIT]]:
35985570353SFlorian Hahn; IC1-NEXT:    ret void
36085570353SFlorian Hahn;
36185570353SFlorian Hahn; IC2-LABEL: define void @switch_to_header(
36285570353SFlorian Hahn; IC2-SAME: ptr [[START:%.*]]) {
36385570353SFlorian Hahn; IC2-NEXT:  [[ENTRY:.*]]:
36485570353SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_HEADER:.*]]
36585570353SFlorian Hahn; IC2:       [[LOOP_HEADER]]:
366*38fffa63SPaul Walker; IC2-NEXT:    [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[IF_THEN1:.*]] ]
36785570353SFlorian Hahn; IC2-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
36885570353SFlorian Hahn; IC2-NEXT:    switch i64 [[IV]], label %[[LOOP_LATCH:.*]] [
369*38fffa63SPaul Walker; IC2-NEXT:      i64 120, label %[[IF_THEN1]]
37085570353SFlorian Hahn; IC2-NEXT:      i64 100, label %[[LOOP_LATCH]]
37185570353SFlorian Hahn; IC2-NEXT:    ]
372*38fffa63SPaul Walker; IC2:       [[IF_THEN1]]:
37385570353SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_HEADER]]
37485570353SFlorian Hahn; IC2:       [[IF_THEN:.*:]]
37585570353SFlorian Hahn; IC2-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 poison
37685570353SFlorian Hahn; IC2-NEXT:    store i64 42, ptr [[GEP]], align 1
37785570353SFlorian Hahn; IC2-NEXT:    unreachable
37885570353SFlorian Hahn; IC2:       [[LOOP_LATCH]]:
37985570353SFlorian Hahn; IC2-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 100
380*38fffa63SPaul Walker; IC2-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[IF_THEN1]]
38185570353SFlorian Hahn; IC2:       [[EXIT]]:
38285570353SFlorian Hahn; IC2-NEXT:    ret void
38385570353SFlorian Hahn;
38485570353SFlorian Hahnentry:
38585570353SFlorian Hahn  br label %loop.header
38685570353SFlorian Hahn
38785570353SFlorian Hahnloop.header:
38885570353SFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ], [ %iv.next, %loop.header ]
38985570353SFlorian Hahn  %iv.next = add i64 %iv, 1
39085570353SFlorian Hahn  switch i64 %iv, label %loop.latch [
39185570353SFlorian Hahn  i64 120, label %loop.header
39285570353SFlorian Hahn  i64 100, label %loop.latch
39385570353SFlorian Hahn  ]
39485570353SFlorian Hahn
39585570353SFlorian Hahnif.then:
39685570353SFlorian Hahn  %gep = getelementptr inbounds i64, ptr %start, i64 %iv
39785570353SFlorian Hahn  store i64 42, ptr %gep, align 1
39885570353SFlorian Hahn  br label %loop.latch
39985570353SFlorian Hahn
40085570353SFlorian Hahnloop.latch:
40185570353SFlorian Hahn  %cmp = icmp eq i64 %iv.next, 100
40285570353SFlorian Hahn  br i1 %cmp, label %exit, label %loop.header
40385570353SFlorian Hahn
40485570353SFlorian Hahnexit:
40585570353SFlorian Hahn  ret void
40685570353SFlorian Hahn}
40785570353SFlorian Hahn
40885570353SFlorian Hahndefine void @switch_all_to_default(ptr %start) {
40985570353SFlorian Hahn; IC1-LABEL: define void @switch_all_to_default(
41085570353SFlorian Hahn; IC1-SAME: ptr [[START:%.*]]) {
41185570353SFlorian Hahn; IC1-NEXT:  [[ENTRY:.*]]:
412f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
413f0df4fbdSFlorian Hahn; IC1:       [[VECTOR_PH]]:
414f0df4fbdSFlorian Hahn; IC1-NEXT:    br label %[[VECTOR_BODY:.*]]
415f0df4fbdSFlorian Hahn; IC1:       [[VECTOR_BODY]]:
416f0df4fbdSFlorian Hahn; IC1-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
417f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
418f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 [[TMP0]]
419f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[TMP1]], i32 0
420*38fffa63SPaul Walker; IC1-NEXT:    store <2 x i64> splat (i64 42), ptr [[TMP2]], align 1
421f0df4fbdSFlorian Hahn; IC1-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
422f0df4fbdSFlorian Hahn; IC1-NEXT:    [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
423f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
424f0df4fbdSFlorian Hahn; IC1:       [[MIDDLE_BLOCK]]:
425f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
426f0df4fbdSFlorian Hahn; IC1:       [[SCALAR_PH]]:
427f0df4fbdSFlorian Hahn; IC1-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
42885570353SFlorian Hahn; IC1-NEXT:    br label %[[LOOP_HEADER:.*]]
42985570353SFlorian Hahn; IC1:       [[LOOP_HEADER]]:
430f0df4fbdSFlorian Hahn; IC1-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
43185570353SFlorian Hahn; IC1-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
43285570353SFlorian Hahn; IC1-NEXT:    switch i64 [[IV]], label %[[LOOP_LATCH]] [
43385570353SFlorian Hahn; IC1-NEXT:      i64 120, label %[[LOOP_LATCH]]
43485570353SFlorian Hahn; IC1-NEXT:      i64 100, label %[[LOOP_LATCH]]
43585570353SFlorian Hahn; IC1-NEXT:    ]
43685570353SFlorian Hahn; IC1:       [[LOOP_LATCH]]:
43785570353SFlorian Hahn; IC1-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 [[IV]]
43885570353SFlorian Hahn; IC1-NEXT:    store i64 42, ptr [[GEP]], align 1
43985570353SFlorian Hahn; IC1-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 100
440f0df4fbdSFlorian Hahn; IC1-NEXT:    br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]]
44185570353SFlorian Hahn; IC1:       [[EXIT]]:
44285570353SFlorian Hahn; IC1-NEXT:    ret void
44385570353SFlorian Hahn;
44485570353SFlorian Hahn; IC2-LABEL: define void @switch_all_to_default(
44585570353SFlorian Hahn; IC2-SAME: ptr [[START:%.*]]) {
44685570353SFlorian Hahn; IC2-NEXT:  [[ENTRY:.*]]:
447f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
448f0df4fbdSFlorian Hahn; IC2:       [[VECTOR_PH]]:
449f0df4fbdSFlorian Hahn; IC2-NEXT:    br label %[[VECTOR_BODY:.*]]
450f0df4fbdSFlorian Hahn; IC2:       [[VECTOR_BODY]]:
451f0df4fbdSFlorian Hahn; IC2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
452f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
453f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 [[TMP0]]
454f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i64, ptr [[TMP2]], i32 0
455f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i64, ptr [[TMP2]], i32 2
456*38fffa63SPaul Walker; IC2-NEXT:    store <2 x i64> splat (i64 42), ptr [[TMP4]], align 1
457*38fffa63SPaul Walker; IC2-NEXT:    store <2 x i64> splat (i64 42), ptr [[TMP5]], align 1
458f0df4fbdSFlorian Hahn; IC2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
459f0df4fbdSFlorian Hahn; IC2-NEXT:    [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
460f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
461f0df4fbdSFlorian Hahn; IC2:       [[MIDDLE_BLOCK]]:
462f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
463f0df4fbdSFlorian Hahn; IC2:       [[SCALAR_PH]]:
464f0df4fbdSFlorian Hahn; IC2-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
46585570353SFlorian Hahn; IC2-NEXT:    br label %[[LOOP_HEADER:.*]]
46685570353SFlorian Hahn; IC2:       [[LOOP_HEADER]]:
467f0df4fbdSFlorian Hahn; IC2-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
46885570353SFlorian Hahn; IC2-NEXT:    [[IV_NEXT]] = add i64 [[IV]], 1
46985570353SFlorian Hahn; IC2-NEXT:    switch i64 [[IV]], label %[[LOOP_LATCH]] [
47085570353SFlorian Hahn; IC2-NEXT:      i64 120, label %[[LOOP_LATCH]]
47185570353SFlorian Hahn; IC2-NEXT:      i64 100, label %[[LOOP_LATCH]]
47285570353SFlorian Hahn; IC2-NEXT:    ]
47385570353SFlorian Hahn; IC2:       [[LOOP_LATCH]]:
47485570353SFlorian Hahn; IC2-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[START]], i64 [[IV]]
47585570353SFlorian Hahn; IC2-NEXT:    store i64 42, ptr [[GEP]], align 1
47685570353SFlorian Hahn; IC2-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], 100
477f0df4fbdSFlorian Hahn; IC2-NEXT:    br i1 [[CMP]], label %[[EXIT]], label %[[LOOP_HEADER]], !llvm.loop [[LOOP5:![0-9]+]]
47885570353SFlorian Hahn; IC2:       [[EXIT]]:
47985570353SFlorian Hahn; IC2-NEXT:    ret void
48085570353SFlorian Hahn;
48185570353SFlorian Hahnentry:
48285570353SFlorian Hahn  br label %loop.header
48385570353SFlorian Hahn
48485570353SFlorian Hahnloop.header:
48585570353SFlorian Hahn  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.latch ]
48685570353SFlorian Hahn  %iv.next = add i64 %iv, 1
48785570353SFlorian Hahn  switch i64 %iv, label %loop.latch [
48885570353SFlorian Hahn  i64 120, label %loop.latch
48985570353SFlorian Hahn  i64 100, label %loop.latch
49085570353SFlorian Hahn  ]
49185570353SFlorian Hahn
49285570353SFlorian Hahnloop.latch:
49385570353SFlorian Hahn  %gep = getelementptr inbounds i64, ptr %start, i64 %iv
49485570353SFlorian Hahn  store i64 42, ptr %gep, align 1
49585570353SFlorian Hahn  %cmp = icmp eq i64 %iv.next, 100
49685570353SFlorian Hahn  br i1 %cmp, label %exit, label %loop.header
49785570353SFlorian Hahn
49885570353SFlorian Hahnexit:
49985570353SFlorian Hahn  ret void
50085570353SFlorian Hahn}
501f0df4fbdSFlorian Hahn;.
502f0df4fbdSFlorian Hahn; IC1: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
503f0df4fbdSFlorian Hahn; IC1: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
504f0df4fbdSFlorian Hahn; IC1: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
505f0df4fbdSFlorian Hahn; IC1: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
506f0df4fbdSFlorian Hahn; IC1: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
507f0df4fbdSFlorian Hahn; IC1: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
508f0df4fbdSFlorian Hahn;.
509f0df4fbdSFlorian Hahn; IC2: [[LOOP0]] = distinct !{[[LOOP0]], [[META1:![0-9]+]], [[META2:![0-9]+]]}
510f0df4fbdSFlorian Hahn; IC2: [[META1]] = !{!"llvm.loop.isvectorized", i32 1}
511f0df4fbdSFlorian Hahn; IC2: [[META2]] = !{!"llvm.loop.unroll.runtime.disable"}
512f0df4fbdSFlorian Hahn; IC2: [[LOOP3]] = distinct !{[[LOOP3]], [[META2]], [[META1]]}
513f0df4fbdSFlorian Hahn; IC2: [[LOOP4]] = distinct !{[[LOOP4]], [[META1]], [[META2]]}
514f0df4fbdSFlorian Hahn; IC2: [[LOOP5]] = distinct !{[[LOOP5]], [[META2]], [[META1]]}
515f0df4fbdSFlorian Hahn;.
516