1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=loop-deletion -S | FileCheck %s 3; RUN: opt < %s -passes='loop(loop-deletion)' -S | FileCheck %s 4 5; Make sure we do not get the miscompile on this test with irreducible CFG. 6define i16 @test_01(i16 %j, i16 %k, i16 %recurs) { ; If we have %j: 1, %k: 1, %recurs: 0 7; CHECK-LABEL: @test_01( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i16 [[RECURS:%.*]], 0 10; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 11; CHECK: if.then: 12; CHECK-NEXT: [[CALL:%.*]] = tail call i16 @test_01(i16 0, i16 0, i16 0) 13; CHECK-NEXT: br label [[IF_END]] 14; CHECK: if.end: 15; CHECK-NEXT: [[CMP:%.*]] = icmp eq i16 [[J:%.*]], 0 16; CHECK-NEXT: br label [[BB2:%.*]] 17; CHECK: bb2: 18; CHECK-NEXT: [[K_ADDR_0:%.*]] = phi i16 [ [[K:%.*]], [[IF_END]] ], [ [[K_ADDR_2:%.*]], [[BB12:%.*]] ] 19; CHECK-NEXT: [[RESULT_0:%.*]] = phi i16 [ 0, [[IF_END]] ], [ 20, [[BB12]] ] 20; CHECK-NEXT: br i1 [[CMP]], label [[BB12]], label [[BB4:%.*]] 21; CHECK: bb4: 22; CHECK-NEXT: [[K_ADDR_1:%.*]] = phi i16 [ [[K_ADDR_0]], [[BB2]] ], [ [[K_ADDR_2]], [[BB12]] ] 23; CHECK-NEXT: [[X_1:%.*]] = phi i16 [ 0, [[BB2]] ], [ 1, [[BB12]] ] 24; CHECK-NEXT: [[RESULT_1:%.*]] = phi i16 [ [[RESULT_0]], [[BB2]] ], [ 10, [[BB12]] ] 25; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i16 [[K_ADDR_1]], 0 26; CHECK-NEXT: br i1 [[CMP2]], label [[BB13:%.*]], label [[BB12]] 27; CHECK: bb12: 28; CHECK-NEXT: [[K_ADDR_2]] = phi i16 [ [[K_ADDR_0]], [[BB2]] ], [ 0, [[BB4]] ] 29; CHECK-NEXT: [[X_2:%.*]] = phi i16 [ 1, [[BB2]] ], [ [[X_1]], [[BB4]] ] 30; CHECK-NEXT: [[CMP5:%.*]] = icmp eq i16 [[X_2]], 0 31; CHECK-NEXT: br i1 [[CMP5]], label [[BB2]], label [[BB4]] 32; CHECK: bb13: 33; CHECK-NEXT: [[RESULT_1_LCSSA:%.*]] = phi i16 [ [[RESULT_1]], [[BB4]] ] 34; CHECK-NEXT: ret i16 [[RESULT_1_LCSSA]] 35; 36entry: 37 %tobool.not = icmp eq i16 %recurs, 0 ; 1 38 br i1 %tobool.not, label %if.end, label %if.then ; -> if.end 39 40if.then: ; preds = %entry 41 %call = tail call i16 @test_01(i16 0, i16 0, i16 0) 42 br label %if.end 43 44if.end: ; preds = %if.then, %entry 45 %cmp = icmp eq i16 %j, 0 ; 0 46 br label %bb2 ; -> bb2 47 48bb2: ; preds = %bb12, %if.end 49 %k.addr.0 = phi i16 [ %k, %if.end ], [ %k.addr.2, %bb12 ] ; 1 50 %result.0 = phi i16 [ 0, %if.end ], [ 20, %bb12 ] ; 0 51 br i1 %cmp, label %bb12, label %bb4 ; %cmp: 0 -> bb4 52 53bb4: ; preds = %bb12, %bb2 54 %k.addr.1 = phi i16 [ %k.addr.0, %bb2 ], [ %k.addr.2, %bb12 ] ; 1 55 %x.1 = phi i16 [ 0, %bb2 ], [ 1, %bb12 ] ; 0 56 %result.1 = phi i16 [ %result.0, %bb2 ], [ 10, %bb12 ] 57 %cmp2 = icmp eq i16 %k.addr.1, 0 ; 0 58 br i1 %cmp2, label %bb13, label %bb12 ; -> bb12 59 60bb12: ; preds = %bb4, %bb2 61 %k.addr.2 = phi i16 [ %k.addr.0, %bb2 ], [ 0, %bb4 ] ; 0 62 %x.2 = phi i16 [ 1, %bb2 ], [ %x.1, %bb4 ] ; 0 63 %cmp5 = icmp eq i16 %x.2, 0 ; 1 64 br i1 %cmp5, label %bb2, label %bb4 ; -> bb2 65 66bb13: ; preds = %bb4 67 %result.1.lcssa = phi i16 [ %result.1, %bb4 ] 68 ret i16 %result.1.lcssa 69} 70 71; Another nasty case of irreducible CFG. Make sure we do not crash here. 72define void @test_02() { 73; CHECK-LABEL: @test_02( 74; CHECK-NEXT: bb: 75; CHECK-NEXT: br label [[BB17:%.*]] 76; CHECK: bb1: 77; CHECK-NEXT: ret void 78; CHECK: bb2: 79; CHECK-NEXT: unreachable 80; CHECK: bb3: 81; CHECK-NEXT: unreachable 82; CHECK: bb4: 83; CHECK-NEXT: unreachable 84; CHECK: bb5: 85; CHECK-NEXT: unreachable 86; CHECK: bb6: 87; CHECK-NEXT: unreachable 88; CHECK: bb7: 89; CHECK-NEXT: unreachable 90; CHECK: bb8: 91; CHECK-NEXT: unreachable 92; CHECK: bb9: 93; CHECK-NEXT: switch i8 undef, label [[BB13:%.*]] [ 94; CHECK-NEXT: i8 3, label [[BB10:%.*]] 95; CHECK-NEXT: i8 43, label [[BB10]] 96; CHECK-NEXT: i8 37, label [[BB11:%.*]] 97; CHECK-NEXT: i8 2, label [[BB12:%.*]] 98; CHECK-NEXT: i8 4, label [[BB12]] 99; CHECK-NEXT: i8 20, label [[BB12]] 100; CHECK-NEXT: i8 42, label [[BB12]] 101; CHECK-NEXT: i8 44, label [[BB12]] 102; CHECK-NEXT: i8 54, label [[BB12]] 103; CHECK-NEXT: ] 104; CHECK: bb10: 105; CHECK-NEXT: unreachable 106; CHECK: bb11: 107; CHECK-NEXT: unreachable 108; CHECK: bb12: 109; CHECK-NEXT: br label [[BB19:%.*]] 110; CHECK: bb13: 111; CHECK-NEXT: unreachable 112; CHECK: bb14: 113; CHECK-NEXT: unreachable 114; CHECK: bb15: 115; CHECK-NEXT: unreachable 116; CHECK: bb16: 117; CHECK-NEXT: br label [[BB17]] 118; CHECK: bb17: 119; CHECK-NEXT: [[TMP:%.*]] = icmp sgt i32 0, 1 120; CHECK-NEXT: br i1 [[TMP]], label [[BB18:%.*]], label [[BB19]] 121; CHECK: bb18: 122; CHECK-NEXT: br label [[BB20:%.*]] 123; CHECK: bb19: 124; CHECK-NEXT: br label [[BB20]] 125; CHECK: bb20: 126; CHECK-NEXT: switch i8 undef, label [[BB16:%.*]] [ 127; CHECK-NEXT: i8 0, label [[BB1:%.*]] 128; CHECK-NEXT: i8 1, label [[BB1]] 129; CHECK-NEXT: i8 8, label [[BB1]] 130; CHECK-NEXT: i8 9, label [[BB1]] 131; CHECK-NEXT: i8 12, label [[BB1]] 132; CHECK-NEXT: i8 13, label [[BB1]] 133; CHECK-NEXT: i8 40, label [[BB1]] 134; CHECK-NEXT: i8 41, label [[BB1]] 135; CHECK-NEXT: i8 52, label [[BB1]] 136; CHECK-NEXT: i8 53, label [[BB1]] 137; CHECK-NEXT: i8 55, label [[BB15:%.*]] 138; CHECK-NEXT: i8 15, label [[BB14:%.*]] 139; CHECK-NEXT: i8 29, label [[BB9:%.*]] 140; CHECK-NEXT: i8 37, label [[BB8:%.*]] 141; CHECK-NEXT: i8 69, label [[BB3:%.*]] 142; CHECK-NEXT: i8 89, label [[BB7:%.*]] 143; CHECK-NEXT: i8 85, label [[BB6:%.*]] 144; CHECK-NEXT: i8 81, label [[BB5:%.*]] 145; CHECK-NEXT: i8 65, label [[BB2:%.*]] 146; CHECK-NEXT: i8 73, label [[BB4:%.*]] 147; CHECK-NEXT: ] 148; 149bb: 150 br label %bb17 151 152bb1: ; preds = %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20 153 ret void 154 155bb2: ; preds = %bb20 156 unreachable 157 158bb3: ; preds = %bb20 159 unreachable 160 161bb4: ; preds = %bb20 162 unreachable 163 164bb5: ; preds = %bb20 165 unreachable 166 167bb6: ; preds = %bb20 168 unreachable 169 170bb7: ; preds = %bb20 171 unreachable 172 173bb8: ; preds = %bb20 174 unreachable 175 176bb9: ; preds = %bb20 177 switch i8 undef, label %bb13 [ 178 i8 3, label %bb10 179 i8 43, label %bb10 180 i8 37, label %bb11 181 i8 2, label %bb12 182 i8 4, label %bb12 183 i8 20, label %bb12 184 i8 42, label %bb12 185 i8 44, label %bb12 186 i8 54, label %bb12 187 ] 188 189bb10: ; preds = %bb9, %bb9 190 unreachable 191 192bb11: ; preds = %bb9 193 unreachable 194 195bb12: ; preds = %bb9, %bb9, %bb9, %bb9, %bb9, %bb9 196 br label %bb19 197 198bb13: ; preds = %bb9 199 unreachable 200 201bb14: ; preds = %bb20 202 unreachable 203 204bb15: ; preds = %bb20 205 unreachable 206 207bb16: ; preds = %bb20 208 br label %bb17 209 210bb17: ; preds = %bb16, %bb 211 %tmp = icmp sgt i32 0, 1 212 br i1 %tmp, label %bb18, label %bb19 213 214bb18: ; preds = %bb17 215 br label %bb20 216 217bb19: ; preds = %bb17, %bb12 218 br label %bb20 219 220bb20: ; preds = %bb19, %bb18 221 switch i8 undef, label %bb16 [ 222 i8 0, label %bb1 223 i8 1, label %bb1 224 i8 8, label %bb1 225 i8 9, label %bb1 226 i8 12, label %bb1 227 i8 13, label %bb1 228 i8 40, label %bb1 229 i8 41, label %bb1 230 i8 52, label %bb1 231 i8 53, label %bb1 232 i8 55, label %bb15 233 i8 15, label %bb14 234 i8 29, label %bb9 235 i8 37, label %bb8 236 i8 69, label %bb3 237 i8 89, label %bb7 238 i8 85, label %bb6 239 i8 81, label %bb5 240 i8 65, label %bb2 241 i8 73, label %bb4 242 ] 243} 244