217 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='loop(loop-interchange),loop-mssa(simple-loop-unswitch<nontrivial>)' -S -verify-scev %s | FileCheck %s3 4declare void @clobber()5 6; Make sure SCEV loop and block dispositions are properly invalidated after7; unswitching.8define void @test_pr58564(i16 %a, i1 %c.1, ptr %dst) {9; CHECK-LABEL: @test_pr58564(10; CHECK-NEXT: entry:11; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i16 [[A:%.*]], -612; CHECK-NEXT: br i1 [[TMP0]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]13; CHECK: entry.split.us:14; CHECK-NEXT: br i1 [[C_1:%.*]], label [[ENTRY_SPLIT_US_SPLIT_US:%.*]], label [[ENTRY_SPLIT_US_SPLIT:%.*]]15; CHECK: entry.split.us.split.us:16; CHECK-NEXT: br label [[LOOP_1_HEADER_US_US:%.*]]17; CHECK: loop.1.header.us.us:18; CHECK-NEXT: br label [[LOOP_1_HEADER_SPLIT_US_US_US:%.*]]19; CHECK: loop.1.header.split.us.us.us:20; CHECK-NEXT: br label [[LOOP_1_HEADER_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]]21; CHECK: loop.1.header.split.us.split.us.split.us.split.us:22; CHECK-NEXT: br label [[LOOP_1_HEADER_SPLIT_US_SPLIT_US_SPLIT_US:%.*]]23; CHECK: entry.split.us.split:24; CHECK-NEXT: br label [[LOOP_1_HEADER_US:%.*]]25; CHECK: loop.1.header.us:26; CHECK-NEXT: br label [[LOOP_1_HEADER_SPLIT_US_US:%.*]]27; CHECK: loop.4.header.us5:28; CHECK-NEXT: br label [[LOOP_5_US6:%.*]]29; CHECK: loop.5.us6:30; CHECK-NEXT: [[IV_US7:%.*]] = phi i16 [ 0, [[LOOP_4_HEADER_US5:%.*]] ], [ [[IV_NEXT_US9:%.*]], [[LOOP_5_US6]] ]31; CHECK-NEXT: [[GEP_US8:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i16 [[IV_US7]]32; CHECK-NEXT: store ptr null, ptr [[GEP_US8]], align 833; CHECK-NEXT: [[IV_NEXT_US9]] = add nuw nsw i16 [[IV_US7]], 134; CHECK-NEXT: [[EC_US10:%.*]] = icmp ne i16 [[IV_US7]], 1000035; CHECK-NEXT: br i1 [[EC_US10]], label [[LOOP_5_US6]], label [[LOOP_4_LATCH_US11:%.*]]36; CHECK: loop.4.latch.us11:37; CHECK-NEXT: br label [[LOOP_1_LATCH_US:%.*]]38; CHECK: loop.1.latch.us:39; CHECK-NEXT: br label [[LOOP_1_HEADER_US]]40; CHECK: loop.4.header.preheader.us:41; CHECK-NEXT: br i1 false, label [[LOOP_4_HEADER_PREHEADER_SPLIT4_US_SPLIT_US:%.*]], label [[LOOP_4_HEADER_PREHEADER_SPLIT4_US15:%.*]]42; CHECK: loop.1.header.split.us.us:43; CHECK-NEXT: br label [[LOOP_1_HEADER_SPLIT_US_SPLIT_US14:%.*]]44; CHECK: loop.2.header.us.us12:45; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_US_US13:%.*]]46; CHECK: loop.2.latch.us.us:47; CHECK-NEXT: br i1 false, label [[LOOP_2_HEADER_US_US12:%.*]], label [[LOOP_4_HEADER_PREHEADER_SPLIT_US_US:%.*]]48; CHECK: loop.2.header.split.us.us.us13:49; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_SPLIT_US3_US:%.*]]50; CHECK: loop.3.header.us.us1.us:51; CHECK-NEXT: br label [[LOOP_3_LATCH_US_US2_US:%.*]]52; CHECK: loop.3.latch.us.us2.us:53; CHECK-NEXT: br label [[LOOP_2_LATCH_SPLIT_US_US_US:%.*]]54; CHECK: loop.2.latch.split.us.us.us:55; CHECK-NEXT: br label [[LOOP_2_LATCH_US_US:%.*]]56; CHECK: loop.2.header.split.us.split.us3.us:57; CHECK-NEXT: br label [[LOOP_3_HEADER_US_US1_US:%.*]]58; CHECK: loop.4.header.preheader.split.us.us:59; CHECK-NEXT: br label [[LOOP_4_HEADER_PREHEADER_US:%.*]]60; CHECK: loop.1.header.split.us.split.us14:61; CHECK-NEXT: br label [[LOOP_2_HEADER_US_US12]]62; CHECK: loop.4.header.preheader.split4.us15:63; CHECK-NEXT: br label [[LOOP_4_HEADER_US5]]64; CHECK: loop.4.header.preheader.split4.us.split.us:65; CHECK-NEXT: br label [[LOOP_4_HEADER_PREHEADER_SPLIT4_US:%.*]]66; CHECK: loop.1.header.split.us.split.us.split.us:67; CHECK-NEXT: br label [[LOOP_1_HEADER_SPLIT_US_SPLIT_US:%.*]]68; CHECK: entry.split:69; CHECK-NEXT: br label [[LOOP_1_HEADER:%.*]]70; CHECK: loop.1.header:71; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i16 [[A]], -672; CHECK-NEXT: br i1 [[TMP1]], label [[LOOP_1_HEADER_SPLIT_US:%.*]], label [[LOOP_1_HEADER_SPLIT:%.*]]73; CHECK: loop.1.header.split.us:74; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_1_HEADER_SPLIT_US_SPLIT_US_SPLIT:%.*]], label [[LOOP_1_HEADER_SPLIT_US_SPLIT:%.*]]75; CHECK: loop.1.header.split.us.split.us.split:76; CHECK-NEXT: br label [[LOOP_1_HEADER_SPLIT_US_SPLIT_US]]77; CHECK: loop.1.header.split.us.split.us:78; CHECK-NEXT: br label [[LOOP_2_HEADER_US_US:%.*]]79; CHECK: loop.2.header.us.us:80; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_US_US:%.*]]81; CHECK: loop.2.header.split.us.us.us:82; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_SPLIT_US_SPLIT_US_SPLIT_US:%.*]]83; CHECK: loop.2.header.split.us.split.us.split.us.split.us:84; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_SPLIT_US_SPLIT_US:%.*]]85; CHECK: loop.1.header.split.us.split:86; CHECK-NEXT: br label [[LOOP_2_HEADER_US:%.*]]87; CHECK: loop.2.header.us:88; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_US:%.*]]89; CHECK: loop.2.latch.us:90; CHECK-NEXT: br i1 false, label [[LOOP_2_HEADER_US]], label [[LOOP_4_HEADER_PREHEADER_SPLIT_US:%.*]]91; CHECK: loop.2.header.split.us.us:92; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_SPLIT_US3:%.*]]93; CHECK: loop.3.header.us.us1:94; CHECK-NEXT: br label [[LOOP_3_LATCH_US_US2:%.*]]95; CHECK: loop.3.latch.us.us2:96; CHECK-NEXT: br label [[LOOP_2_LATCH_SPLIT_US_US:%.*]]97; CHECK: loop.2.latch.split.us.us:98; CHECK-NEXT: br label [[LOOP_2_LATCH_US:%.*]]99; CHECK: loop.2.header.split.us.split.us3:100; CHECK-NEXT: br label [[LOOP_3_HEADER_US_US1:%.*]]101; CHECK: loop.4.header.preheader.split.us:102; CHECK-NEXT: br label [[LOOP_4_HEADER_PREHEADER:%.*]]103; CHECK: loop.2.header.split.us.split.us.split.us:104; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_SPLIT_US:%.*]]105; CHECK: loop.1.header.split:106; CHECK-NEXT: br label [[LOOP_2_HEADER:%.*]]107; CHECK: loop.2.header:108; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i16 [[A]], -6109; CHECK-NEXT: br i1 [[TMP2]], label [[LOOP_2_HEADER_SPLIT_US:%.*]], label [[LOOP_2_HEADER_SPLIT:%.*]]110; CHECK: loop.2.header.split.us:111; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_2_HEADER_SPLIT_US_SPLIT_US_SPLIT:%.*]], label [[LOOP_2_HEADER_SPLIT_US_SPLIT:%.*]]112; CHECK: loop.2.header.split.us.split.us.split:113; CHECK-NEXT: br label [[LOOP_2_HEADER_SPLIT_US_SPLIT_US]]114; CHECK: loop.2.header.split.us.split.us:115; CHECK-NEXT: br label [[LOOP_3_HEADER_US_US:%.*]]116; CHECK: loop.3.header.us.us:117; CHECK-NEXT: br label [[LOOP_3_LATCH_US_US:%.*]]118; CHECK: loop.3.latch.us.us:119; CHECK-NEXT: br label [[LOOP_3_HEADER_US_US]]120; CHECK: loop.2.header.split.us.split:121; CHECK-NEXT: br label [[LOOP_3_HEADER_US:%.*]]122; CHECK: loop.3.header.us:123; CHECK-NEXT: br label [[LOOP_3_LATCH_US:%.*]]124; CHECK: loop.3.latch.us:125; CHECK-NEXT: br label [[LOOP_2_LATCH_SPLIT_US:%.*]]126; CHECK: loop.2.latch.split.us:127; CHECK-NEXT: br label [[LOOP_2_LATCH:%.*]]128; CHECK: loop.2.header.split:129; CHECK-NEXT: br label [[LOOP_3_HEADER:%.*]]130; CHECK: loop.3.header:131; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i16 [[A]], -6132; CHECK-NEXT: br i1 [[TMP3]], label [[LOOP_3_LATCH:%.*]], label [[LOOP_3_THEN:%.*]]133; CHECK: loop.3.then:134; CHECK-NEXT: call void @clobber()135; CHECK-NEXT: br label [[LOOP_3_LATCH]]136; CHECK: loop.3.latch:137; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_3_HEADER]], label [[LOOP_2_LATCH_SPLIT:%.*]], !llvm.loop [[LOOP0:![0-9]+]]138; CHECK: loop.2.latch.split:139; CHECK-NEXT: br label [[LOOP_2_LATCH]]140; CHECK: loop.2.latch:141; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_2_HEADER]], label [[LOOP_4_HEADER_PREHEADER_SPLIT:%.*]], !llvm.loop [[LOOP2:![0-9]+]]142; CHECK: loop.4.header.preheader.split:143; CHECK-NEXT: br label [[LOOP_4_HEADER_PREHEADER]]144; CHECK: loop.4.header.preheader:145; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_4_HEADER_PREHEADER_SPLIT4_US_SPLIT:%.*]], label [[LOOP_4_HEADER_PREHEADER_SPLIT4:%.*]]146; CHECK: loop.4.header.preheader.split4.us.split:147; CHECK-NEXT: br label [[LOOP_4_HEADER_PREHEADER_SPLIT4_US]]148; CHECK: loop.4.header.preheader.split4.us:149; CHECK-NEXT: br label [[LOOP_4_HEADER_US:%.*]]150; CHECK: loop.4.header.us:151; CHECK-NEXT: br label [[LOOP_5_US:%.*]]152; CHECK: loop.5.us:153; CHECK-NEXT: [[IV_US:%.*]] = phi i16 [ 0, [[LOOP_4_HEADER_US]] ], [ [[IV_NEXT_US:%.*]], [[LOOP_5_US]] ]154; CHECK-NEXT: [[GEP_US:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i16 [[IV_US]]155; CHECK-NEXT: store ptr null, ptr [[GEP_US]], align 8156; CHECK-NEXT: [[IV_NEXT_US]] = add nuw nsw i16 [[IV_US]], 1157; CHECK-NEXT: [[EC_US:%.*]] = icmp ne i16 [[IV_US]], 10000158; CHECK-NEXT: br i1 [[EC_US]], label [[LOOP_5_US]], label [[LOOP_4_LATCH_US:%.*]]159; CHECK: loop.4.latch.us:160; CHECK-NEXT: br label [[LOOP_4_HEADER_US]]161; CHECK: loop.4.header.preheader.split4:162; CHECK-NEXT: br label [[LOOP_4_HEADER:%.*]]163; CHECK: loop.4.header:164; CHECK-NEXT: br label [[LOOP_5:%.*]]165; CHECK: loop.5:166; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[LOOP_4_HEADER]] ], [ [[IV_NEXT:%.*]], [[LOOP_5]] ]167; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds ptr, ptr [[DST]], i16 [[IV]]168; CHECK-NEXT: store ptr null, ptr [[GEP]], align 8169; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1170; CHECK-NEXT: [[EC:%.*]] = icmp ne i16 [[IV]], 10000171; CHECK-NEXT: br i1 [[EC]], label [[LOOP_5]], label [[LOOP_4_LATCH:%.*]]172; CHECK: loop.4.latch:173; CHECK-NEXT: br label [[LOOP_1_LATCH:%.*]]174; CHECK: loop.1.latch:175; CHECK-NEXT: br label [[LOOP_1_HEADER]], !llvm.loop [[LOOP3:![0-9]+]]176;177entry:178 br label %loop.1.header179 180loop.1.header:181 br label %loop.2.header182 183loop.2.header:184 br label %loop.3.header185 186loop.3.header:187 %0 = icmp ult i16 %a, -6188 br i1 %0, label %loop.3.latch, label %loop.3.then189 190loop.3.then:191 call void @clobber()192 br label %loop.3.latch193 194loop.3.latch:195 br i1 %c.1, label %loop.3.header, label %loop.2.latch196 197loop.2.latch:198 br i1 %c.1, label %loop.2.header, label %loop.4.header199 200loop.4.header:201 br label %loop.5202 203loop.5:204 %iv = phi i16 [ 0, %loop.4.header ], [ %iv.next, %loop.5 ]205 %gep = getelementptr inbounds ptr, ptr %dst, i16 %iv206 store ptr null, ptr %gep, align 8207 %iv.next = add nuw nsw i16 %iv, 1208 %ec = icmp ne i16 %iv, 10000209 br i1 %ec, label %loop.5, label %loop.4.latch210 211loop.4.latch:212 br i1 %c.1, label %loop.4.header, label %loop.1.latch213 214loop.1.latch:215 br label %loop.1.header216}217