brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.7 KiB · d4fb3d7 Raw
278 lines · plain
1; REQUIRES: asserts2 3; RUN: opt -mtriple arm64-linux -passes=loop-vectorize -mattr=+sve -debug-only=loop-vectorize,vplan -disable-output <%s 2>&1 | FileCheck %s4 5; Invariant register usage calculation should take into account if the6; invariant would be used in widened instructions. Only in such cases, a vector7; register would be required for holding the invariant. For all other cases8; such as below(where usage of %0 in loop doesnt require vector register), a9; general purpose register suffices.10; Check that below test doesn't crash while calculating register usage for11; invariant %012 13@string = internal unnamed_addr constant [5 x i8] c"abcd\00", align 114 15define void @get_invariant_reg_usage(ptr %z) {16; CHECK-LABEL: LV: Checking a loop in 'get_invariant_reg_usage'17; CHECK: LV(REG): VF = 1618; CHECK-NEXT: LV(REG): Found max usage: 2 item19; CHECK-NEXT: LV(REG): RegisterClass: Generic::ScalarRC, 2 registers20; CHECK-NEXT: LV(REG): RegisterClass: Generic::VectorRC, 1 registers21; CHECK-NEXT: LV(REG): Found invariant usage: 1 item22; CHECK-NEXT: LV(REG): RegisterClass: Generic::ScalarRC, 3 registers23 24L.entry:25  %0 = load i128, ptr %z, align 1626  %1 = icmp slt i128 %0, 127  %a = getelementptr i8, ptr %z, i64 128  br i1 %1, label %return, label %loopbody29 30loopbody:                  ;preds = %L.entry, %loopbody31  %b = phi ptr [ %2, %loopbody ], [ @string, %L.entry ]32  %len_input = phi i128 [ %len, %loopbody ], [ %0, %L.entry ]33  %len = add nsw i128 %len_input, -134  %2 = getelementptr i8, ptr %b, i64 135  %3 = load i8, ptr %b, align 136  store i8 %3, ptr %a, align 437  %.not = icmp eq i128 %len, 038  br i1 %.not, label %return, label %loopbody39 40return:                    ;preds = %loopexit, %L.entry41  ret void42}43 44define void @load_and_compare_only_used_by_assume(ptr %a, ptr noalias %b) {45; CHECK-LABEL: LV: Checking a loop in 'load_and_compare_only_used_by_assume'46; CHECK: LV(REG): VF = vscale x 447; CHECK-NEXT: LV(REG): Found max usage: 2 item48; CHECK-NEXT: LV(REG): RegisterClass: Generic::ScalarRC, 3 registers49; CHECK-NEXT: LV(REG): RegisterClass: Generic::VectorRC, 1 registers50; CHECK-NEXT: LV(REG): Found invariant usage: 1 item51 52entry:53  br label %loop54 55loop:56  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]57  %gep.a = getelementptr inbounds i32, ptr %a, i64 %iv58  %l.a = load i32, ptr %gep.a59  %gep.b = getelementptr inbounds i32, ptr %b, i64 %iv60  %l.b = load i32, ptr %gep.b61  %c = icmp ugt i32 %l.b, 1062  call void @llvm.assume(i1 %c)63  store i32 %l.a, ptr %gep.b64  %iv.next = add i64 %iv, 165  %ec = icmp eq i64 %iv.next, 100066  br i1 %ec, label %exit, label %loop67 68exit:69  ret void70}71 72define dso_local void @dotp_high_register_pressure(ptr %a, ptr %b, ptr %sum, i32 %n) #1 {73; CHECK-LABEL: LV: Checking a loop in 'dotp_high_register_pressure' from <stdin>74; CHECK:       LV(REG): VF = 1675; CHECK-NEXT:  LV(REG): Found max usage: 2 item76; CHECK-NEXT:  LV(REG): RegisterClass: Generic::ScalarRC, 3 registers77; CHECK-NEXT:  LV(REG): RegisterClass: Generic::VectorRC, 47 registers78; CHECK-NEXT:  LV(REG): Found invariant usage: 1 item79entry:80  %cmp100 = icmp sgt i32 %n, 081  br i1 %cmp100, label %for.body.lr.ph, label %for.cond.cleanup82 83for.body.lr.ph:                                   ; preds = %entry84  %arrayidx13 = getelementptr inbounds nuw i8, ptr %sum, i64 485  %gep.b.12 = getelementptr inbounds nuw i8, ptr %sum, i64 886  %arrayidx31 = getelementptr inbounds nuw i8, ptr %sum, i64 1287  %arrayidx40 = getelementptr inbounds nuw i8, ptr %sum, i64 1688  %arrayidx49 = getelementptr inbounds nuw i8, ptr %sum, i64 2089  %arrayidx58 = getelementptr inbounds nuw i8, ptr %sum, i64 2490  %arrayidx67 = getelementptr inbounds nuw i8, ptr %sum, i64 2891  %sum.promoted = load i32, ptr %sum, align 492  %arrayidx13.promoted = load i32, ptr %arrayidx13, align 493  %gep.b.12.promoted = load i32, ptr %gep.b.12, align 494  %arrayidx31.promoted = load i32, ptr %arrayidx31, align 495  %arrayidx40.promoted = load i32, ptr %arrayidx40, align 496  %arrayidx49.promoted = load i32, ptr %arrayidx49, align 497  %arrayidx58.promoted = load i32, ptr %arrayidx58, align 498  %arrayidx67.promoted = load i32, ptr %arrayidx67, align 499  %wide.trip.count = zext nneg i32 %n to i64100  br label %for.body101 102for.cond.for.cond.cleanup_crit_edge:              ; preds = %for.body103  %add.lcssa = phi i32 [ %add.1, %for.body ]104  %add.2.lcssa = phi i32 [ %add.2, %for.body ]105  %add.3.lcssa = phi i32 [ %add.3, %for.body ]106  %add.4.lcssa = phi i32 [ %add.4, %for.body ]107  %add.5.lcssa = phi i32 [ %add.5, %for.body ]108  %add.6.lcssa = phi i32 [ %add.6, %for.body ]109  %add.7.lcssa = phi i32 [ %add.7, %for.body ]110  %add.8.lcssa = phi i32 [ %add.8, %for.body ]111  store i32 %add.lcssa, ptr %sum, align 4112  store i32 %add.2.lcssa, ptr %arrayidx13, align 4113  store i32 %add.3.lcssa, ptr %gep.b.12, align 4114  store i32 %add.4.lcssa, ptr %arrayidx31, align 4115  store i32 %add.5.lcssa, ptr %arrayidx40, align 4116  store i32 %add.6.lcssa, ptr %arrayidx49, align 4117  store i32 %add.7.lcssa, ptr %arrayidx58, align 4118  store i32 %add.8.lcssa, ptr %arrayidx67, align 4119  br label %for.cond.cleanup120 121for.cond.cleanup:                                 ; preds = %for.cond.for.cond.cleanup_crit_edge, %entry122  ret void123 124for.body:                                         ; preds = %for.body.lr.ph, %for.body125  %indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %for.body ]126  %0 = phi i32 [ %arrayidx67.promoted, %for.body.lr.ph ], [ %add.8, %for.body ]127  %1 = phi i32 [ %arrayidx58.promoted, %for.body.lr.ph ], [ %add.7, %for.body ]128  %2 = phi i32 [ %arrayidx49.promoted, %for.body.lr.ph ], [ %add.6, %for.body ]129  %3 = phi i32 [ %arrayidx40.promoted, %for.body.lr.ph ], [ %add.5, %for.body ]130  %4 = phi i32 [ %arrayidx31.promoted, %for.body.lr.ph ], [ %add.4, %for.body ]131  %5 = phi i32 [ %gep.b.12.promoted, %for.body.lr.ph ], [ %add.3, %for.body ]132  %6 = phi i32 [ %arrayidx13.promoted, %for.body.lr.ph ], [ %add.2, %for.body ]133  %7 = phi i32 [ %sum.promoted, %for.body.lr.ph ], [ %add.1, %for.body ]134  %arrayidx = getelementptr inbounds nuw i8, ptr %a, i64 %indvars.iv135  %load.a = load i8, ptr %arrayidx, align 1136  %ext.a = zext i8 %load.a to i32137  %9 = shl nsw i64 %indvars.iv, 3138  %gep.b.1 = getelementptr inbounds nuw i8, ptr %b, i64 %9139  %load.b.1 = load i8, ptr %gep.b.1, align 1140  %ext.b.1 = sext i8 %load.b.1 to i32141  %mul.1 = mul nsw i32 %ext.b.1, %ext.a142  %add.1 = add nsw i32 %mul.1, %7143  %11 = or disjoint i64 %9, 1144  %gep.b.2 = getelementptr inbounds nuw i8, ptr %b, i64 %11145  %load.b.2 = load i8, ptr %gep.b.2, align 1146  %ext.b.2 = sext i8 %load.b.2 to i32147  %mul.2 = mul nsw i32 %ext.b.2, %ext.a148  %add.2 = add nsw i32 %mul.2, %6149  %13 = or disjoint i64 %9, 2150  %gep.b.3 = getelementptr inbounds nuw i8, ptr %b, i64 %13151  %load.b.3 = load i8, ptr %gep.b.3, align 1152  %ext.b.3 = sext i8 %load.b.3 to i32153  %mul.3 = mul nsw i32 %ext.b.3, %ext.a154  %add.3 = add nsw i32 %mul.3, %5155  %15 = or disjoint i64 %9, 3156  %gep.b.4 = getelementptr inbounds nuw i8, ptr %b, i64 %15157  %load.b.4 = load i8, ptr %gep.b.4, align 1158  %ext.b.4 = sext i8 %load.b.4 to i32159  %mul.4 = mul nsw i32 %ext.b.4, %ext.a160  %add.4 = add nsw i32 %mul.4, %4161  %17 = or disjoint i64 %9, 4162  %gep.b.5 = getelementptr inbounds nuw i8, ptr %b, i64 %17163  %load.b.5 = load i8, ptr %gep.b.5, align 1164  %ext.b.5 = sext i8 %load.b.5 to i32165  %mul.5 = mul nsw i32 %ext.b.5, %ext.a166  %add.5 = add nsw i32 %mul.5, %3167  %19 = or disjoint i64 %9, 5168  %gep.b.6 = getelementptr inbounds nuw i8, ptr %b, i64 %19169  %load.b.6 = load i8, ptr %gep.b.6, align 1170  %ext.b.6 = sext i8 %load.b.6 to i32171  %mul.6 = mul nsw i32 %ext.b.6, %ext.a172  %add.6 = add nsw i32 %mul.6, %2173  %21 = or disjoint i64 %9, 6174  %gep.b.7 = getelementptr inbounds nuw i8, ptr %b, i64 %21175  %load.b.7 = load i8, ptr %gep.b.7, align 1176  %ext.b.7 = sext i8 %load.b.7 to i32177  %mul.7 = mul nsw i32 %ext.b.7, %ext.a178  %add.7 = add nsw i32 %mul.7, %1179  %23 = or disjoint i64 %9, 7180  %gep.b.8 = getelementptr inbounds nuw i8, ptr %b, i64 %23181  %load.b.8 = load i8, ptr %gep.b.8, align 1182  %ext.b.8 = sext i8 %load.b.8 to i32183  %mul.8 = mul nsw i32 %ext.b.8, %ext.a184  %add.8 = add nsw i32 %mul.8, %0185  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1186  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count187  br i1 %exitcond.not, label %for.cond.for.cond.cleanup_crit_edge, label %for.body188}189 190define i32 @dotp_unrolled(i32 %num_out, i64 %num_in, ptr %a, ptr %b) {191; CHECK-LABEL: LV: Checking a loop in 'dotp_unrolled' from <stdin>192; CHECK:       LV(REG): VF = 16193; CHECK-NEXT:  LV(REG): Found max usage: 2 item194; CHECK-NEXT:  LV(REG): RegisterClass: Generic::ScalarRC, 9 registers195; CHECK-NEXT:  LV(REG): RegisterClass: Generic::VectorRC, 6 registers196; CHECK-NEXT:  LV(REG): Found invariant usage: 1 item197entry:198  br label %for.body199 200for.body:                                    ; preds = %entry, %for.body201  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]202  %accum3 = phi i32 [ 0, %entry ], [ %add.a3, %for.body ]203  %accum2 = phi i32 [ 0, %entry ], [ %add.a2, %for.body ]204  %accum1 = phi i32 [ 0, %entry ], [ %add.a1, %for.body ]205  %accum0 = phi i32 [ 0, %entry ], [ %add.a0, %for.body ]206  %gep.a0 = getelementptr inbounds i8, ptr %a, i64 %iv207  %gep.b0 = getelementptr inbounds i8, ptr %b, i64 %iv208  %offset.1 = or disjoint i64 %iv, 1209  %gep.a1 = getelementptr inbounds i8, ptr %a, i64 %offset.1210  %gep.b1 = getelementptr inbounds i8, ptr %b, i64 %offset.1211  %offset.2 = or disjoint i64 %iv, 2212  %gep.a2 = getelementptr inbounds i8, ptr %a, i64 %offset.2213  %gep.b2 = getelementptr inbounds i8, ptr %b, i64 %offset.2214  %offset.3 = or disjoint i64 %iv, 3215  %gep.a3 = getelementptr inbounds i8, ptr %a, i64 %offset.3216  %gep.b3 = getelementptr inbounds i8, ptr %b, i64 %offset.3217  %load.a0 = load i8, ptr %gep.a0, align 1218  %ext.a0 = sext i8 %load.a0 to i32219  %load.b0 = load i8, ptr %gep.b0, align 1220  %ext.b0 = sext i8 %load.b0 to i32221  %mul.a0 = mul nsw i32 %ext.b0, %ext.a0222  %add.a0 = add nsw i32 %mul.a0, %accum0223  %load.a1 = load i8, ptr %gep.a1, align 1224  %ext.a1 = sext i8 %load.a1 to i32225  %load.b1 = load i8, ptr %gep.b1, align 1226  %ext.b1 = sext i8 %load.b1 to i32227  %mul.a1 = mul nsw i32 %ext.a1, %ext.b1228  %add.a1 = add nsw i32 %mul.a1, %accum1229  %load.a2 = load i8, ptr %gep.a2, align 1230  %ext.a2 = sext i8 %load.a2 to i32231  %load.b2 = load i8, ptr %gep.b2, align 1232  %ext.b2 = sext i8 %load.b2 to i32233  %mul.a2 = mul nsw i32 %ext.a2, %ext.b2234  %add.a2 = add nsw i32 %mul.a2, %accum2235  %load.a3 = load i8, ptr %gep.a3, align 1236  %ext.a3 = sext i8 %load.a3 to i32237  %load.b3 = load i8, ptr %gep.b3, align 1238  %ext.b3 = sext i8 %load.b3 to i32239  %mul.a3 = mul nsw i32 %ext.a3, %ext.b3240  %add.a3 = add nsw i32 %mul.a3, %accum3241  %iv.next = add nuw nsw i64 %iv, 1242  %exitcond.not = icmp eq i64 %iv.next, %num_in243  br i1 %exitcond.not, label %exit, label %for.body244 245exit:                                        ; preds = %for.body246  %result0 = add nsw i32 %add.a0, %add.a1247  %result1 = add nsw i32 %add.a2, %add.a3248  %result = add nsw i32 %result0, %result1249  ret i32 %result250}251 252define i64 @loop_reduction_and_store_last_element(ptr %src, ptr writeonly %dst) {253; CHECK-LABEL: LV: Checking a loop in 'loop_reduction_and_store_last_element'254; CHECK:       LV(REG): VF = 16255; CHECK-NEXT:  LV(REG): Found max usage: 2 item256; CHECK-NEXT:  LV(REG): RegisterClass: Generic::ScalarRC, 2 registers257; CHECK-NEXT:  LV(REG): RegisterClass: Generic::VectorRC, 16 registers258; CHECK-NEXT:  LV(REG): Found invariant usage: 1 item259entry:260  br label %loop261 262loop:263  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]264  %red = phi i64 [ 0, %entry ], [ %red.next, %loop ]265  %ptr = phi ptr [ %src, %entry ], [ %ptr.next, %loop ]266  %iv.next = add nuw i32 %iv, 1267  %ptr.next = getelementptr i8, ptr %ptr, i64 1268  store ptr %ptr, ptr %dst, align 8269  %val = load i8, ptr %ptr, align 1270  %val.ext = zext i8 %val to i64271  %red.next = or i64 %red, %val.ext272  %ec = icmp eq i32 %iv.next, 1000273  br i1 %ec, label %exit, label %loop274 275exit:276  ret i64 %red.next277}278