148 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 52# RUN: llc -mtriple=amdgcn -run-pass=si-memory-legalizer %s -o - | FileCheck %s3 4--- |5 declare i32 @llvm.amdgcn.workitem.id.x() #06 7 define amdgpu_kernel void @atomic_max_i32_noret(8 ptr addrspace(1) %out,9 ptr addrspace(1) %in,10 ptr addrspace(1) %x,11 i32 %y) #1 {12 %tid = call i32 @llvm.amdgcn.workitem.id.x()13 %idxprom = sext i32 %tid to i6414 %tid.gep = getelementptr ptr addrspace(1), ptr addrspace(1) %in, i64 %idxprom15 %ptr = load volatile ptr addrspace(1), ptr addrspace(1) %tid.gep16 %xor = xor i32 %tid, 117 %cmp = icmp ne i32 %xor, 018 %1 = call { i1, i64 } @llvm.amdgcn.if(i1 %cmp)19 %2 = extractvalue { i1, i64 } %1, 020 %3 = extractvalue { i1, i64 } %1, 121 br i1 %2, label %atomic, label %exit22 23 atomic: ; preds = %024 %gep = getelementptr i32, ptr addrspace(1) %ptr, i32 10025 %ret = atomicrmw max ptr addrspace(1) %gep, i32 %y seq_cst26 br label %exit27 28 exit: ; preds = %atomic, %029 call void @llvm.amdgcn.end.cf(i64 %3)30 ret void31 }32 33 declare { i1, i64 } @llvm.amdgcn.if(i1)34 35 declare void @llvm.amdgcn.end.cf(i64)36 37 attributes #0 = { nounwind readnone }38 attributes #1 = { nounwind "target-cpu"="gfx803" }39 40...41---42 43 44 45name: atomic_max_i32_noret46alignment: 147exposesReturnsTwice: false48legalized: false49regBankSelected: false50selected: false51tracksRegLiveness: true52liveins:53 - { reg: '$sgpr0_sgpr1' }54 - { reg: '$vgpr0' }55frameInfo:56 isFrameAddressTaken: false57 isReturnAddressTaken: false58 hasStackMap: false59 hasPatchPoint: false60 stackSize: 061 offsetAdjustment: 062 maxAlignment: 063 adjustsStack: false64 hasCalls: false65 maxCallFrameSize: 066 hasOpaqueSPAdjustment: false67 hasVAStart: false68 hasMustTailInVarArgFunc: false69body: |70 ; CHECK-LABEL: name: atomic_max_i32_noret71 ; CHECK: bb.0 (%ir-block.0):72 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)73 ; CHECK-NEXT: liveins: $vgpr0, $sgpr0_sgpr174 ; CHECK-NEXT: {{ $}}75 ; CHECK-NEXT: $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM $sgpr0_sgpr1, 11, 0 :: (non-temporal dereferenceable invariant load (s64) from `ptr addrspace(4) poison`, addrspace 4)76 ; CHECK-NEXT: $vgpr1 = V_ASHRREV_I32_e32 31, $vgpr0, implicit $exec77 ; CHECK-NEXT: $vgpr1_vgpr2 = V_LSHL_B64_e64 $vgpr0_vgpr1, 3, implicit $exec78 ; CHECK-NEXT: $sgpr7 = S_MOV_B32 6144079 ; CHECK-NEXT: $sgpr6 = S_MOV_B32 080 ; CHECK-NEXT: S_WAITCNT 12781 ; CHECK-NEXT: $vgpr1_vgpr2 = BUFFER_LOAD_DWORDX2_ADDR64 killed $vgpr1_vgpr2, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 1, 0, implicit $exec :: (volatile load (s64) from %ir.tid.gep, addrspace 1)82 ; CHECK-NEXT: S_WAITCNT_soft 395283 ; CHECK-NEXT: $vgpr0 = V_XOR_B32_e32 1, killed $vgpr0, implicit $exec84 ; CHECK-NEXT: V_CMP_NE_U32_e32 0, killed $vgpr0, implicit-def $vcc, implicit $exec85 ; CHECK-NEXT: $sgpr2_sgpr3 = S_AND_SAVEEXEC_B64 killed $vcc, implicit-def $exec, implicit-def $scc, implicit $exec86 ; CHECK-NEXT: $sgpr2_sgpr3 = S_XOR_B64 $exec, killed $sgpr2_sgpr3, implicit-def dead $scc87 ; CHECK-NEXT: S_CBRANCH_EXECZ %bb.2, implicit $exec88 ; CHECK-NEXT: {{ $}}89 ; CHECK-NEXT: bb.1.atomic:90 ; CHECK-NEXT: successors: %bb.2(0x80000000)91 ; CHECK-NEXT: liveins: $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000000C, $sgpr0_sgpr1, $sgpr2_sgpr3, $vgpr1_vgpr2_vgpr3_vgpr4:0x000000000000000392 ; CHECK-NEXT: {{ $}}93 ; CHECK-NEXT: $sgpr0 = S_LOAD_DWORD_IMM killed $sgpr0_sgpr1, 15, 0 :: (non-temporal dereferenceable invariant load (s32) from `ptr addrspace(4) poison`, addrspace 4)94 ; CHECK-NEXT: dead $vgpr0 = V_MOV_B32_e32 -1, implicit $exec95 ; CHECK-NEXT: dead $vgpr0 = V_MOV_B32_e32 61440, implicit $exec96 ; CHECK-NEXT: $sgpr4_sgpr5 = S_MOV_B64 097 ; CHECK-NEXT: S_WAITCNT 12798 ; CHECK-NEXT: $vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec99 ; CHECK-NEXT: S_WAITCNT 3952100 ; CHECK-NEXT: S_WAITCNT_soft 3952101 ; CHECK-NEXT: BUFFER_ATOMIC_SMAX_ADDR64 killed $vgpr0, killed $vgpr1_vgpr2, killed $sgpr4_sgpr5_sgpr6_sgpr7, 0, 400, 0, implicit $exec :: (volatile load syncscope("one-as") seq_cst (s32) from %ir.gep, addrspace 1)102 ; CHECK-NEXT: S_WAITCNT_soft 3952103 ; CHECK-NEXT: BUFFER_WBINVL1_VOL implicit $exec104 ; CHECK-NEXT: {{ $}}105 ; CHECK-NEXT: bb.2.exit:106 ; CHECK-NEXT: liveins: $sgpr2_sgpr3107 ; CHECK-NEXT: {{ $}}108 ; CHECK-NEXT: $exec = S_OR_B64 $exec, killed $sgpr2_sgpr3, implicit-def $scc109 ; CHECK-NEXT: S_ENDPGM 0110 bb.0 (%ir-block.0):111 successors: %bb.1.atomic(0x40000000), %bb.2.exit(0x40000000)112 liveins: $vgpr0, $sgpr0_sgpr1113 114 $sgpr4_sgpr5 = S_LOAD_DWORDX2_IMM $sgpr0_sgpr1, 11, 0 :: (non-temporal dereferenceable invariant load (s64) from `ptr addrspace(4) poison`)115 $vgpr1 = V_ASHRREV_I32_e32 31, $vgpr0, implicit $exec116 $vgpr1_vgpr2 = V_LSHL_B64_e64 $vgpr0_vgpr1, 3, implicit $exec117 $sgpr7 = S_MOV_B32 61440118 $sgpr6 = S_MOV_B32 0119 S_WAITCNT 127120 $vgpr1_vgpr2 = BUFFER_LOAD_DWORDX2_ADDR64 killed $vgpr1_vgpr2, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec :: (volatile load (s64) from %ir.tid.gep)121 $vgpr0 = V_XOR_B32_e32 1, killed $vgpr0, implicit $exec122 V_CMP_NE_U32_e32 0, killed $vgpr0, implicit-def $vcc, implicit $exec123 $sgpr2_sgpr3 = S_AND_SAVEEXEC_B64 killed $vcc, implicit-def $exec, implicit-def $scc, implicit $exec124 $sgpr2_sgpr3 = S_XOR_B64 $exec, killed $sgpr2_sgpr3, implicit-def dead $scc125 S_CBRANCH_EXECZ %bb.2.exit, implicit $exec126 127 bb.1.atomic:128 successors: %bb.2.exit(0x80000000)129 liveins: $sgpr4_sgpr5_sgpr6_sgpr7:0x0000000C, $sgpr0_sgpr1, $sgpr2_sgpr3, $vgpr1_vgpr2_vgpr3_vgpr4:0x00000003130 131 $sgpr0 = S_LOAD_DWORD_IMM killed $sgpr0_sgpr1, 15, 0 :: (non-temporal dereferenceable invariant load (s32) from `ptr addrspace(4) poison`)132 dead $vgpr0 = V_MOV_B32_e32 -1, implicit $exec133 dead $vgpr0 = V_MOV_B32_e32 61440, implicit $exec134 $sgpr4_sgpr5 = S_MOV_B64 0135 S_WAITCNT 127136 $vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec137 S_WAITCNT 3952138 BUFFER_ATOMIC_SMAX_ADDR64 killed $vgpr0, killed $vgpr1_vgpr2, killed $sgpr4_sgpr5_sgpr6_sgpr7, 0, 400, 0, implicit $exec :: (volatile load syncscope("one-as") seq_cst (s32) from %ir.gep)139 140 bb.2.exit:141 liveins: $sgpr2_sgpr3142 143 $exec = S_OR_B64 $exec, killed $sgpr2_sgpr3, implicit-def $scc144 S_ENDPGM 0145 146...147 148