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