244 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-deletion -S | FileCheck %s3; RUN: opt < %s -passes='loop(loop-deletion)' -S | FileCheck %s4 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: 07; CHECK-LABEL: @test_01(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i16 [[RECURS:%.*]], 010; 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:%.*]], 016; 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]], 026; 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]], 031; 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 ; 138 br i1 %tobool.not, label %if.end, label %if.then ; -> if.end39 40if.then: ; preds = %entry41 %call = tail call i16 @test_01(i16 0, i16 0, i16 0)42 br label %if.end43 44if.end: ; preds = %if.then, %entry45 %cmp = icmp eq i16 %j, 0 ; 046 br label %bb2 ; -> bb247 48bb2: ; preds = %bb12, %if.end49 %k.addr.0 = phi i16 [ %k, %if.end ], [ %k.addr.2, %bb12 ] ; 150 %result.0 = phi i16 [ 0, %if.end ], [ 20, %bb12 ] ; 051 br i1 %cmp, label %bb12, label %bb4 ; %cmp: 0 -> bb452 53bb4: ; preds = %bb12, %bb254 %k.addr.1 = phi i16 [ %k.addr.0, %bb2 ], [ %k.addr.2, %bb12 ] ; 155 %x.1 = phi i16 [ 0, %bb2 ], [ 1, %bb12 ] ; 056 %result.1 = phi i16 [ %result.0, %bb2 ], [ 10, %bb12 ]57 %cmp2 = icmp eq i16 %k.addr.1, 0 ; 058 br i1 %cmp2, label %bb13, label %bb12 ; -> bb1259 60bb12: ; preds = %bb4, %bb261 %k.addr.2 = phi i16 [ %k.addr.0, %bb2 ], [ 0, %bb4 ] ; 062 %x.2 = phi i16 [ 1, %bb2 ], [ %x.1, %bb4 ] ; 063 %cmp5 = icmp eq i16 %x.2, 0 ; 164 br i1 %cmp5, label %bb2, label %bb4 ; -> bb265 66bb13: ; preds = %bb467 %result.1.lcssa = phi i16 [ %result.1, %bb4 ]68 ret i16 %result.1.lcssa69}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 void78; CHECK: bb2:79; CHECK-NEXT: unreachable80; CHECK: bb3:81; CHECK-NEXT: unreachable82; CHECK: bb4:83; CHECK-NEXT: unreachable84; CHECK: bb5:85; CHECK-NEXT: unreachable86; CHECK: bb6:87; CHECK-NEXT: unreachable88; CHECK: bb7:89; CHECK-NEXT: unreachable90; CHECK: bb8:91; CHECK-NEXT: unreachable92; 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: unreachable106; CHECK: bb11:107; CHECK-NEXT: unreachable108; CHECK: bb12:109; CHECK-NEXT: br label [[BB19:%.*]]110; CHECK: bb13:111; CHECK-NEXT: unreachable112; CHECK: bb14:113; CHECK-NEXT: unreachable114; CHECK: bb15:115; CHECK-NEXT: unreachable116; CHECK: bb16:117; CHECK-NEXT: br label [[BB17]]118; CHECK: bb17:119; CHECK-NEXT: [[TMP:%.*]] = icmp sgt i32 0, 1120; 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 %bb17151 152bb1: ; preds = %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20, %bb20153 ret void154 155bb2: ; preds = %bb20156 unreachable157 158bb3: ; preds = %bb20159 unreachable160 161bb4: ; preds = %bb20162 unreachable163 164bb5: ; preds = %bb20165 unreachable166 167bb6: ; preds = %bb20168 unreachable169 170bb7: ; preds = %bb20171 unreachable172 173bb8: ; preds = %bb20174 unreachable175 176bb9: ; preds = %bb20177 switch i8 undef, label %bb13 [178 i8 3, label %bb10179 i8 43, label %bb10180 i8 37, label %bb11181 i8 2, label %bb12182 i8 4, label %bb12183 i8 20, label %bb12184 i8 42, label %bb12185 i8 44, label %bb12186 i8 54, label %bb12187 ]188 189bb10: ; preds = %bb9, %bb9190 unreachable191 192bb11: ; preds = %bb9193 unreachable194 195bb12: ; preds = %bb9, %bb9, %bb9, %bb9, %bb9, %bb9196 br label %bb19197 198bb13: ; preds = %bb9199 unreachable200 201bb14: ; preds = %bb20202 unreachable203 204bb15: ; preds = %bb20205 unreachable206 207bb16: ; preds = %bb20208 br label %bb17209 210bb17: ; preds = %bb16, %bb211 %tmp = icmp sgt i32 0, 1212 br i1 %tmp, label %bb18, label %bb19213 214bb18: ; preds = %bb17215 br label %bb20216 217bb19: ; preds = %bb17, %bb12218 br label %bb20219 220bb20: ; preds = %bb19, %bb18221 switch i8 undef, label %bb16 [222 i8 0, label %bb1223 i8 1, label %bb1224 i8 8, label %bb1225 i8 9, label %bb1226 i8 12, label %bb1227 i8 13, label %bb1228 i8 40, label %bb1229 i8 41, label %bb1230 i8 52, label %bb1231 i8 53, label %bb1232 i8 55, label %bb15233 i8 15, label %bb14234 i8 29, label %bb9235 i8 37, label %bb8236 i8 69, label %bb3237 i8 89, label %bb7238 i8 85, label %bb6239 i8 81, label %bb5240 i8 65, label %bb2241 i8 73, label %bb4242 ]243}244