brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.4 KiB · 342b07e Raw
212 lines · plain
1; RUN: llc -mtriple=thumbv8.1m.main -disable-arm-loloops=false -mattr=+lob -stop-after=arm-low-overhead-loops --verify-machineinstrs %s -o - | FileCheck %s2; RUN: llc -mtriple=thumbv8.1m.main -disable-arm-loloops=false -mattr=+lob -stop-after=arm-low-overhead-loops --verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-GLOBAL3 4; Not implemented as a mir test so that changes the generic HardwareLoop can5; also be tested. These functions have been taken from6; Transforms/HardwareLoops/loop-guards.ll in which can be seen the generation7; of a few test.set intrinsics, but only one (ne_trip_count) gets generated8; here. Simplifications result in icmps changing and maybe also the CFG. So,9; TODO: Teach the HardwareLoops some better pattern recognition.10 11; CHECK-GLOBAL-NOT: DoLoopStart12; CHECK-GLOBAL-NOT: WhileLoopStart13; CHECK-GLOBAL-NOT: LoopEnd14 15; CHECK: ne_and_guard16; CHECK: body:17; CHECK: bb.0.entry:18; CHECK:   t2CMPri renamable $lr, 019; CHECK:   tBcc %bb.420; CHECK: bb.2.while.body.preheader:21; CHECK-NOT:   $lr = t2DLS killed renamable $lr22; CHECK: bb.3.while.body:23; CHECK:   $lr = t2LEUpdate killed renamable $lr, %bb.324define void @ne_and_guard(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {25entry:26  %brmerge.demorgan = and i1 %t1, %t227  %cmp6 = icmp ne i32 %N, 028  %or.cond = and i1 %brmerge.demorgan, %cmp629  br i1 %or.cond, label %while.body, label %if.end30 31while.body:                                       ; preds = %while.body, %entry32  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %entry ]33  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %entry ]34  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %entry ]35  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 136  %tmp = load i32, ptr %b.addr.07, align 437  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 138  store i32 %tmp, ptr %a.addr.08, align 439  %inc = add nuw i32 %i.09, 140  %exitcond = icmp eq i32 %inc, %N41  br i1 %exitcond, label %if.end, label %while.body42 43if.end:                                           ; preds = %while.body, %entry44  ret void45}46 47; TODO: This could generate WLS48; CHECK: ne_preheader49; CHECK: body:50; CHECK: bb.0.entry:51; CHECK:   t2CMPri renamable $lr, 052; CHECK:   tBcc %bb.453; CHECK: bb.2.while.body.preheader:54; CHECK-NOT:   $lr = t2DLS killed renamable $lr55; CHECK: bb.3.while.body:56; CHECK:   $lr = t2LEUpdate killed renamable $lr, %bb.357define void @ne_preheader(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {58entry:59  %brmerge.demorgan = and i1 %t1, %t260  br i1 %brmerge.demorgan, label %while.preheader, label %if.end61 62while.preheader:                                  ; preds = %entry63  %cmp = icmp ne i32 %N, 064  br i1 %cmp, label %while.body, label %if.end65 66while.body:                                       ; preds = %while.body, %while.preheader67  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ]68  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ]69  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ]70  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 171  %tmp = load i32, ptr %b.addr.07, align 472  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 173  store i32 %tmp, ptr %a.addr.08, align 474  %inc = add nuw i32 %i.09, 175  %exitcond = icmp eq i32 %inc, %N76  br i1 %exitcond, label %if.end, label %while.body77 78if.end:                                           ; preds = %while.body, %while.preheader, %entry79  ret void80}81 82; TODO: This could generate WLS83; CHECK: eq_preheader84; CHECK: body:85; CHECK: bb.0.entry:86; CHECK:   t2CMPri renamable $lr, 087; CHECK:   tBcc %bb.488; CHECK: bb.2.while.body.preheader:89; CHECK-NOT:   $lr = t2DLS killed renamable $lr90; CHECK: bb.3.while.body:91; CHECK:   $lr = t2LEUpdate killed renamable $lr, %bb.392define void @eq_preheader(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {93entry:94  %brmerge.demorgan = and i1 %t1, %t295  br i1 %brmerge.demorgan, label %while.preheader, label %if.end96 97while.preheader:                                  ; preds = %entry98  %cmp = icmp eq i32 %N, 099  br i1 %cmp, label %if.end, label %while.body100 101while.body:                                       ; preds = %while.body, %while.preheader102  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ]103  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ]104  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ]105  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1106  %tmp = load i32, ptr %b.addr.07, align 4107  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1108  store i32 %tmp, ptr %a.addr.08, align 4109  %inc = add nuw i32 %i.09, 1110  %exitcond = icmp eq i32 %inc, %N111  br i1 %exitcond, label %if.end, label %while.body112 113if.end:                                           ; preds = %while.body, %while.preheader, %entry114  ret void115}116 117; TODO: This could generate WLS118; CHECK: ne_prepreheader119; CHECK: body:120; CHECK: bb.0.entry:121; CHECK:   t2CMPri renamable $lr, 0122; CHECK:   tBcc %bb.4123; CHECK: bb.2.while.body.preheader:124; CHECK-NOT:   $lr = t2DLS killed renamable $lr125; CHECK: bb.3.while.body:126; CHECK:   $lr = t2LEUpdate killed renamable $lr, %bb.3127define void @ne_prepreheader(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {128entry:129  %cmp = icmp ne i32 %N, 0130  br i1 %cmp, label %while.preheader, label %if.end131 132while.preheader:                                  ; preds = %entry133  %brmerge.demorgan = and i1 %t1, %t2134  br i1 %brmerge.demorgan, label %while.body, label %if.end135 136while.body:                                       ; preds = %while.body, %while.preheader137  %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ]138  %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ]139  %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ]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, %while.preheader, %entry149  ret void150}151 152; CHECK: be_ne153; CHECK: body:154; CHECK: bb.0.entry:155; CHECK:   $lr =156; CHECK: bb.2.do.body:157; CHECK:   $lr = t2LEUpdate killed renamable $lr, %bb.2158define void @be_ne(ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {159entry:160  %cmp = icmp ne i32 %N, 0161  %sub = sub i32 %N, 1162  %be = select i1 %cmp, i32 0, i32 %sub163  %cmp.1 = icmp ne i32 %be, 0164  br i1 %cmp.1, label %do.body, label %if.end165 166do.body:                                          ; preds = %do.body, %entry167  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ]168  %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %entry ]169  %i.0 = phi i32 [ %inc, %do.body ], [ 0, %entry ]170  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1171  %tmp = load i32, ptr %b.addr.0, align 4172  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1173  store i32 %tmp, ptr %a.addr.0, align 4174  %inc = add nuw i32 %i.0, 1175  %cmp.2 = icmp ult i32 %inc, %N176  br i1 %cmp.2, label %do.body, label %if.end177 178if.end:                                           ; preds = %do.body, %entry179  ret void180}181 182; CHECK: ne_trip_count183; CHECK: body:184; CHECK: bb.0.entry:185; CHECK:   $lr = t2WLS killed renamable $r3, %bb.3186; CHECK: bb.1.do.body.preheader:187; CHECK: bb.2.do.body:188; CHECK:   $lr = t2LEUpdate killed renamable $lr, %bb.2189define void @ne_trip_count(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) {190entry:191  br label %do.body.preheader192 193do.body.preheader:194  %cmp = icmp ne i32 %N, 0195  br i1 %cmp, label %do.body, label %if.end196 197do.body:198  %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %do.body.preheader ]199  %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %do.body.preheader ]200  %i.0 = phi i32 [ %inc, %do.body ], [ 0, %do.body.preheader ]201  %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1202  %tmp = load i32, ptr %b.addr.0, align 4203  %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1204  store i32 %tmp, ptr %a.addr.0, align 4205  %inc = add nuw i32 %i.0, 1206  %cmp.1 = icmp ult i32 %inc, %N207  br i1 %cmp.1, label %do.body, label %if.end208 209if.end:                                           ; preds = %do.body, %entry210  ret void211}212