brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.0 KiB · a8752db Raw
300 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=loop-unroll < %s | FileCheck %s3; RUN: opt -S -passes='require<opt-remark-emit>,loop(loop-unroll-full)' < %s | FileCheck %s4 5; Unroll twice, with first loop exit kept6define void @s32_max1(i32 %n, ptr %p) {7;8; CHECK-LABEL: @s32_max1(9; CHECK-NEXT:  entry:10; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[N:%.*]], 111; CHECK-NEXT:    br label [[DO_BODY:%.*]]12; CHECK:       do.body:13; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[N]]14; CHECK-NEXT:    store i32 [[N]], ptr [[ARRAYIDX]], align 415; CHECK-NEXT:    [[INC:%.*]] = add i32 [[N]], 116; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[N]], [[ADD]]17; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY_1:%.*]], label [[DO_END:%.*]]18; CHECK:       do.body.1:19; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr i32, ptr [[P]], i32 [[INC]]20; CHECK-NEXT:    store i32 [[INC]], ptr [[ARRAYIDX_1]], align 421; CHECK-NEXT:    br label [[DO_END]]22; CHECK:       do.end:23; CHECK-NEXT:    ret void24;25entry:26  %add = add i32 %n, 127  br label %do.body28 29do.body:30  %i.0 = phi i32 [ %n, %entry ], [ %inc, %do.body ]31  %arrayidx = getelementptr i32, ptr %p, i32 %i.032  store i32 %i.0, ptr %arrayidx, align 433  %inc = add i32 %i.0, 134  %cmp = icmp slt i32 %i.0, %add35  br i1 %cmp, label %do.body, label %do.end ; taken either 0 or 1 times36 37do.end:38  ret void39}40 41; Unroll thrice, with first loop exit kept42define void @s32_max2(i32 %n, ptr %p) {43;44; CHECK-LABEL: @s32_max2(45; CHECK-NEXT:  entry:46; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[N:%.*]], 247; CHECK-NEXT:    br label [[DO_BODY:%.*]]48; CHECK:       do.body:49; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[N]]50; CHECK-NEXT:    store i32 [[N]], ptr [[ARRAYIDX]], align 451; CHECK-NEXT:    [[INC:%.*]] = add i32 [[N]], 152; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[N]], [[ADD]]53; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY_1:%.*]], label [[DO_END:%.*]]54; CHECK:       do.body.1:55; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr i32, ptr [[P]], i32 [[INC]]56; CHECK-NEXT:    store i32 [[INC]], ptr [[ARRAYIDX_1]], align 457; CHECK-NEXT:    [[INC_1:%.*]] = add i32 [[N]], 258; CHECK-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr i32, ptr [[P]], i32 [[INC_1]]59; CHECK-NEXT:    store i32 [[INC_1]], ptr [[ARRAYIDX_2]], align 460; CHECK-NEXT:    br label [[DO_END]]61; CHECK:       do.end:62; CHECK-NEXT:    ret void63;64entry:65  %add = add i32 %n, 266  br label %do.body67 68do.body:69  %i.0 = phi i32 [ %n, %entry ], [ %inc, %do.body ]70  %arrayidx = getelementptr i32, ptr %p, i32 %i.071  store i32 %i.0, ptr %arrayidx, align 472  %inc = add i32 %i.0, 173  %cmp = icmp slt i32 %i.0, %add74  br i1 %cmp, label %do.body, label %do.end ; taken either 0 or 2 times75 76do.end:77  ret void78}79 80; Should not be unrolled81define void @s32_maxx(i32 %n, i32 %x, ptr %p) {82;83; CHECK-LABEL: @s32_maxx(84; CHECK-NEXT:  entry:85; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[X:%.*]], [[N:%.*]]86; CHECK-NEXT:    br label [[DO_BODY:%.*]]87; CHECK:       do.body:88; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ [[N]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[DO_BODY]] ]89; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[I_0]]90; CHECK-NEXT:    store i32 [[I_0]], ptr [[ARRAYIDX]], align 491; CHECK-NEXT:    [[INC]] = add i32 [[I_0]], 192; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_0]], [[ADD]]93; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY]], label [[DO_END:%.*]]94; CHECK:       do.end:95; CHECK-NEXT:    ret void96;97entry:98  %add = add i32 %x, %n99  br label %do.body100 101do.body:102  %i.0 = phi i32 [ %n, %entry ], [ %inc, %do.body ]103  %arrayidx = getelementptr i32, ptr %p, i32 %i.0104  store i32 %i.0, ptr %arrayidx, align 4105  %inc = add i32 %i.0, 1106  %cmp = icmp slt i32 %i.0, %add107  br i1 %cmp, label %do.body, label %do.end ; taken either 0 or x times108 109do.end:110  ret void111}112 113; Should not be unrolled114define void @s32_max2_unpredictable_exit(i32 %n, i32 %x, ptr %p) {115;116; CHECK-LABEL: @s32_max2_unpredictable_exit(117; CHECK-NEXT:  entry:118; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[N:%.*]], 2119; CHECK-NEXT:    br label [[DO_BODY:%.*]]120; CHECK:       do.body:121; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ [[N]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]122; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_0]], [[X:%.*]]123; CHECK-NEXT:    br i1 [[CMP]], label [[DO_END:%.*]], label [[IF_END]]124; CHECK:       if.end:125; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[I_0]]126; CHECK-NEXT:    store i32 [[I_0]], ptr [[ARRAYIDX]], align 4127; CHECK-NEXT:    [[INC]] = add i32 [[I_0]], 1128; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[I_0]], [[ADD]]129; CHECK-NEXT:    br i1 [[CMP1]], label [[DO_BODY]], label [[DO_END]]130; CHECK:       do.end:131; CHECK-NEXT:    ret void132;133entry:134  %add = add i32 %n, 2135  br label %do.body136 137do.body:138  %i.0 = phi i32 [ %n, %entry ], [ %inc, %if.end ]139  %cmp = icmp eq i32 %i.0, %x140  br i1 %cmp, label %do.end, label %if.end ; unpredictable141 142if.end:143  %arrayidx = getelementptr i32, ptr %p, i32 %i.0144  store i32 %i.0, ptr %arrayidx, align 4145  %inc = add i32 %i.0, 1146  %cmp1 = icmp slt i32 %i.0, %add147  br i1 %cmp1, label %do.body, label %do.end ; taken either 0 or 2 times148 149do.end:150  ret void151}152 153; Unroll twice, with first loop exit kept154define void @u32_max1(i32 %n, ptr %p) {155;156; CHECK-LABEL: @u32_max1(157; CHECK-NEXT:  entry:158; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[N:%.*]], 1159; CHECK-NEXT:    br label [[DO_BODY:%.*]]160; CHECK:       do.body:161; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[N]]162; CHECK-NEXT:    store i32 [[N]], ptr [[ARRAYIDX]], align 4163; CHECK-NEXT:    [[INC:%.*]] = add i32 [[N]], 1164; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[N]], [[ADD]]165; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY_1:%.*]], label [[DO_END:%.*]]166; CHECK:       do.body.1:167; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr i32, ptr [[P]], i32 [[INC]]168; CHECK-NEXT:    store i32 [[INC]], ptr [[ARRAYIDX_1]], align 4169; CHECK-NEXT:    br label [[DO_END]]170; CHECK:       do.end:171; CHECK-NEXT:    ret void172;173entry:174  %add = add i32 %n, 1175  br label %do.body176 177do.body:178  %i.0 = phi i32 [ %n, %entry ], [ %inc, %do.body ]179  %arrayidx = getelementptr i32, ptr %p, i32 %i.0180  store i32 %i.0, ptr %arrayidx, align 4181  %inc = add i32 %i.0, 1182  %cmp = icmp ult i32 %i.0, %add183  br i1 %cmp, label %do.body, label %do.end ; taken either 0 or 1 times184 185do.end:186  ret void187}188 189; Unroll thrice, with first loop exit kept190define void @u32_max2(i32 %n, ptr %p) {191;192; CHECK-LABEL: @u32_max2(193; CHECK-NEXT:  entry:194; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[N:%.*]], 2195; CHECK-NEXT:    br label [[DO_BODY:%.*]]196; CHECK:       do.body:197; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[N]]198; CHECK-NEXT:    store i32 [[N]], ptr [[ARRAYIDX]], align 4199; CHECK-NEXT:    [[INC:%.*]] = add i32 [[N]], 1200; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[N]], [[ADD]]201; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY_1:%.*]], label [[DO_END:%.*]]202; CHECK:       do.body.1:203; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr i32, ptr [[P]], i32 [[INC]]204; CHECK-NEXT:    store i32 [[INC]], ptr [[ARRAYIDX_1]], align 4205; CHECK-NEXT:    [[INC_1:%.*]] = add i32 [[N]], 2206; CHECK-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr i32, ptr [[P]], i32 [[INC_1]]207; CHECK-NEXT:    store i32 [[INC_1]], ptr [[ARRAYIDX_2]], align 4208; CHECK-NEXT:    br label [[DO_END]]209; CHECK:       do.end:210; CHECK-NEXT:    ret void211;212entry:213  %add = add i32 %n, 2214  br label %do.body215 216do.body:217  %i.0 = phi i32 [ %n, %entry ], [ %inc, %do.body ]218  %arrayidx = getelementptr i32, ptr %p, i32 %i.0219  store i32 %i.0, ptr %arrayidx, align 4220  %inc = add i32 %i.0, 1221  %cmp = icmp ult i32 %i.0, %add222  br i1 %cmp, label %do.body, label %do.end ; taken either 0 or 2 times223 224do.end:225  ret void226}227 228; Should not be unrolled229define void @u32_maxx(i32 %n, i32 %x, ptr %p) {230;231; CHECK-LABEL: @u32_maxx(232; CHECK-NEXT:  entry:233; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[X:%.*]], [[N:%.*]]234; CHECK-NEXT:    br label [[DO_BODY:%.*]]235; CHECK:       do.body:236; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ [[N]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[DO_BODY]] ]237; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[I_0]]238; CHECK-NEXT:    store i32 [[I_0]], ptr [[ARRAYIDX]], align 4239; CHECK-NEXT:    [[INC]] = add i32 [[I_0]], 1240; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[I_0]], [[ADD]]241; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY]], label [[DO_END:%.*]]242; CHECK:       do.end:243; CHECK-NEXT:    ret void244;245entry:246  %add = add i32 %x, %n247  br label %do.body248 249do.body:250  %i.0 = phi i32 [ %n, %entry ], [ %inc, %do.body ]251  %arrayidx = getelementptr i32, ptr %p, i32 %i.0252  store i32 %i.0, ptr %arrayidx, align 4253  %inc = add i32 %i.0, 1254  %cmp = icmp ult i32 %i.0, %add255  br i1 %cmp, label %do.body, label %do.end ; taken either 0 or x times256 257do.end:258  ret void259}260 261; Should not be unrolled262define void @u32_max2_unpredictable_exit(i32 %n, i32 %x, ptr %p) {263;264; CHECK-LABEL: @u32_max2_unpredictable_exit(265; CHECK-NEXT:  entry:266; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[N:%.*]], 2267; CHECK-NEXT:    br label [[DO_BODY:%.*]]268; CHECK:       do.body:269; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ [[N]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]270; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I_0]], [[X:%.*]]271; CHECK-NEXT:    br i1 [[CMP]], label [[DO_END:%.*]], label [[IF_END]]272; CHECK:       if.end:273; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 [[I_0]]274; CHECK-NEXT:    store i32 [[I_0]], ptr [[ARRAYIDX]], align 4275; CHECK-NEXT:    [[INC]] = add i32 [[I_0]], 1276; CHECK-NEXT:    [[CMP1:%.*]] = icmp ult i32 [[I_0]], [[ADD]]277; CHECK-NEXT:    br i1 [[CMP1]], label [[DO_BODY]], label [[DO_END]]278; CHECK:       do.end:279; CHECK-NEXT:    ret void280;281entry:282  %add = add i32 %n, 2283  br label %do.body284 285do.body:286  %i.0 = phi i32 [ %n, %entry ], [ %inc, %if.end ]287  %cmp = icmp eq i32 %i.0, %x288  br i1 %cmp, label %do.end, label %if.end ; unpredictable289 290if.end:291  %arrayidx = getelementptr i32, ptr %p, i32 %i.0292  store i32 %i.0, ptr %arrayidx, align 4293  %inc = add i32 %i.0, 1294  %cmp1 = icmp ult i32 %i.0, %add295  br i1 %cmp1, label %do.body, label %do.end ; taken either 0 or 2 times296 297do.end:298  ret void299}300