brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.2 KiB · 43aae5e Raw
380 lines · plain
1; RUN: opt -passes='hardware-loops<force-hardware-loops;force-hardware-loop-guard;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32>' -S %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-EXIT2; RUN: opt -passes='hardware-loops<force-hardware-loops;force-hardware-loop-guard;force-hardware-loop-phi;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32>' -S %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LATCH3; RUN: opt -passes='hardware-loops<force-hardware-loops;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32>' -S %s -o - | FileCheck %s --check-prefix=NO-GUARD4 5; NO-GUARD-NOT: @llvm.test.set.loop.iterations6 7; CHECK-LABEL: test18; CHECK: entry:9; CHECK:   [[MAX:%[^ ]+]] = call i32 @llvm.umax.i32(i32 %N, i32 2)10; CHECK:   [[COUNT:%[^ ]+]] = add i32 [[MAX]], -111; CHECK:   br i1 %t1, label %do.body.preheader12; CHECK: do.body.preheader:13; CHECK-EXIT:   call void @llvm.set.loop.iterations.i32(i32 [[COUNT]])14; CHECK-LATCH:   call i32 @llvm.start.loop.iterations.i32(i32 [[COUNT]])15; CHECK:   br label %do.body16define void @test1(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {17entry:18  br i1 %t1, label %do.body, label %if.end19 20do.body:                                          ; preds = %do.body, %entry21  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ]22  %a.addr.0 = phi ptr [ %incdec.ptr1, %do.body ], [ %a, %entry ]23  %i.0 = phi i32 [ %inc, %do.body ], [ 1, %entry ]24  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 125  %tmp = load i32, ptr %b.addr.0, align 426  %incdec.ptr1 = getelementptr inbounds i32, ptr %a.addr.0, i32 127  store i32 %tmp, ptr %a.addr.0, align 428  %inc = add nuw i32 %i.0, 129  %cmp = icmp ult i32 %inc, %N30  br i1 %cmp, label %do.body, label %if.end31 32if.end:                                           ; preds = %do.body, %entry33  ret void34}35 36; CHECK-LABEL: test237; CHECK-NOT: call i1 @llvm.test.set.loop.iterations38; CHECK-NOT: call void @llvm.set.loop.iterations39; CHECK-NOT: call i32 @llvm.start.loop.iterations40define void @test2(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {41entry:42  br i1 %t1, label %do.body, label %if.end43 44do.body:                                          ; preds = %do.body, %entry45  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ]46  %a.addr.0 = phi ptr [ %incdec.ptr1, %do.body ], [ %a, %entry ]47  %i.0 = phi i32 [ %add, %do.body ], [ 1, %entry ]48  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 149  %tmp = load i32, ptr %b.addr.0, align 450  %incdec.ptr1 = getelementptr inbounds i32, ptr %a.addr.0, i32 151  store i32 %tmp, ptr %a.addr.0, align 452  %add = add i32 %i.0, 253  %cmp = icmp ult i32 %add, %N54  br i1 %cmp, label %do.body, label %if.end55 56if.end:                                           ; preds = %do.body, %entry57  ret void58}59 60; CHECK-LABEL: test361; CHECK: entry:62; CHECK:   [[COUNT:%[^ ]+]] = call i32 @llvm.umax.i32(i32 %N, i32 1)63; CHECK:   br i1 %brmerge.demorgan, label %do.body.preheader64; CHECK: do.body.preheader:65; CHECK-EXIT:   call void @llvm.set.loop.iterations.i32(i32 [[COUNT]])66; CHECK-LATCH:   call i32 @llvm.start.loop.iterations.i32(i32 [[COUNT]])67; CHECK:   br label %do.body68define void @test3(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {69entry:70  %brmerge.demorgan = and i1 %t1, %t271  br i1 %brmerge.demorgan, label %do.body, label %if.end72 73do.body:                                          ; preds = %do.body, %entry74  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ]75  %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %entry ]76  %i.0 = phi i32 [ %inc, %do.body ], [ 0, %entry ]77  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 178  %tmp = load i32, ptr %b.addr.0, align 479  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 180  store i32 %tmp, ptr %a.addr.0, align 481  %inc = add nuw i32 %i.0, 182  %cmp = icmp ult i32 %inc, %N83  br i1 %cmp, label %do.body, label %if.end84 85if.end:                                           ; preds = %do.body, %entry86  ret void87}88 89; CHECK-LABEL: test490; CHECK: entry:91; CHECK-LATCH:  br i1 %brmerge.demorgan, label %while.cond92; CHECK-LATCH-NOT: @llvm{{.*}}loop.iterations 93; CHECK-EXIT:   br i1 %brmerge.demorgan, label %while.cond.preheader94; CHECK-EXIT: while.cond.preheader:95; CHECK-EXIT:   [[COUNT:%[^ ]+]] = add i32 %N, 196; CHECK-EXIT:   call void @llvm.set.loop.iterations.i32(i32 [[COUNT]])97; CHECK-EXIT:   br label %while.cond98define void @test4(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {99entry:100  %brmerge.demorgan = and i1 %t1, %t2101  br i1 %brmerge.demorgan, label %while.cond, label %if.end102 103while.cond:                                       ; preds = %while.body, %entry104  %b.addr.0 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %entry ]105  %a.addr.0 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %entry ]106  %i.0 = phi i32 [ %inc, %while.body ], [ 0, %entry ]107  %exitcond = icmp eq i32 %i.0, %N108  br i1 %exitcond, label %if.end, label %while.body109 110while.body:                                       ; preds = %while.cond111  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1112  %tmp = load i32, ptr %b.addr.0, align 4113  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1114  store i32 %tmp, ptr %a.addr.0, align 4115  %inc = add i32 %i.0, 1116  br label %while.cond117 118if.end:                                           ; preds = %while.cond, %entry119  ret void120}121 122; CHECK-LABEL: test5123; CHECK: entry:124; CHECK:   br i1 %or.cond, label %while.body.preheader125; CHECK: while.body.preheader:126; CHECK-EXIT:   call void @llvm.set.loop.iterations.i32(i32 %N)127; CHECK-LATCH:   call i32 @llvm.start.loop.iterations.i32(i32 %N)128; CHECK:   br label %while.body129define void @test5(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {130entry:131  %brmerge.demorgan = and i1 %t1, %t2132  %cmp6 = icmp ne i32 %N, 0133  %or.cond = and i1 %brmerge.demorgan, %cmp6134  br i1 %or.cond, label %while.body, label %if.end135 136while.body:                                       ; preds = %while.body, %entry137  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %entry ]138  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %entry ]139  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %entry ]140  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1141  %tmp = load i32, ptr %b.addr.07, align 4142  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1143  store i32 %tmp, ptr %a.addr.08, align 4144  %inc = add nuw i32 %i.09, 1145  %exitcond = icmp eq i32 %inc, %N146  br i1 %exitcond, label %if.end, label %while.body147 148if.end:                                           ; preds = %while.body, %entry149  ret void150}151 152; CHECK-LABEL: test6153; CHECK: entry:154; CHECK:   br i1 %brmerge.demorgan, label %while.preheader155; CHECK: while.preheader:156; CHECK-EXIT:   [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %N)157; CHECK-LATCH:   [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N)158; CHECK-LATCH:  [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1159; CHECK:   br i1 [[TEST]], label %while.body.preheader, label %if.end160; CHECK: while.body.preheader:161; CHECK:   br label %while.body162define void @test6(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {163entry:164  %brmerge.demorgan = and i1 %t1, %t2165  br i1 %brmerge.demorgan, label %while.preheader, label %if.end166 167while.preheader:                                  ; preds = %entry168  %cmp = icmp ne i32 %N, 0169  br i1 %cmp, label %while.body, label %if.end170 171while.body:                                       ; preds = %while.body, %while.preheader172  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ]173  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ]174  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ]175  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1176  %tmp = load i32, ptr %b.addr.07, align 4177  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1178  store i32 %tmp, ptr %a.addr.08, align 4179  %inc = add nuw i32 %i.09, 1180  %exitcond = icmp eq i32 %inc, %N181  br i1 %exitcond, label %if.end, label %while.body182 183if.end:                                           ; preds = %while.body, %while.preheader, %entry184  ret void185}186 187; CHECK-LABEL: test7188; CHECK: entry:189; CHECK:   br i1 %brmerge.demorgan, label %while.preheader190; CHECK: while.preheader:191; CHECK-EXIT:   [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %N)192; CHECK-LATCH:   [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N)193; CHECK-LATCH:  [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1194; CHECK:   br i1 [[TEST]], label %while.body.preheader, label %if.end195; CHECK: while.body.preheader:196; CHECK:   br label %while.body197define void @test7(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {198entry:199  %brmerge.demorgan = and i1 %t1, %t2200  br i1 %brmerge.demorgan, label %while.preheader, label %if.end201 202while.preheader:                                  ; preds = %entry203  %cmp = icmp eq i32 %N, 0204  br i1 %cmp, label %if.end, label %while.body205 206while.body:                                       ; preds = %while.body, %while.preheader207  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ]208  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ]209  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ]210  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1211  %tmp = load i32, ptr %b.addr.07, align 4212  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1213  store i32 %tmp, ptr %a.addr.08, align 4214  %inc = add nuw i32 %i.09, 1215  %exitcond = icmp eq i32 %inc, %N216  br i1 %exitcond, label %if.end, label %while.body217 218if.end:                                           ; preds = %while.body, %while.preheader, %entry219  ret void220}221 222; TODO: Can we rearrange the conditional blocks so that we can use the test form?223; CHECK-LABEL: test8224; CHECK: entry:225; CHECK:   [[CMP:%[^ ]+]] = icmp ne i32 %N, 0226; CHECK:   br i1 [[CMP]], label %while.preheader227; CHECK: while.preheader:228; CHECK:   br i1 %brmerge.demorgan, label %while.body.preheader229; CHECK: while.body.preheader:230; CHECK-EXIT:   call void @llvm.set.loop.iterations.i32(i32 %N)231; CHECK-LATCH:   call i32 @llvm.start.loop.iterations.i32(i32 %N)232; CHECK:   br label %while.body233define void @test8(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {234entry:235  %cmp = icmp ne i32 %N, 0236  br i1 %cmp, label %while.preheader, label %if.end237 238while.preheader:                                  ; preds = %entry239  %brmerge.demorgan = and i1 %t1, %t2240  br i1 %brmerge.demorgan, label %while.body, label %if.end241 242while.body:                                       ; preds = %while.body, %while.preheader243  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ]244  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ]245  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ]246  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1247  %tmp = load i32, ptr %b.addr.07, align 4248  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1249  store i32 %tmp, ptr %a.addr.08, align 4250  %inc = add nuw i32 %i.09, 1251  %exitcond = icmp eq i32 %inc, %N252  br i1 %exitcond, label %if.end, label %while.body253 254if.end:                                           ; preds = %while.body, %while.preheader, %entry255  ret void256}257 258; CHECK-LABEL: test9259; CHECK: entry:260; CHECK:   br i1 %brmerge.demorgan, label %do.body.preheader261; CHECK: do.body.preheader:262; CHECK-EXIT:   call void @llvm.set.loop.iterations.i32(i32 %N)263; CHECK-LATCH:   call i32 @llvm.start.loop.iterations.i32(i32 %N)264; CHECK:   br label %do.body265define void @test9(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {266entry:267  %cmp = icmp ne i32 %N, 0268  %brmerge.demorgan = and i1 %t1, %cmp269  br i1 %brmerge.demorgan, label %do.body, label %if.end270 271do.body:                                          ; preds = %do.body, %entry272  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ]273  %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %entry ]274  %i.0 = phi i32 [ %inc, %do.body ], [ 0, %entry ]275  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1276  %tmp = load i32, ptr %b.addr.0, align 4277  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1278  store i32 %tmp, ptr %a.addr.0, align 4279  %inc = add nuw i32 %i.0, 1280  %cmp.1 = icmp ult i32 %inc, %N281  br i1 %cmp.1, label %do.body, label %if.end282 283if.end:                                           ; preds = %do.body, %entry284  ret void285}286 287; CHECK-LABEL: test10288; CHECK: entry:289; CHECK:   br i1 %cmp.1, label %do.body.preheader290; CHECK: do.body.preheader:291; CHECK-EXIT:   call void @llvm.set.loop.iterations.i32(i32292; CHECK-LATCH:   call i32 @llvm.start.loop.iterations.i32(i32293; CHECK:   br label %do.body294define void @test10(ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {295entry:296  %cmp = icmp ne i32 %N, 0297  %sub = sub i32 %N, 1298  %be = select i1 %cmp, i32 0, i32 %sub299  %cmp.1 = icmp ne i32 %be, 0300  br i1 %cmp.1, label %do.body, label %if.end301 302do.body:                                          ; preds = %do.body, %entry303  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ]304  %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %entry ]305  %i.0 = phi i32 [ %inc, %do.body ], [ 0, %entry ]306  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1307  %tmp = load i32, ptr %b.addr.0, align 4308  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1309  store i32 %tmp, ptr %a.addr.0, align 4310  %inc = add nuw i32 %i.0, 1311  %cmp.2 = icmp ult i32 %inc, %N312  br i1 %cmp.2, label %do.body, label %if.end313 314if.end:                                           ; preds = %do.body, %entry315  ret void316}317 318; CHECK-LABEL: test11319; CHECK: entry:320; CHECK:   br label %do.body.preheader321; CHECK: do.body.preheader:322; CHECK-EXIT:   [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %N)323; CHECK-LATCH:  [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N)324; CHECK-LATCH:  [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1325; CHECK:   br i1 [[TEST]], label %do.body.preheader1, label %if.end326; CHECK: do.body.preheader1:327; CHECK:   br label %do.body328define void @test11(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {329entry:330  br label %do.body.preheader331 332do.body.preheader:333  %cmp = icmp ne i32 %N, 0334  br i1 %cmp, label %do.body, label %if.end335 336do.body:337  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %do.body.preheader ]338  %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %do.body.preheader ]339  %i.0 = phi i32 [ %inc, %do.body ], [ 0, %do.body.preheader ]340  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1341  %tmp = load i32, ptr %b.addr.0, align 4342  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1343  store i32 %tmp, ptr %a.addr.0, align 4344  %inc = add nuw i32 %i.0, 1345  %cmp.1 = icmp ult i32 %inc, %N346  br i1 %cmp.1, label %do.body, label %if.end347 348if.end:                                           ; preds = %do.body, %entry349  ret void350}351 352; CHECK-LABEL: test12353; CHECK: entry:354; CHECK-EXIT:   [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %conv)355; CHECK-LATCH:  [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %conv)356; CHECK-LATCH:  [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1357; CHECK:   br i1 [[TEST]], label %for.body.preheader, label %for.end358; CHECK: for.body.preheader:359; CHECK:   br label %for.body360 361define void @test12(ptr nocapture %a, ptr nocapture readonly %b, i16 zeroext %length) {362entry:363  %conv = zext i16 %length to i32364  %cmp8.not = icmp eq i16 %length, 0365  br i1 %cmp8.not, label %for.end, label %for.body366 367for.body:                                         ; preds = %entry, %for.body368  %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]369  %arrayidx = getelementptr inbounds i32, ptr %b, i32 %i.09370  %0 = load i32, ptr %arrayidx, align 4371  %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 %i.09372  store i32 %0, ptr %arrayidx2, align 4373  %inc = add nuw nsw i32 %i.09, 1374  %exitcond.not = icmp eq i32 %inc, %conv375  br i1 %exitcond.not, label %for.end, label %for.body376 377for.end:                                          ; preds = %for.body, %entry378  ret void379}380