@@ -39,25 +39,20 @@ define i32 @switch_of_powers_two_default_reachable(i32 %arg) {
3939; CHECK-LABEL: define i32 @switch_of_powers_two_default_reachable(
4040; CHECK-SAME: i32 [[ARG:%.*]]) {
4141; CHECK-NEXT: [[ENTRY:.*]]:
42- ; CHECK-NEXT: switch i32 [[ARG]], label %[[RETURN:.*]] [
43- ; CHECK-NEXT: i32 1, label %[[BB1:.*]]
44- ; CHECK-NEXT: i32 8, label %[[BB2:.*]]
45- ; CHECK-NEXT: i32 16, label %[[BB3:.*]]
46- ; CHECK-NEXT: i32 32, label %[[BB4:.*]]
47- ; CHECK-NEXT: i32 64, label %[[BB5:.*]]
48- ; CHECK-NEXT: ]
49- ; CHECK: [[BB1]]:
50- ; CHECK-NEXT: br label %[[RETURN]]
51- ; CHECK: [[BB2]]:
52- ; CHECK-NEXT: br label %[[RETURN]]
53- ; CHECK: [[BB3]]:
54- ; CHECK-NEXT: br label %[[RETURN]]
55- ; CHECK: [[BB4]]:
56- ; CHECK-NEXT: br label %[[RETURN]]
57- ; CHECK: [[BB5]]:
42+ ; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[ARG]])
43+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1
44+ ; CHECK-NEXT: br i1 [[TMP1]], label %[[ENTRY_SPLIT:.*]], label %[[RETURN:.*]]
45+ ; CHECK: [[ENTRY_SPLIT]]:
46+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.cttz.i32(i32 [[ARG]], i1 true)
47+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 7
48+ ; CHECK-NEXT: br i1 [[TMP3]], label %[[SWITCH_LOOKUP:.*]], label %[[RETURN]]
49+ ; CHECK: [[SWITCH_LOOKUP]]:
50+ ; CHECK-NEXT: [[TMP4:%.*]] = zext nneg i32 [[TMP2]] to i64
51+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [7 x i32], ptr @switch.table.switch_of_powers_two_default_reachable, i64 0, i64 [[TMP4]]
52+ ; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
5853; CHECK-NEXT: br label %[[RETURN]]
5954; CHECK: [[RETURN]]:
60- ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 3 , %[[BB1 ]] ], [ 2 , %[[BB2 ]] ], [ 1, %[[BB3]] ], [ 0, %[[BB4]] ], [ 42, %[[BB5]] ], [ 5, %[[ENTRY ]] ]
55+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 5 , %[[ENTRY ]] ], [ 5 , %[[ENTRY_SPLIT ]] ], [ [[SWITCH_LOAD]], %[[SWITCH_LOOKUP ]] ]
6156; CHECK-NEXT: ret i32 [[PHI]]
6257;
6358entry:
@@ -87,25 +82,24 @@ define i32 @switch_of_powers_two_default_reachable_multipreds(i32 %arg, i1 %cond
8782; CHECK-NEXT: [[ENTRY:.*]]:
8883; CHECK-NEXT: br i1 [[COND]], label %[[SWITCH:.*]], label %[[RETURN:.*]]
8984; CHECK: [[SWITCH]]:
90- ; CHECK-NEXT: switch i32 [[ARG]], label %[[RETURN]] [
91- ; CHECK-NEXT: i32 1, label %[[BB1:.*]]
92- ; CHECK-NEXT: i32 8, label %[[BB2:.*]]
93- ; CHECK-NEXT: i32 16, label %[[BB3:.*]]
94- ; CHECK-NEXT: i32 32, label %[[BB4:.*]]
95- ; CHECK-NEXT: i32 64, label %[[BB5:.*]]
96- ; CHECK-NEXT: ]
97- ; CHECK: [[BB1]]:
98- ; CHECK-NEXT: br label %[[RETURN]]
99- ; CHECK: [[BB2]]:
100- ; CHECK-NEXT: br label %[[RETURN]]
101- ; CHECK: [[BB3]]:
102- ; CHECK-NEXT: br label %[[RETURN]]
103- ; CHECK: [[BB4]]:
104- ; CHECK-NEXT: br label %[[RETURN]]
105- ; CHECK: [[BB5]]:
85+ ; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[ARG]])
86+ ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1
87+ ; CHECK-NEXT: br i1 [[TMP1]], label %[[SWITCH_SPLIT:.*]], label %[[RETURN]]
88+ ; CHECK: [[SWITCH_SPLIT]]:
89+ ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.cttz.i32(i32 [[ARG]], i1 true)
90+ ; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 7
91+ ; CHECK-NEXT: [[SWITCH_MASKINDEX:%.*]] = trunc i32 [[TMP2]] to i8
92+ ; CHECK-NEXT: [[SWITCH_SHIFTED:%.*]] = lshr i8 121, [[SWITCH_MASKINDEX]]
93+ ; CHECK-NEXT: [[SWITCH_LOBIT:%.*]] = trunc i8 [[SWITCH_SHIFTED]] to i1
94+ ; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP3]], i1 [[SWITCH_LOBIT]], i1 false
95+ ; CHECK-NEXT: br i1 [[OR_COND]], label %[[SWITCH_LOOKUP:.*]], label %[[RETURN]]
96+ ; CHECK: [[SWITCH_LOOKUP]]:
97+ ; CHECK-NEXT: [[TMP4:%.*]] = zext nneg i32 [[TMP2]] to i64
98+ ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [7 x i32], ptr @switch.table.switch_of_powers_two_default_reachable_multipreds, i64 0, i64 [[TMP4]]
99+ ; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
106100; CHECK-NEXT: br label %[[RETURN]]
107101; CHECK: [[RETURN]]:
108- ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 3 , %[[BB1 ]] ], [ 2, %[[BB2]] ], [ 1, %[[BB3 ]] ], [ 0, %[[BB4]] ], [ 42, %[[BB5 ]] ], [ 0, %[[ENTRY]] ], [ [[ARG]], %[[SWITCH ]] ]
102+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0 , %[[ENTRY ]] ], [ [[ARG]], %[[SWITCH_SPLIT ]] ], [ [[ARG]], %[[SWITCH ]] ], [ [[SWITCH_LOAD]], %[[SWITCH_LOOKUP ]] ]
109103; CHECK-NEXT: ret i32 [[PHI]]
110104;
111105entry:
0 commit comments