brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.8 KiB · b5b1c0e Raw
280 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-interchange -cache-line-size=4 -loop-interchange-threshold=-100 -verify-dom-info -verify-loop-info -verify-scev -verify-loop-lcssa -S | FileCheck %s3 4; Make sure the loops are in LCSSA form after loop interchange,5; and loop interchange does not hit assertion errors and crash.6 7target triple = "x86_64-unknown-linux-gnu"8 9@b = external global [512 x [4 x i32]], align 110@c = external global [2 x [4 x i32]], align 111@d = external global [1024 x [512 x [4 x i32]]], align 112 13define void @test1() {14; CHECK-LABEL: @test1(15; CHECK-NEXT:  entry:16; CHECK-NEXT:    br label [[FOR_COND37_PREHEADER_PREHEADER:%.*]]17; CHECK:       for.cond33.preheader.preheader:18; CHECK-NEXT:    br label [[FOR_COND33_PREHEADER:%.*]]19; CHECK:       for.cond33.preheader:20; CHECK-NEXT:    [[I_011:%.*]] = phi i16 [ [[INC69:%.*]], [[FOR_END67:%.*]] ], [ 0, [[FOR_COND33_PREHEADER_PREHEADER:%.*]] ]21; CHECK-NEXT:    br label [[FOR_BODY42_SPLIT1:%.*]]22; CHECK:       for.body42.preheader:23; CHECK-NEXT:    br label [[FOR_BODY42:%.*]]24; CHECK:       for.cond37.preheader.preheader:25; CHECK-NEXT:    br label [[FOR_COND37_PREHEADER:%.*]]26; CHECK:       for.cond37.preheader:27; CHECK-NEXT:    [[J_010:%.*]] = phi i16 [ [[INC66:%.*]], [[FOR_END64:%.*]] ], [ 0, [[FOR_COND37_PREHEADER_PREHEADER]] ]28; CHECK-NEXT:    br label [[FOR_BODY42_PREHEADER:%.*]]29; CHECK:       for.body42:30; CHECK-NEXT:    [[K_09:%.*]] = phi i16 [ [[TMP1:%.*]], [[FOR_BODY42_SPLIT:%.*]] ], [ -512, [[FOR_BODY42_PREHEADER]] ]31; CHECK-NEXT:    br label [[FOR_COND33_PREHEADER_PREHEADER]]32; CHECK:       for.body42.split1:33; CHECK-NEXT:    [[SUB51:%.*]] = add nsw i16 [[K_09]], 51234; CHECK-NEXT:    [[ARRAYIDX55:%.*]] = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 [[SUB51]], i16 [[J_010]]35; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX55]], align 136; CHECK-NEXT:    [[ADD61:%.*]] = add i32 undef, undef37; CHECK-NEXT:    [[INC63:%.*]] = add nsw i16 [[K_09]], 138; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[K_09]], 4239; CHECK-NEXT:    br label [[FOR_END67]]40; CHECK:       for.body42.split:41; CHECK-NEXT:    [[ADD61_LCSSA:%.*]] = phi i32 [ [[ADD61]], [[FOR_END67]] ]42; CHECK-NEXT:    [[TMP1]] = add nsw i16 [[K_09]], 143; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i16 [[K_09]], 4244; CHECK-NEXT:    br i1 [[TMP2]], label [[FOR_BODY42]], label [[FOR_END64]]45; CHECK:       for.end64:46; CHECK-NEXT:    [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61_LCSSA]], [[FOR_BODY42_SPLIT]] ]47; CHECK-NEXT:    store i32 [[ADD61_LCSSA_LCSSA]], ptr undef, align 148; CHECK-NEXT:    [[INC66]] = add nuw nsw i16 [[J_010]], 149; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i16 [[J_010]], 4350; CHECK-NEXT:    br i1 [[CMP2]], label [[FOR_COND37_PREHEADER]], label [[FOR_COND75_PREHEADER:%.*]]51; CHECK:       for.end67:52; CHECK-NEXT:    [[INC69]] = add nuw nsw i16 [[I_011]], 153; CHECK-NEXT:    [[EXITCOND13_NOT:%.*]] = icmp eq i16 [[INC69]], 254; CHECK-NEXT:    br i1 [[EXITCOND13_NOT]], label [[FOR_BODY42_SPLIT]], label [[FOR_COND33_PREHEADER]]55; CHECK:       for.cond75.preheader:56; CHECK-NEXT:    br label [[FOR_COND75:%.*]]57; CHECK:       for.cond75:58; CHECK-NEXT:    br label [[FOR_COND75]]59;60entry:61  br label %for.cond33.preheader62 63for.cond33.preheader:                             ; preds = %for.end67, %entry64  %i.011 = phi i16 [ 0, %entry ], [ %inc69, %for.end67 ]65  br label %for.cond37.preheader66 67for.cond37.preheader:                             ; preds = %for.end64, %for.cond33.preheader68  %j.010 = phi i16 [ 0, %for.cond33.preheader ], [ %inc66, %for.end64 ]69  br label %for.body4270 71for.body42:                                       ; preds = %for.body42, %for.cond37.preheader72  %k.09 = phi i16 [ -512, %for.cond37.preheader ], [ %inc63, %for.body42 ]73  %sub51 = add nsw i16 %k.09, 51274  %arrayidx55 = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 %sub51, i16 %j.01075  %0 = load i32, ptr %arrayidx55, align 176  %add61 = add i32 undef, undef77  %inc63 = add nsw i16 %k.09, 178  %cmp = icmp slt i16 %k.09, 4279  br i1 %cmp, label %for.body42, label %for.end6480 81for.end64:                                        ; preds = %for.body4282  store i32 %add61, ptr undef, align 183  %inc66 = add nuw nsw i16 %j.010, 184  %cmp2 = icmp slt i16 %j.010, 4385  br i1 %cmp2, label %for.cond37.preheader, label %for.end6786 87for.end67:                                        ; preds = %for.end6488  %inc69 = add nuw nsw i16 %i.011, 189  %exitcond13.not = icmp eq i16 %inc69, 290  br i1 %exitcond13.not, label %for.cond75, label %for.cond33.preheader91 92for.cond75:                                       ; preds = %for.cond75, %for.end6793  br label %for.cond7594}95 96; Make sure that we split the phi nodes in the middle loop header97; into a separate basic block to avoid the situation where use of98; the outermost indvar appears before its def after interchanging99; the outermost and the middle loop. Otherwise loop interchange100; would crash.101 102define void @test2() {103; CHECK-LABEL: @test2(104; CHECK-NEXT:  entry:105; CHECK-NEXT:    br label [[FOR_COND33_PREHEADER:%.*]]106; CHECK:       for.cond33.preheader.preheader:107; CHECK-NEXT:    br label [[FOR_COND33_PREHEADER1:%.*]]108; CHECK:       for.cond33.preheader:109; CHECK-NEXT:    [[I_166:%.*]] = phi i16 [ [[INC69:%.*]], [[FOR_INC68:%.*]] ], [ 0, [[FOR_COND33_PREHEADER_PREHEADER:%.*]] ]110; CHECK-NEXT:    [[ARRAYIDX60:%.*]] = getelementptr inbounds [2 x [4 x i32]], ptr @c, i16 0, i16 [[I_166]], i16 [[J_165:%.*]]111; CHECK-NEXT:    br label [[FOR_COND37_PREHEADER:%.*]]112; CHECK:       for.cond37.preheader.preheader:113; CHECK-NEXT:    br label [[FOR_COND37_PREHEADER1:%.*]]114; CHECK:       for.cond37.preheader:115; CHECK-NEXT:    [[J_165]] = phi i16 [ [[INC66:%.*]], [[MIDDLE_BLOCK80:%.*]] ], [ 0, [[FOR_COND33_PREHEADER]] ]116; CHECK-NEXT:    br label [[VECTOR_BODY85:%.*]]117; CHECK:       for.cond37.preheader.split:118; CHECK-NEXT:    br label [[VECTOR_BODY86:%.*]]119; CHECK:       vector.body85:120; CHECK-NEXT:    [[INDEX86:%.*]] = phi i16 [ 0, [[VECTOR_BODY85]] ], [ [[TMP5:%.*]], [[VECTOR_BODY85_SPLIT:%.*]] ]121; CHECK-NEXT:    br label [[FOR_COND33_PREHEADER_PREHEADER]]122; CHECK:       vector.body85.split1:123; CHECK-NEXT:    [[TMP0:%.*]] = or disjoint i16 [[INDEX86]], 2124; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 [[TMP0]], i16 [[J_165]]125; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1126; CHECK-NEXT:    [[TMP3:%.*]] = add nuw i16 [[INDEX86]], 4127; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i16 [[INDEX86]], 42128; CHECK-NEXT:    br label [[FOR_INC68]]129; CHECK:       vector.body85.split:130; CHECK-NEXT:    [[TMP5]] = add nuw i16 [[INDEX86]], 4131; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt i16 [[INDEX86]], 42132; CHECK-NEXT:    br i1 [[TMP4]], label [[VECTOR_BODY86]], label [[MIDDLE_BLOCK80]]133; CHECK:       middle.block80:134; CHECK-NEXT:    [[INC66]] = add nuw nsw i16 [[J_165]], 1135; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[INC66]], 42136; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_COND37_PREHEADER1]], label [[FOR_COND75_PREHEADER:%.*]]137; CHECK:       for.inc68:138; CHECK-NEXT:    [[INC69]] = add nuw nsw i16 [[I_166]], 1139; CHECK-NEXT:    [[EXITCOND77_NOT:%.*]] = icmp slt i16 [[INC69]], 24140; CHECK-NEXT:    br i1 [[EXITCOND77_NOT]], label [[FOR_COND33_PREHEADER1]], label [[VECTOR_BODY85_SPLIT]]141; CHECK:       for.cond75.preheader:142; CHECK-NEXT:    unreachable143;144entry:145  br label %for.cond33.preheader146 147for.cond33.preheader:                             ; preds = %for.inc68, %entry148  %i.166 = phi i16 [ %inc69, %for.inc68 ], [ 0, %entry ]149  br label %for.cond37.preheader150 151for.cond37.preheader:                             ; preds = %middle.block80, %for.cond33.preheader152  %j.165 = phi i16 [ 0, %for.cond33.preheader ], [ %inc66, %middle.block80 ]153  %arrayidx60 = getelementptr inbounds [2 x [4 x i32]], ptr @c, i16 0, i16 %i.166, i16 %j.165154  br label %vector.body85155 156vector.body85:                                    ; preds = %vector.body85, %for.cond37.preheader157  %index86 = phi i16 [ 0, %for.cond37.preheader ], [ %index.next87, %vector.body85 ]158  %0 = or disjoint i16 %index86, 2159  %1 = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 %0, i16 %j.165160  %2 = load i32, ptr %1, align 1161  %index.next87 = add nuw i16 %index86, 4162  %cmp2 = icmp slt i16 %index86, 42163  br i1 %cmp2, label %vector.body85, label %middle.block80164 165middle.block80:                                   ; preds = %vector.body85166  %inc66 = add nuw nsw i16 %j.165, 1167  %cmp = icmp slt i16 %inc66, 42168  br i1 %cmp, label %for.cond37.preheader, label %for.inc68169 170for.inc68:                                        ; preds = %middle.block80171  %inc69 = add nuw nsw i16 %i.166, 1172  %exitcond77.not = icmp slt i16 %inc69, 24173  br i1 %exitcond77.not, label %for.cond33.preheader, label %for.cond75.preheader174 175for.cond75.preheader:                             ; preds = %for.inc68176  unreachable177}178 179; Same as test1, but with a third index on the GEP180define void @test3() {181; CHECK-LABEL: @test3(182; CHECK-NEXT:  entry:183; CHECK-NEXT:    br label [[FOR_COND37_PREHEADER_PREHEADER:%.*]]184; CHECK:       for.cond33.preheader.preheader:185; CHECK-NEXT:    br label [[FOR_COND33_PREHEADER:%.*]]186; CHECK:       for.cond33.preheader:187; CHECK-NEXT:    [[I_011:%.*]] = phi i16 [ [[INC69:%.*]], [[FOR_END67:%.*]] ], [ 0, [[FOR_COND33_PREHEADER_PREHEADER:%.*]] ]188; CHECK-NEXT:    br label [[FOR_COND38_PREHEADER:%.*]]189; CHECK:       for.body42.preheader:190; CHECK-NEXT:    br label [[FOR_BODY42:%.*]]191; CHECK:       for.cond38.preheader.preheader:192; CHECK-NEXT:    br label [[FOR_COND38_PREHEADER1:%.*]]193; CHECK:       for.cond37.preheader.preheader:194; CHECK-NEXT:    br label [[FOR_COND37_PREHEADER:%.*]]195; CHECK:       for.cond37.preheader:196; CHECK-NEXT:    [[J_010:%.*]] = phi i16 [ [[INC66:%.*]], [[FOR_END64:%.*]] ], [ 0, [[FOR_COND37_PREHEADER_PREHEADER]] ]197; CHECK-NEXT:    br label [[FOR_COND38_PREHEADER_PREHEADER:%.*]]198; CHECK:       for.cond38.preheader:199; CHECK-NEXT:    [[K_010:%.*]] = phi i16 [ [[INC67:%.*]], [[FOR_END65:%.*]] ], [ 0, [[FOR_COND38_PREHEADER_PREHEADER]] ]200; CHECK-NEXT:    br label [[FOR_BODY42_PREHEADER:%.*]]201; CHECK:       for.body42:202; CHECK-NEXT:    [[K_09:%.*]] = phi i16 [ [[TMP3:%.*]], [[FOR_BODY42_SPLIT:%.*]] ], [ -512, [[FOR_BODY42_PREHEADER]] ]203; CHECK-NEXT:    br label [[FOR_COND33_PREHEADER_PREHEADER]]204; CHECK:       for.body42.split1:205; CHECK-NEXT:    [[SUB51:%.*]] = add nsw i16 [[K_09]], 512206; CHECK-NEXT:    [[ARRAYIDX55:%.*]] = getelementptr inbounds [1024 x [512 x [4 x i32]]], ptr @d, i16 0, i16 [[SUB51]], i16 [[J_010]], i16 [[K_010]]207; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX55]], align 1208; CHECK-NEXT:    [[ADD61:%.*]] = add i32 undef, undef209; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i16 [[K_09]], 1210; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i16 [[K_09]], 42211; CHECK-NEXT:    br label [[FOR_END67]]212; CHECK:       for.body42.split:213; CHECK-NEXT:    [[ADD61_LCSSA:%.*]] = phi i32 [ [[ADD61]], [[FOR_END67]] ]214; CHECK-NEXT:    [[TMP3]] = add nsw i16 [[K_09]], 1215; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i16 [[K_09]], 42216; CHECK-NEXT:    br i1 [[TMP2]], label [[FOR_BODY42]], label [[FOR_END65]]217; CHECK:       for.end65:218; CHECK-NEXT:    [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61_LCSSA]], [[FOR_BODY42_SPLIT]] ]219; CHECK-NEXT:    store i32 [[ADD61_LCSSA_LCSSA]], ptr undef, align 1220; CHECK-NEXT:    [[INC67]] = add nuw nsw i16 [[K_010]], 1221; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i16 [[K_010]], 44222; CHECK-NEXT:    br i1 [[CMP3]], label [[FOR_COND38_PREHEADER1]], label [[FOR_END64]]223; CHECK:       for.end64:224; CHECK-NEXT:    [[INC66]] = add nuw nsw i16 [[J_010]], 1225; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i16 [[J_010]], 43226; CHECK-NEXT:    br i1 [[CMP2]], label [[FOR_COND37_PREHEADER]], label [[FOR_COND75_PREHEADER:%.*]]227; CHECK:       for.end67:228; CHECK-NEXT:    [[INC69]] = add nuw nsw i16 [[I_011]], 1229; CHECK-NEXT:    [[EXITCOND13_NOT:%.*]] = icmp eq i16 [[INC69]], 2230; CHECK-NEXT:    br i1 [[EXITCOND13_NOT]], label [[FOR_BODY42_SPLIT]], label [[FOR_COND33_PREHEADER]]231; CHECK:       for.cond75.preheader:232; CHECK-NEXT:    br label [[FOR_COND75:%.*]]233; CHECK:       for.cond75:234; CHECK-NEXT:    br label [[FOR_COND75]]235;236entry:237  br label %for.cond33.preheader238 239for.cond33.preheader:                             ; preds = %for.end67, %entry240  %i.011 = phi i16 [ 0, %entry ], [ %inc69, %for.end67 ]241  br label %for.cond37.preheader242 243for.cond37.preheader:                             ; preds = %for.end64, %for.cond33.preheader244  %j.010 = phi i16 [ 0, %for.cond33.preheader ], [ %inc66, %for.end64 ]245  br label %for.cond38.preheader246 247for.cond38.preheader:                             ; preds = %for.end65, %for.cond37.preheader248  %k.010 = phi i16 [ 0, %for.cond37.preheader ], [ %inc67, %for.end65 ]249  br label %for.body42250 251for.body42:                                       ; preds = %for.body42, %for.cond38.preheader252  %k.09 = phi i16 [ -512, %for.cond38.preheader ], [ %inc63, %for.body42 ]253  %sub51 = add nsw i16 %k.09, 512254  %arrayidx55 = getelementptr inbounds [1024 x [512 x [4 x i32]]], ptr @d, i16 0, i16 %sub51, i16 %j.010, i16 %k.010255  %0 = load i32, ptr %arrayidx55, align 1256  %add61 = add i32 undef, undef257  %inc63 = add nsw i16 %k.09, 1258  %cmp = icmp slt i16 %k.09, 42259  br i1 %cmp, label %for.body42, label %for.end65260 261for.end65:                                        ; preds = %for.body42262  store i32 %add61, ptr undef, align 1263  %inc67 = add nuw nsw i16 %k.010, 1264  %cmp3 = icmp slt i16 %k.010, 44265  br i1 %cmp3, label %for.cond38.preheader, label %for.end64266 267for.end64:                                        ; preds = %for.end65268  %inc66 = add nuw nsw i16 %j.010, 1269  %cmp2 = icmp slt i16 %j.010, 43270  br i1 %cmp2, label %for.cond37.preheader, label %for.end67271 272for.end67:                                        ; preds = %for.end64273  %inc69 = add nuw nsw i16 %i.011, 1274  %exitcond13.not = icmp eq i16 %inc69, 2275  br i1 %exitcond13.not, label %for.cond75, label %for.cond33.preheader276 277for.cond75:                                       ; preds = %for.cond75, %for.end67278  br label %for.cond75279}280