Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
      2 ; RUN: llc -march=amdgcn -verify-machineinstrs -O0 < %s
      3 
      4 ; GCN-LABEL: {{^}}test_loop:
      5 ; GCN: [[LABEL:BB[0-9+]_[0-9]+]]:
      6 ; GCN: ds_read_b32
      7 ; GCN: ds_write_b32
      8 ; GCN: s_branch [[LABEL]]
      9 ; GCN: s_endpgm
     10 define void @test_loop(float addrspace(3)* %ptr, i32 %n) nounwind {
     11 entry:
     12   %cmp = icmp eq i32 %n, -1
     13   br i1 %cmp, label %for.exit, label %for.body
     14 
     15 for.exit:
     16   ret void
     17 
     18 for.body:
     19   %indvar = phi i32 [ %inc, %for.body ], [ 0, %entry ]
     20   %tmp = add i32 %indvar, 32
     21   %arrayidx = getelementptr float, float addrspace(3)* %ptr, i32 %tmp
     22   %vecload = load float, float addrspace(3)* %arrayidx, align 4
     23   %add = fadd float %vecload, 1.0
     24   store float %add, float addrspace(3)* %arrayidx, align 8
     25   %inc = add i32 %indvar, 1
     26   br label %for.body
     27 }
     28 
     29 ; GCN-LABEL: @loop_const_true
     30 ; GCN: [[LABEL:BB[0-9+]_[0-9]+]]:
     31 ; GCN: ds_read_b32
     32 ; GCN: ds_write_b32
     33 ; GCN: s_branch [[LABEL]]
     34 define void @loop_const_true(float addrspace(3)* %ptr, i32 %n) nounwind {
     35 entry:
     36   br label %for.body
     37 
     38 for.exit:
     39   ret void
     40 
     41 for.body:
     42   %indvar = phi i32 [ %inc, %for.body ], [ 0, %entry ]
     43   %tmp = add i32 %indvar, 32
     44   %arrayidx = getelementptr float, float addrspace(3)* %ptr, i32 %tmp
     45   %vecload = load float, float addrspace(3)* %arrayidx, align 4
     46   %add = fadd float %vecload, 1.0
     47   store float %add, float addrspace(3)* %arrayidx, align 8
     48   %inc = add i32 %indvar, 1
     49   br i1 true, label %for.body, label %for.exit
     50 }
     51 
     52 ; GCN-LABEL: {{^}}loop_const_false:
     53 ; GCN-NOT: s_branch
     54 ; GCN: s_endpgm
     55 define void @loop_const_false(float addrspace(3)* %ptr, i32 %n) nounwind {
     56 entry:
     57   br label %for.body
     58 
     59 for.exit:
     60   ret void
     61 
     62 ; XXX - Should there be an S_ENDPGM?
     63 for.body:
     64   %indvar = phi i32 [ %inc, %for.body ], [ 0, %entry ]
     65   %tmp = add i32 %indvar, 32
     66   %arrayidx = getelementptr float, float addrspace(3)* %ptr, i32 %tmp
     67   %vecload = load float, float addrspace(3)* %arrayidx, align 4
     68   %add = fadd float %vecload, 1.0
     69   store float %add, float addrspace(3)* %arrayidx, align 8
     70   %inc = add i32 %indvar, 1
     71   br i1 false, label %for.body, label %for.exit
     72 }
     73 
     74 ; GCN-LABEL: {{^}}loop_const_undef:
     75 ; GCN-NOT: s_branch
     76 ; GCN: s_endpgm
     77 define void @loop_const_undef(float addrspace(3)* %ptr, i32 %n) nounwind {
     78 entry:
     79   br label %for.body
     80 
     81 for.exit:
     82   ret void
     83 
     84 ; XXX - Should there be an s_endpgm?
     85 for.body:
     86   %indvar = phi i32 [ %inc, %for.body ], [ 0, %entry ]
     87   %tmp = add i32 %indvar, 32
     88   %arrayidx = getelementptr float, float addrspace(3)* %ptr, i32 %tmp
     89   %vecload = load float, float addrspace(3)* %arrayidx, align 4
     90   %add = fadd float %vecload, 1.0
     91   store float %add, float addrspace(3)* %arrayidx, align 8
     92   %inc = add i32 %indvar, 1
     93   br i1 undef, label %for.body, label %for.exit
     94 }
     95 
     96 ; GCN-LABEL: {{^}}loop_arg_0:
     97 ; GCN: v_and_b32_e32 v{{[0-9]+}}, 1, v{{[0-9]+}}
     98 ; GCN: v_cmp_eq_i32_e32 vcc, 1,
     99 
    100 ; GCN: s_and_b64 s{{\[[0-9]+:[0-9]+\]}}, exec, vcc
    101 ; GCN: [[LOOPBB:BB[0-9]+_[0-9]+]]
    102 ; GCN: s_cbranch_vccnz [[LOOPBB]]
    103 ; GCN-NEXT: ; BB#2
    104 ; GCN-NEXT: s_endpgm
    105 define void @loop_arg_0(float addrspace(3)* %ptr, i32 %n, i1 %cond) nounwind {
    106 entry:
    107   br label %for.body
    108 
    109 for.exit:
    110   ret void
    111 
    112 for.body:
    113   %indvar = phi i32 [ %inc, %for.body ], [ 0, %entry ]
    114   %tmp = add i32 %indvar, 32
    115   %arrayidx = getelementptr float, float addrspace(3)* %ptr, i32 %tmp
    116   %vecload = load float, float addrspace(3)* %arrayidx, align 4
    117   %add = fadd float %vecload, 1.0
    118   store float %add, float addrspace(3)* %arrayidx, align 8
    119   %inc = add i32 %indvar, 1
    120   br i1 %cond, label %for.body, label %for.exit
    121 }
    122