1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S \ 3; RUN: | FileCheck %s -check-prefix=SIMPLIFY-CFG 4 5define i32 @switch_all_duplicate_arms(i32 %0, i32 %1, i32 %2, i32 %3) { 6; SIMPLIFY-CFG-LABEL: define i32 @switch_all_duplicate_arms( 7; SIMPLIFY-CFG-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]]) { 8; SIMPLIFY-CFG-NEXT: switch i32 [[TMP1]], label %[[BB6:.*]] [ 9; SIMPLIFY-CFG-NEXT: i32 0, label %[[BB5:.*]] 10; SIMPLIFY-CFG-NEXT: i32 1, label %[[BB5]] 11; SIMPLIFY-CFG-NEXT: ] 12; SIMPLIFY-CFG: [[BB5]]: 13; SIMPLIFY-CFG-NEXT: br label %[[BB6]] 14; SIMPLIFY-CFG: [[BB6]]: 15; SIMPLIFY-CFG-NEXT: [[TMP8:%.*]] = phi i32 [ [[TMP3]], [[TMP4:%.*]] ], [ [[TMP2]], %[[BB5]] ] 16; SIMPLIFY-CFG-NEXT: ret i32 [[TMP8]] 17; 18 switch i32 %1, label %7 [ 19 i32 0, label %5 20 i32 1, label %6 21 ] 22 235: 24 br label %7 25 266: 27 br label %7 28 297: 30 %8 = phi i32 [ %3, %4 ], [ %2, %6 ], [ %2, %5 ] 31 ret i32 %8 32} 33 34define i32 @switch_some_duplicate_arms(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) { 35; SIMPLIFY-CFG-LABEL: define i32 @switch_some_duplicate_arms( 36; SIMPLIFY-CFG-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]]) { 37; SIMPLIFY-CFG-NEXT: switch i32 [[TMP1]], label %[[BB8:.*]] [ 38; SIMPLIFY-CFG-NEXT: i32 0, label %[[BB6:.*]] 39; SIMPLIFY-CFG-NEXT: i32 1, label %[[BB6]] 40; SIMPLIFY-CFG-NEXT: i32 2, label %[[BB7:.*]] 41; SIMPLIFY-CFG-NEXT: ] 42; SIMPLIFY-CFG: [[BB6]]: 43; SIMPLIFY-CFG-NEXT: br label %[[BB8]] 44; SIMPLIFY-CFG: [[BB7]]: 45; SIMPLIFY-CFG-NEXT: br label %[[BB8]] 46; SIMPLIFY-CFG: [[BB8]]: 47; SIMPLIFY-CFG-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP3]], [[TMP5:%.*]] ], [ [[TMP4]], %[[BB7]] ], [ [[TMP2]], %[[BB6]] ] 48; SIMPLIFY-CFG-NEXT: ret i32 [[TMP10]] 49; 50 switch i32 %1, label %9 [ 51 i32 0, label %6 52 i32 1, label %7 53 i32 2, label %8 54 ] 55 566: 57 br label %9 58 597: 60 br label %9 61 628: 63 br label %9 64 659: 66 %10 = phi i32 [ %3, %5 ], [ %4, %8 ], [ %2, %7 ], [ %2, %6 ] 67 ret i32 %10 68} 69 70define i32 @switch_duplicate_arms_multipred(i1 %0, i32 %1, i32 %2, i32 %3, i32 %4) { 71; SIMPLIFY-CFG-LABEL: define i32 @switch_duplicate_arms_multipred( 72; SIMPLIFY-CFG-SAME: i1 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]]) { 73; SIMPLIFY-CFG-NEXT: br i1 [[TMP0]], label %[[BB6:.*]], label %[[BB7:.*]] 74; SIMPLIFY-CFG: [[BB6]]: 75; SIMPLIFY-CFG-NEXT: switch i32 [[TMP2]], label %[[BB9:.*]] [ 76; SIMPLIFY-CFG-NEXT: i32 0, label %[[BB7]] 77; SIMPLIFY-CFG-NEXT: i32 1, label %[[BB8:.*]] 78; SIMPLIFY-CFG-NEXT: ] 79; SIMPLIFY-CFG: [[BB7]]: 80; SIMPLIFY-CFG-NEXT: br label %[[BB9]] 81; SIMPLIFY-CFG: [[BB8]]: 82; SIMPLIFY-CFG-NEXT: br label %[[BB9]] 83; SIMPLIFY-CFG: [[BB9]]: 84; SIMPLIFY-CFG-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP4]], %[[BB6]] ], [ [[TMP3]], %[[BB8]] ], [ [[TMP3]], %[[BB7]] ] 85; SIMPLIFY-CFG-NEXT: ret i32 [[TMP10]] 86; 87 br i1 %0, label %6, label %7 886: 89 switch i32 %2, label %9 [ 90 i32 0, label %7 91 i32 1, label %8 92 ] 93 947: 95 br label %9 96 978: 98 br label %9 99 1009: 101 %10 = phi i32 [ %4, %6 ], [ %3, %8 ], [ %3, %7 ] 102 ret i32 %10 103} 104 105define i32 @switch_dup_default(i32 %0, i32 %1, i32 %2, i32 %3) { 106; SIMPLIFY-CFG-LABEL: define i32 @switch_dup_default( 107; SIMPLIFY-CFG-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]]) { 108; SIMPLIFY-CFG-NEXT: [[COND:%.*]] = icmp eq i32 [[TMP1]], 0 109; SIMPLIFY-CFG-NEXT: [[TMP8:%.*]] = select i1 [[COND]], i32 [[TMP3]], i32 [[TMP2]] 110; SIMPLIFY-CFG-NEXT: ret i32 [[TMP8]] 111; 112 switch i32 %1, label %7 [ 113 i32 0, label %5 114 i32 1, label %6 115 ] 116 1175: 118 br label %8 119 1206: 121 br label %8 122 1237: 124 br label %8 125 1268: 127 %9 = phi i32 [ %3, %5 ], [ %2, %6 ], [ %2, %7 ] 128 ret i32 %9 129} 130 131define i32 @switch_dup_exit(i32 %val) { 132; SIMPLIFY-CFG-LABEL: define i32 @switch_dup_exit( 133; SIMPLIFY-CFG-SAME: i32 [[VAL:%.*]]) { 134; SIMPLIFY-CFG-NEXT: [[ENTRY:.*]]: 135; SIMPLIFY-CFG-NEXT: switch i32 [[VAL]], label %[[DEFAULT:.*]] [ 136; SIMPLIFY-CFG-NEXT: i32 1, label %[[EXIT:.*]] 137; SIMPLIFY-CFG-NEXT: i32 11, label %[[EXIT]] 138; SIMPLIFY-CFG-NEXT: i32 22, label %[[BB1:.*]] 139; SIMPLIFY-CFG-NEXT: ] 140; SIMPLIFY-CFG: [[BB1]]: 141; SIMPLIFY-CFG-NEXT: br label %[[EXIT]] 142; SIMPLIFY-CFG: [[DEFAULT]]: 143; SIMPLIFY-CFG-NEXT: br label %[[EXIT]] 144; SIMPLIFY-CFG: [[EXIT]]: 145; SIMPLIFY-CFG-NEXT: [[RET:%.*]] = phi i32 [ 0, %[[DEFAULT]] ], [ 3, %[[BB1]] ], [ 1, %[[ENTRY]] ], [ 1, %[[ENTRY]] ] 146; SIMPLIFY-CFG-NEXT: ret i32 [[RET]] 147; 148entry: 149 switch i32 %val, label %default [ 150 i32 1, label %exit 151 i32 11, label %exit 152 i32 22, label %bb1 153 i32 15, label %bb2 154 i32 0, label %bb2 155 ] 156 157bb1: 158 br label %exit 159 160bb2: 161 br label %exit 162 163default: 164 br label %exit 165 166exit: 167 %ret = phi i32 [ 0, %default ], [ 0, %bb2 ], [ 3, %bb1 ], [ 1, %entry ], [ 1, %entry ] 168 ret i32 %ret 169} 170 171define i64 @switch_dup_exit_2(i32 %val) { 172; SIMPLIFY-CFG-LABEL: define i64 @switch_dup_exit_2( 173; SIMPLIFY-CFG-SAME: i32 [[VAL:%.*]]) { 174; SIMPLIFY-CFG-NEXT: [[ENTRY:.*:]] 175; SIMPLIFY-CFG-NEXT: [[SWITCH_SELECTCMP_CASE1:%.*]] = icmp eq i32 [[VAL]], 1 176; SIMPLIFY-CFG-NEXT: [[SWITCH_SELECTCMP_CASE2:%.*]] = icmp eq i32 [[VAL]], 11 177; SIMPLIFY-CFG-NEXT: [[SWITCH_SELECTCMP:%.*]] = or i1 [[SWITCH_SELECTCMP_CASE1]], [[SWITCH_SELECTCMP_CASE2]] 178; SIMPLIFY-CFG-NEXT: [[RET:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 1, i64 0 179; SIMPLIFY-CFG-NEXT: ret i64 [[RET]] 180; 181entry: 182 switch i32 %val, label %default [ 183 i32 1, label %bb2 184 i32 11, label %exit 185 i32 13, label %bb1 186 i32 0, label %bb1 187 ] 188 189bb1: 190 br label %exit 191 192bb2: 193 br label %exit 194 195default: 196 br label %exit 197 198exit: 199 %ret = phi i64 [ 0, %default ], [ 0, %bb1 ], [ 1, %entry ], [ 1, %bb2 ] 200 ret i64 %ret 201} 202