brintos

brintos / llvm-project-archived public Read only

0
0
Text · 47.5 KiB · 4c62409 Raw
1124 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn -mcpu=gfx90a < %s | FileCheck %s3 4;---------------------------------------------------------------------5; xchg i32 cases6;---------------------------------------------------------------------7 8; Input and result use AGPR9define void @ds_atomic_xchg_i32_ret_a_a(ptr addrspace(3) %ptr) #0 {10; CHECK-LABEL: ds_atomic_xchg_i32_ret_a_a:11; CHECK:       ; %bb.0:12; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13; CHECK-NEXT:    ;;#ASMSTART14; CHECK-NEXT:    ; def a015; CHECK-NEXT:    ;;#ASMEND16; CHECK-NEXT:    v_accvgpr_read_b32 v1, a017; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v118; CHECK-NEXT:    s_waitcnt lgkmcnt(0)19; CHECK-NEXT:    v_accvgpr_write_b32 a0, v020; CHECK-NEXT:    ;;#ASMSTART21; CHECK-NEXT:    ; use a022; CHECK-NEXT:    ;;#ASMEND23; CHECK-NEXT:    s_setpc_b64 s[30:31]24  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 1025  %data = call i32 asm "; def $0", "=a"()26  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst27  call void asm "; use $0", "a"(i32 %result)28  ret void29}30 31; Input is AGPR, result used as VGPR.32define void @ds_atomic_xchg_i32_ret_a_v(ptr addrspace(3) %ptr) #0 {33; CHECK-LABEL: ds_atomic_xchg_i32_ret_a_v:34; CHECK:       ; %bb.0:35; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)36; CHECK-NEXT:    ;;#ASMSTART37; CHECK-NEXT:    ; def a038; CHECK-NEXT:    ;;#ASMEND39; CHECK-NEXT:    v_accvgpr_read_b32 v1, a040; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v141; CHECK-NEXT:    s_waitcnt lgkmcnt(0)42; CHECK-NEXT:    ;;#ASMSTART43; CHECK-NEXT:    ; use v044; CHECK-NEXT:    ;;#ASMEND45; CHECK-NEXT:    s_setpc_b64 s[30:31]46  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 1047  %data = call i32 asm "; def $0", "=a"()48  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst49  call void asm "; use $0", "v"(i32 %result)50  ret void51}52 53; Input is VGPR, result used as AGPR54define void @ds_atomic_xchg_i32_ret_v_a(ptr addrspace(3) %ptr) #0 {55; CHECK-LABEL: ds_atomic_xchg_i32_ret_v_a:56; CHECK:       ; %bb.0:57; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)58; CHECK-NEXT:    ;;#ASMSTART59; CHECK-NEXT:    ; def v160; CHECK-NEXT:    ;;#ASMEND61; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v162; CHECK-NEXT:    s_waitcnt lgkmcnt(0)63; CHECK-NEXT:    v_accvgpr_write_b32 a0, v064; CHECK-NEXT:    ;;#ASMSTART65; CHECK-NEXT:    ; use a066; CHECK-NEXT:    ;;#ASMEND67; CHECK-NEXT:    s_setpc_b64 s[30:31]68  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 1069  %data = call i32 asm "; def $0", "=v"()70  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst71  call void asm "; use $0", "a"(i32 %result)72  ret void73}74 75; Input is AV, result also used as AV76define void @ds_atomic_xchg_i32_ret_av_av(ptr addrspace(3) %ptr) #0 {77; CHECK-LABEL: ds_atomic_xchg_i32_ret_av_av:78; CHECK:       ; %bb.0:79; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)80; CHECK-NEXT:    ;;#ASMSTART81; CHECK-NEXT:    ; def v182; CHECK-NEXT:    ;;#ASMEND83; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v184; CHECK-NEXT:    s_waitcnt lgkmcnt(0)85; CHECK-NEXT:    ;;#ASMSTART86; CHECK-NEXT:    ; use v087; CHECK-NEXT:    ;;#ASMEND88; CHECK-NEXT:    s_setpc_b64 s[30:31]89  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 1090  %data = call i32 asm "; def $0", "=^VA"()91  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst92  call void asm "; use $0", "^VA"(i32 %result)93  ret void94}95 96; Input is AV, used as v97define void @ds_atomic_xchg_i32_ret_av_v(ptr addrspace(3) %ptr) #0 {98; CHECK-LABEL: ds_atomic_xchg_i32_ret_av_v:99; CHECK:       ; %bb.0:100; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)101; CHECK-NEXT:    ;;#ASMSTART102; CHECK-NEXT:    ; def v1103; CHECK-NEXT:    ;;#ASMEND104; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1105; CHECK-NEXT:    s_waitcnt lgkmcnt(0)106; CHECK-NEXT:    ;;#ASMSTART107; CHECK-NEXT:    ; use v0108; CHECK-NEXT:    ;;#ASMEND109; CHECK-NEXT:    s_setpc_b64 s[30:31]110  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10111  %data = call i32 asm "; def $0", "=^VA"()112  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst113  call void asm "; use $0", "v"(i32 %result)114  ret void115}116 117; Input is AV, used as a118define void @ds_atomic_xchg_i32_ret_av_a(ptr addrspace(3) %ptr) #0 {119; CHECK-LABEL: ds_atomic_xchg_i32_ret_av_a:120; CHECK:       ; %bb.0:121; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)122; CHECK-NEXT:    ;;#ASMSTART123; CHECK-NEXT:    ; def v1124; CHECK-NEXT:    ;;#ASMEND125; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1126; CHECK-NEXT:    s_waitcnt lgkmcnt(0)127; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0128; CHECK-NEXT:    ;;#ASMSTART129; CHECK-NEXT:    ; use a0130; CHECK-NEXT:    ;;#ASMEND131; CHECK-NEXT:    s_setpc_b64 s[30:31]132  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10133  %data = call i32 asm "; def $0", "=^VA"()134  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst135  call void asm "; use $0", "a"(i32 %result)136  ret void137}138 139; Input is a, result used as AV140define void @ds_atomic_xchg_i32_ret_a_av(ptr addrspace(3) %ptr) #0 {141; CHECK-LABEL: ds_atomic_xchg_i32_ret_a_av:142; CHECK:       ; %bb.0:143; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)144; CHECK-NEXT:    ;;#ASMSTART145; CHECK-NEXT:    ; def a0146; CHECK-NEXT:    ;;#ASMEND147; CHECK-NEXT:    v_accvgpr_read_b32 v1, a0148; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1149; CHECK-NEXT:    s_waitcnt lgkmcnt(0)150; CHECK-NEXT:    ;;#ASMSTART151; CHECK-NEXT:    ; use v0152; CHECK-NEXT:    ;;#ASMEND153; CHECK-NEXT:    s_setpc_b64 s[30:31]154  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10155  %data = call i32 asm "; def $0", "=a"()156  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst157  call void asm "; use $0", "^VA"(i32 %result)158  ret void159}160 161; Input is v, result used as AV162define void @ds_atomic_xchg_i32_ret_v_av(ptr addrspace(3) %ptr) #0 {163; CHECK-LABEL: ds_atomic_xchg_i32_ret_v_av:164; CHECK:       ; %bb.0:165; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)166; CHECK-NEXT:    ;;#ASMSTART167; CHECK-NEXT:    ; def v1168; CHECK-NEXT:    ;;#ASMEND169; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1170; CHECK-NEXT:    s_waitcnt lgkmcnt(0)171; CHECK-NEXT:    ;;#ASMSTART172; CHECK-NEXT:    ; use v0173; CHECK-NEXT:    ;;#ASMEND174; CHECK-NEXT:    s_setpc_b64 s[30:31]175  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10176  %data = call i32 asm "; def $0", "=v"()177  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst178  call void asm "; use $0", "^VA"(i32 %result)179  ret void180}181 182define void @ds_atomic_xchg_i32_ret_av_av_no_agprs(ptr addrspace(3) %ptr) #0 {183; CHECK-LABEL: ds_atomic_xchg_i32_ret_av_av_no_agprs:184; CHECK:       ; %bb.0:185; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)186; CHECK-NEXT:    v_accvgpr_write_b32 a2, v40 ; Reload Reuse187; CHECK-NEXT:    v_accvgpr_write_b32 a3, v41 ; Reload Reuse188; CHECK-NEXT:    v_accvgpr_write_b32 a4, v42 ; Reload Reuse189; CHECK-NEXT:    v_accvgpr_write_b32 a5, v43 ; Reload Reuse190; CHECK-NEXT:    v_accvgpr_write_b32 a6, v44 ; Reload Reuse191; CHECK-NEXT:    v_accvgpr_write_b32 a7, v45 ; Reload Reuse192; CHECK-NEXT:    v_accvgpr_write_b32 a8, v46 ; Reload Reuse193; CHECK-NEXT:    v_accvgpr_write_b32 a9, v47 ; Reload Reuse194; CHECK-NEXT:    v_accvgpr_write_b32 a10, v56 ; Reload Reuse195; CHECK-NEXT:    v_accvgpr_write_b32 a11, v57 ; Reload Reuse196; CHECK-NEXT:    v_accvgpr_write_b32 a12, v58 ; Reload Reuse197; CHECK-NEXT:    v_accvgpr_write_b32 a13, v59 ; Reload Reuse198; CHECK-NEXT:    v_accvgpr_write_b32 a14, v60 ; Reload Reuse199; CHECK-NEXT:    v_accvgpr_write_b32 a15, v61 ; Reload Reuse200; CHECK-NEXT:    v_accvgpr_write_b32 a16, v62 ; Reload Reuse201; CHECK-NEXT:    v_accvgpr_write_b32 a17, v63 ; Reload Reuse202; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0203; CHECK-NEXT:    ;;#ASMSTART204; CHECK-NEXT:    ; def v[0:31]205; CHECK-NEXT:    ;;#ASMEND206; CHECK-NEXT:    buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill207; CHECK-NEXT:    s_nop 0208; CHECK-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill209; CHECK-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill210; CHECK-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill211; CHECK-NEXT:    buffer_store_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill212; CHECK-NEXT:    buffer_store_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill213; CHECK-NEXT:    buffer_store_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill214; CHECK-NEXT:    buffer_store_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill215; CHECK-NEXT:    buffer_store_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill216; CHECK-NEXT:    buffer_store_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill217; CHECK-NEXT:    buffer_store_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Spill218; CHECK-NEXT:    buffer_store_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Spill219; CHECK-NEXT:    buffer_store_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Spill220; CHECK-NEXT:    buffer_store_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Spill221; CHECK-NEXT:    buffer_store_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Spill222; CHECK-NEXT:    buffer_store_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Spill223; CHECK-NEXT:    buffer_store_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Spill224; CHECK-NEXT:    buffer_store_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Spill225; CHECK-NEXT:    ;;#ASMSTART226; CHECK-NEXT:    ; def a1227; CHECK-NEXT:    ;;#ASMEND228; CHECK-NEXT:    v_accvgpr_write_b32 a18, v31 ; Reload Reuse229; CHECK-NEXT:    v_accvgpr_read_b32 v0, a0230; CHECK-NEXT:    v_accvgpr_read_b32 v1, a1231; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1232; CHECK-NEXT:    s_waitcnt lgkmcnt(0)233; CHECK-NEXT:    v_accvgpr_write_b32 a31, v18 ; Reload Reuse234; CHECK-NEXT:    v_accvgpr_write_b32 a30, v19 ; Reload Reuse235; CHECK-NEXT:    v_accvgpr_write_b32 a29, v20 ; Reload Reuse236; CHECK-NEXT:    v_accvgpr_write_b32 a28, v21 ; Reload Reuse237; CHECK-NEXT:    v_accvgpr_write_b32 a27, v22 ; Reload Reuse238; CHECK-NEXT:    v_accvgpr_write_b32 a26, v23 ; Reload Reuse239; CHECK-NEXT:    v_accvgpr_write_b32 a25, v24 ; Reload Reuse240; CHECK-NEXT:    v_accvgpr_write_b32 a24, v25 ; Reload Reuse241; CHECK-NEXT:    v_accvgpr_write_b32 a23, v26 ; Reload Reuse242; CHECK-NEXT:    v_accvgpr_write_b32 a22, v27 ; Reload Reuse243; CHECK-NEXT:    v_accvgpr_write_b32 a21, v28 ; Reload Reuse244; CHECK-NEXT:    v_accvgpr_write_b32 a20, v29 ; Reload Reuse245; CHECK-NEXT:    v_accvgpr_write_b32 a19, v30 ; Reload Reuse246; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0247; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload248; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload249; CHECK-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Reload250; CHECK-NEXT:    buffer_load_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Reload251; CHECK-NEXT:    buffer_load_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Reload252; CHECK-NEXT:    buffer_load_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Reload253; CHECK-NEXT:    buffer_load_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Reload254; CHECK-NEXT:    buffer_load_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Reload255; CHECK-NEXT:    buffer_load_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Reload256; CHECK-NEXT:    buffer_load_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload257; CHECK-NEXT:    buffer_load_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Reload258; CHECK-NEXT:    buffer_load_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Reload259; CHECK-NEXT:    buffer_load_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Reload260; CHECK-NEXT:    buffer_load_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Reload261; CHECK-NEXT:    buffer_load_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Reload262; CHECK-NEXT:    buffer_load_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Reload263; CHECK-NEXT:    buffer_load_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Reload264; CHECK-NEXT:    buffer_load_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Reload265; CHECK-NEXT:    v_accvgpr_read_b32 v18, a31 ; Reload Reuse266; CHECK-NEXT:    v_accvgpr_read_b32 v19, a30 ; Reload Reuse267; CHECK-NEXT:    v_accvgpr_read_b32 v20, a29 ; Reload Reuse268; CHECK-NEXT:    v_accvgpr_read_b32 v21, a28 ; Reload Reuse269; CHECK-NEXT:    v_accvgpr_read_b32 v22, a27 ; Reload Reuse270; CHECK-NEXT:    v_accvgpr_read_b32 v23, a26 ; Reload Reuse271; CHECK-NEXT:    v_accvgpr_read_b32 v24, a25 ; Reload Reuse272; CHECK-NEXT:    v_accvgpr_read_b32 v25, a24 ; Reload Reuse273; CHECK-NEXT:    v_accvgpr_read_b32 v26, a23 ; Reload Reuse274; CHECK-NEXT:    v_accvgpr_read_b32 v27, a22 ; Reload Reuse275; CHECK-NEXT:    v_accvgpr_read_b32 v28, a21 ; Reload Reuse276; CHECK-NEXT:    v_accvgpr_read_b32 v29, a20 ; Reload Reuse277; CHECK-NEXT:    v_accvgpr_read_b32 v30, a19 ; Reload Reuse278; CHECK-NEXT:    ;;#ASMSTART279; CHECK-NEXT:    ; use a0280; CHECK-NEXT:    ;;#ASMEND281; CHECK-NEXT:    s_waitcnt vmcnt(0)282; CHECK-NEXT:    v_accvgpr_read_b32 v31, a18 ; Reload Reuse283; CHECK-NEXT:    ;;#ASMSTART284; CHECK-NEXT:    ; use v[0:31]285; CHECK-NEXT:    ;;#ASMEND286; CHECK-NEXT:    v_accvgpr_read_b32 v63, a17 ; Reload Reuse287; CHECK-NEXT:    v_accvgpr_read_b32 v62, a16 ; Reload Reuse288; CHECK-NEXT:    v_accvgpr_read_b32 v61, a15 ; Reload Reuse289; CHECK-NEXT:    v_accvgpr_read_b32 v60, a14 ; Reload Reuse290; CHECK-NEXT:    v_accvgpr_read_b32 v59, a13 ; Reload Reuse291; CHECK-NEXT:    v_accvgpr_read_b32 v58, a12 ; Reload Reuse292; CHECK-NEXT:    v_accvgpr_read_b32 v57, a11 ; Reload Reuse293; CHECK-NEXT:    v_accvgpr_read_b32 v56, a10 ; Reload Reuse294; CHECK-NEXT:    v_accvgpr_read_b32 v47, a9 ; Reload Reuse295; CHECK-NEXT:    v_accvgpr_read_b32 v46, a8 ; Reload Reuse296; CHECK-NEXT:    v_accvgpr_read_b32 v45, a7 ; Reload Reuse297; CHECK-NEXT:    v_accvgpr_read_b32 v44, a6 ; Reload Reuse298; CHECK-NEXT:    v_accvgpr_read_b32 v43, a5 ; Reload Reuse299; CHECK-NEXT:    v_accvgpr_read_b32 v42, a4 ; Reload Reuse300; CHECK-NEXT:    v_accvgpr_read_b32 v41, a3 ; Reload Reuse301; CHECK-NEXT:    v_accvgpr_read_b32 v40, a2 ; Reload Reuse302; CHECK-NEXT:    s_setpc_b64 s[30:31]303  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10304  %data = call i32 asm "; def $0", "=^VA"()305  %vgpr.def = call { <32 x i32>, <32 x i32> }  asm sideeffect "; def $0", "=${v[0:31]},=${v[32:63]}"()306  %vgpr.0 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 0307  %vgpr.1 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 1308  %result = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst309  call void asm sideeffect "; use $0", "{v[0:31]},{v[32:63]}"(<32 x i32> %vgpr.0, <32 x i32> %vgpr.1)310  call void asm "; use $0", "^VA"(i32 %result)311  ret void312}313 314define void @ds_atomic_xchg_i32_noret_a(ptr addrspace(3) %ptr) #0 {315; CHECK-LABEL: ds_atomic_xchg_i32_noret_a:316; CHECK:       ; %bb.0:317; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)318; CHECK-NEXT:    ;;#ASMSTART319; CHECK-NEXT:    ; def a0320; CHECK-NEXT:    ;;#ASMEND321; CHECK-NEXT:    v_accvgpr_read_b32 v1, a0322; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1323; CHECK-NEXT:    s_waitcnt lgkmcnt(0)324; CHECK-NEXT:    s_setpc_b64 s[30:31]325  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10326  %data = call i32 asm "; def $0", "=a"()327  %unused = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst328  ret void329}330 331define void @ds_atomic_xchg_i32_noret_av(ptr addrspace(3) %ptr) #0 {332; CHECK-LABEL: ds_atomic_xchg_i32_noret_av:333; CHECK:       ; %bb.0:334; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)335; CHECK-NEXT:    ;;#ASMSTART336; CHECK-NEXT:    ; def v1337; CHECK-NEXT:    ;;#ASMEND338; CHECK-NEXT:    ds_wrxchg_rtn_b32 v0, v0, v1339; CHECK-NEXT:    s_waitcnt lgkmcnt(0)340; CHECK-NEXT:    s_setpc_b64 s[30:31]341  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10342  %data = call i32 asm "; def $0", "=^VA"()343  %unused = atomicrmw xchg ptr addrspace(3) %ptr, i32 %data seq_cst344  ret void345}346 347;---------------------------------------------------------------------348; xchg i64 cases349;---------------------------------------------------------------------350 351; Input and result use AGPR352define void @ds_atomic_xchg_i64_ret_a_a(ptr addrspace(3) %ptr) #0 {353; CHECK-LABEL: ds_atomic_xchg_i64_ret_a_a:354; CHECK:       ; %bb.0:355; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)356; CHECK-NEXT:    ;;#ASMSTART357; CHECK-NEXT:    ; def a[0:1]358; CHECK-NEXT:    ;;#ASMEND359; CHECK-NEXT:    v_accvgpr_read_b32 v3, a1360; CHECK-NEXT:    v_accvgpr_read_b32 v2, a0361; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]362; CHECK-NEXT:    s_waitcnt lgkmcnt(0)363; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0364; CHECK-NEXT:    v_accvgpr_write_b32 a1, v1365; CHECK-NEXT:    ;;#ASMSTART366; CHECK-NEXT:    ; use a[0:1]367; CHECK-NEXT:    ;;#ASMEND368; CHECK-NEXT:    s_setpc_b64 s[30:31]369  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10370  %data = call i64 asm "; def $0", "=a"()371  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst372  call void asm "; use $0", "a"(i64 %result)373  ret void374}375 376; Input is AGPR, result used as VGPR.377define void @ds_atomic_xchg_i64_ret_a_v(ptr addrspace(3) %ptr) #0 {378; CHECK-LABEL: ds_atomic_xchg_i64_ret_a_v:379; CHECK:       ; %bb.0:380; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)381; CHECK-NEXT:    ;;#ASMSTART382; CHECK-NEXT:    ; def a[0:1]383; CHECK-NEXT:    ;;#ASMEND384; CHECK-NEXT:    v_accvgpr_read_b32 v3, a1385; CHECK-NEXT:    v_accvgpr_read_b32 v2, a0386; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]387; CHECK-NEXT:    s_waitcnt lgkmcnt(0)388; CHECK-NEXT:    ;;#ASMSTART389; CHECK-NEXT:    ; use v[0:1]390; CHECK-NEXT:    ;;#ASMEND391; CHECK-NEXT:    s_setpc_b64 s[30:31]392  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10393  %data = call i64 asm "; def $0", "=a"()394  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst395  call void asm "; use $0", "v"(i64 %result)396  ret void397}398 399; Input is VGPR, result used as AGPR400define void @ds_atomic_xchg_i64_ret_v_a(ptr addrspace(3) %ptr) #0 {401; CHECK-LABEL: ds_atomic_xchg_i64_ret_v_a:402; CHECK:       ; %bb.0:403; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)404; CHECK-NEXT:    ;;#ASMSTART405; CHECK-NEXT:    ; def v[2:3]406; CHECK-NEXT:    ;;#ASMEND407; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]408; CHECK-NEXT:    s_waitcnt lgkmcnt(0)409; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0410; CHECK-NEXT:    v_accvgpr_write_b32 a1, v1411; CHECK-NEXT:    ;;#ASMSTART412; CHECK-NEXT:    ; use a[0:1]413; CHECK-NEXT:    ;;#ASMEND414; CHECK-NEXT:    s_setpc_b64 s[30:31]415  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10416  %data = call i64 asm "; def $0", "=v"()417  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst418  call void asm "; use $0", "a"(i64 %result)419  ret void420}421 422; Input is AV, result also used as AV423define void @ds_atomic_xchg_i64_ret_av_av(ptr addrspace(3) %ptr) #0 {424; CHECK-LABEL: ds_atomic_xchg_i64_ret_av_av:425; CHECK:       ; %bb.0:426; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)427; CHECK-NEXT:    ;;#ASMSTART428; CHECK-NEXT:    ; def v[2:3]429; CHECK-NEXT:    ;;#ASMEND430; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]431; CHECK-NEXT:    s_waitcnt lgkmcnt(0)432; CHECK-NEXT:    ;;#ASMSTART433; CHECK-NEXT:    ; use v[0:1]434; CHECK-NEXT:    ;;#ASMEND435; CHECK-NEXT:    s_setpc_b64 s[30:31]436  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10437  %data = call i64 asm "; def $0", "=^VA"()438  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst439  call void asm "; use $0", "^VA"(i64 %result)440  ret void441}442 443; Input is AV, used as v444define void @ds_atomic_xchg_i64_ret_av_v(ptr addrspace(3) %ptr) #0 {445; CHECK-LABEL: ds_atomic_xchg_i64_ret_av_v:446; CHECK:       ; %bb.0:447; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)448; CHECK-NEXT:    ;;#ASMSTART449; CHECK-NEXT:    ; def v[2:3]450; CHECK-NEXT:    ;;#ASMEND451; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]452; CHECK-NEXT:    s_waitcnt lgkmcnt(0)453; CHECK-NEXT:    ;;#ASMSTART454; CHECK-NEXT:    ; use v[0:1]455; CHECK-NEXT:    ;;#ASMEND456; CHECK-NEXT:    s_setpc_b64 s[30:31]457  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10458  %data = call i64 asm "; def $0", "=^VA"()459  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst460  call void asm "; use $0", "v"(i64 %result)461  ret void462}463 464; Input is AV, used as a465define void @ds_atomic_xchg_i64_ret_av_a(ptr addrspace(3) %ptr) #0 {466; CHECK-LABEL: ds_atomic_xchg_i64_ret_av_a:467; CHECK:       ; %bb.0:468; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)469; CHECK-NEXT:    ;;#ASMSTART470; CHECK-NEXT:    ; def v[2:3]471; CHECK-NEXT:    ;;#ASMEND472; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]473; CHECK-NEXT:    s_waitcnt lgkmcnt(0)474; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0475; CHECK-NEXT:    v_accvgpr_write_b32 a1, v1476; CHECK-NEXT:    ;;#ASMSTART477; CHECK-NEXT:    ; use a[0:1]478; CHECK-NEXT:    ;;#ASMEND479; CHECK-NEXT:    s_setpc_b64 s[30:31]480  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10481  %data = call i64 asm "; def $0", "=^VA"()482  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst483  call void asm "; use $0", "a"(i64 %result)484  ret void485}486 487; Input is a, result used as AV488define void @ds_atomic_xchg_i64_ret_a_av(ptr addrspace(3) %ptr) #0 {489; CHECK-LABEL: ds_atomic_xchg_i64_ret_a_av:490; CHECK:       ; %bb.0:491; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)492; CHECK-NEXT:    ;;#ASMSTART493; CHECK-NEXT:    ; def a[0:1]494; CHECK-NEXT:    ;;#ASMEND495; CHECK-NEXT:    v_accvgpr_read_b32 v3, a1496; CHECK-NEXT:    v_accvgpr_read_b32 v2, a0497; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]498; CHECK-NEXT:    s_waitcnt lgkmcnt(0)499; CHECK-NEXT:    ;;#ASMSTART500; CHECK-NEXT:    ; use v[0:1]501; CHECK-NEXT:    ;;#ASMEND502; CHECK-NEXT:    s_setpc_b64 s[30:31]503  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10504  %data = call i64 asm "; def $0", "=a"()505  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst506  call void asm "; use $0", "^VA"(i64 %result)507  ret void508}509 510; Input is v, result used as AV511define void @ds_atomic_xchg_i64_ret_v_av(ptr addrspace(3) %ptr) #0 {512; CHECK-LABEL: ds_atomic_xchg_i64_ret_v_av:513; CHECK:       ; %bb.0:514; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)515; CHECK-NEXT:    ;;#ASMSTART516; CHECK-NEXT:    ; def v[2:3]517; CHECK-NEXT:    ;;#ASMEND518; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]519; CHECK-NEXT:    s_waitcnt lgkmcnt(0)520; CHECK-NEXT:    ;;#ASMSTART521; CHECK-NEXT:    ; use v[0:1]522; CHECK-NEXT:    ;;#ASMEND523; CHECK-NEXT:    s_setpc_b64 s[30:31]524  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10525  %data = call i64 asm "; def $0", "=v"()526  %result = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst527  call void asm "; use $0", "^VA"(i64 %result)528  ret void529}530 531define void @ds_atomic_xchg_i64_noret_a(ptr addrspace(3) %ptr) #0 {532; CHECK-LABEL: ds_atomic_xchg_i64_noret_a:533; CHECK:       ; %bb.0:534; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)535; CHECK-NEXT:    ;;#ASMSTART536; CHECK-NEXT:    ; def a[0:1]537; CHECK-NEXT:    ;;#ASMEND538; CHECK-NEXT:    v_accvgpr_read_b32 v3, a1539; CHECK-NEXT:    v_accvgpr_read_b32 v2, a0540; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]541; CHECK-NEXT:    s_waitcnt lgkmcnt(0)542; CHECK-NEXT:    s_setpc_b64 s[30:31]543  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i64 0, i64 10544  %data = call i64 asm "; def $0", "=a"()545  %unused = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst546  ret void547}548 549define void @ds_atomic_xchg_i64_noret_av(ptr addrspace(3) %ptr) #0 {550; CHECK-LABEL: ds_atomic_xchg_i64_noret_av:551; CHECK:       ; %bb.0:552; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)553; CHECK-NEXT:    ;;#ASMSTART554; CHECK-NEXT:    ; def v[2:3]555; CHECK-NEXT:    ;;#ASMEND556; CHECK-NEXT:    ds_wrxchg_rtn_b64 v[0:1], v0, v[2:3]557; CHECK-NEXT:    s_waitcnt lgkmcnt(0)558; CHECK-NEXT:    s_setpc_b64 s[30:31]559  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i64 0, i64 10560  %data = call i64 asm "; def $0", "=^VA"()561  %unused = atomicrmw xchg ptr addrspace(3) %ptr, i64 %data seq_cst562  ret void563}564 565;---------------------------------------------------------------------566; xor i32 cases567;---------------------------------------------------------------------568 569; Input and result use AGPR570define void @ds_atomic_xor_i32_ret_a_a(ptr addrspace(3) %ptr) #0 {571; CHECK-LABEL: ds_atomic_xor_i32_ret_a_a:572; CHECK:       ; %bb.0:573; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)574; CHECK-NEXT:    ;;#ASMSTART575; CHECK-NEXT:    ; def a0576; CHECK-NEXT:    ;;#ASMEND577; CHECK-NEXT:    v_accvgpr_read_b32 v1, a0578; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1579; CHECK-NEXT:    s_waitcnt lgkmcnt(0)580; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0581; CHECK-NEXT:    ;;#ASMSTART582; CHECK-NEXT:    ; use a0583; CHECK-NEXT:    ;;#ASMEND584; CHECK-NEXT:    s_setpc_b64 s[30:31]585  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10586  %data = call i32 asm "; def $0", "=a"()587  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst588  call void asm "; use $0", "a"(i32 %result)589  ret void590}591 592; Input is AGPR, result used as VGPR.593define void @ds_atomic_xor_i32_ret_a_v(ptr addrspace(3) %ptr) #0 {594; CHECK-LABEL: ds_atomic_xor_i32_ret_a_v:595; CHECK:       ; %bb.0:596; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)597; CHECK-NEXT:    ;;#ASMSTART598; CHECK-NEXT:    ; def a0599; CHECK-NEXT:    ;;#ASMEND600; CHECK-NEXT:    v_accvgpr_read_b32 v1, a0601; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1602; CHECK-NEXT:    s_waitcnt lgkmcnt(0)603; CHECK-NEXT:    ;;#ASMSTART604; CHECK-NEXT:    ; use v0605; CHECK-NEXT:    ;;#ASMEND606; CHECK-NEXT:    s_setpc_b64 s[30:31]607  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10608  %data = call i32 asm "; def $0", "=a"()609  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst610  call void asm "; use $0", "v"(i32 %result)611  ret void612}613 614; Input is VGPR, result used as AGPR615define void @ds_atomic_xor_i32_ret_v_a(ptr addrspace(3) %ptr) #0 {616; CHECK-LABEL: ds_atomic_xor_i32_ret_v_a:617; CHECK:       ; %bb.0:618; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)619; CHECK-NEXT:    ;;#ASMSTART620; CHECK-NEXT:    ; def v1621; CHECK-NEXT:    ;;#ASMEND622; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1623; CHECK-NEXT:    s_waitcnt lgkmcnt(0)624; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0625; CHECK-NEXT:    ;;#ASMSTART626; CHECK-NEXT:    ; use a0627; CHECK-NEXT:    ;;#ASMEND628; CHECK-NEXT:    s_setpc_b64 s[30:31]629  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10630  %data = call i32 asm "; def $0", "=v"()631  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst632  call void asm "; use $0", "a"(i32 %result)633  ret void634}635 636; Input is AV, result also used as AV637define void @ds_atomic_xor_i32_ret_av_av(ptr addrspace(3) %ptr) #0 {638; CHECK-LABEL: ds_atomic_xor_i32_ret_av_av:639; CHECK:       ; %bb.0:640; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)641; CHECK-NEXT:    ;;#ASMSTART642; CHECK-NEXT:    ; def v1643; CHECK-NEXT:    ;;#ASMEND644; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1645; CHECK-NEXT:    s_waitcnt lgkmcnt(0)646; CHECK-NEXT:    ;;#ASMSTART647; CHECK-NEXT:    ; use v0648; CHECK-NEXT:    ;;#ASMEND649; CHECK-NEXT:    s_setpc_b64 s[30:31]650  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10651  %data = call i32 asm "; def $0", "=^VA"()652  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst653  call void asm "; use $0", "^VA"(i32 %result)654  ret void655}656 657; Input is AV, used as v658define void @ds_atomic_xor_i32_ret_av_v(ptr addrspace(3) %ptr) #0 {659; CHECK-LABEL: ds_atomic_xor_i32_ret_av_v:660; CHECK:       ; %bb.0:661; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)662; CHECK-NEXT:    ;;#ASMSTART663; CHECK-NEXT:    ; def v1664; CHECK-NEXT:    ;;#ASMEND665; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1666; CHECK-NEXT:    s_waitcnt lgkmcnt(0)667; CHECK-NEXT:    ;;#ASMSTART668; CHECK-NEXT:    ; use v0669; CHECK-NEXT:    ;;#ASMEND670; CHECK-NEXT:    s_setpc_b64 s[30:31]671  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10672  %data = call i32 asm "; def $0", "=^VA"()673  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst674  call void asm "; use $0", "v"(i32 %result)675  ret void676}677 678; Input is AV, used as a679define void @ds_atomic_xor_i32_ret_av_a(ptr addrspace(3) %ptr) #0 {680; CHECK-LABEL: ds_atomic_xor_i32_ret_av_a:681; CHECK:       ; %bb.0:682; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)683; CHECK-NEXT:    ;;#ASMSTART684; CHECK-NEXT:    ; def v1685; CHECK-NEXT:    ;;#ASMEND686; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1687; CHECK-NEXT:    s_waitcnt lgkmcnt(0)688; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0689; CHECK-NEXT:    ;;#ASMSTART690; CHECK-NEXT:    ; use a0691; CHECK-NEXT:    ;;#ASMEND692; CHECK-NEXT:    s_setpc_b64 s[30:31]693  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10694  %data = call i32 asm "; def $0", "=^VA"()695  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst696  call void asm "; use $0", "a"(i32 %result)697  ret void698}699 700; Input is a, result used as AV701define void @ds_atomic_xor_i32_ret_a_av(ptr addrspace(3) %ptr) #0 {702; CHECK-LABEL: ds_atomic_xor_i32_ret_a_av:703; CHECK:       ; %bb.0:704; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)705; CHECK-NEXT:    ;;#ASMSTART706; CHECK-NEXT:    ; def a0707; CHECK-NEXT:    ;;#ASMEND708; CHECK-NEXT:    v_accvgpr_read_b32 v1, a0709; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1710; CHECK-NEXT:    s_waitcnt lgkmcnt(0)711; CHECK-NEXT:    ;;#ASMSTART712; CHECK-NEXT:    ; use v0713; CHECK-NEXT:    ;;#ASMEND714; CHECK-NEXT:    s_setpc_b64 s[30:31]715  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10716  %data = call i32 asm "; def $0", "=a"()717  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst718  call void asm "; use $0", "^VA"(i32 %result)719  ret void720}721 722; Input is v, result used as AV723define void @ds_atomic_xor_i32_ret_v_av(ptr addrspace(3) %ptr) #0 {724; CHECK-LABEL: ds_atomic_xor_i32_ret_v_av:725; CHECK:       ; %bb.0:726; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)727; CHECK-NEXT:    ;;#ASMSTART728; CHECK-NEXT:    ; def v1729; CHECK-NEXT:    ;;#ASMEND730; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1731; CHECK-NEXT:    s_waitcnt lgkmcnt(0)732; CHECK-NEXT:    ;;#ASMSTART733; CHECK-NEXT:    ; use v0734; CHECK-NEXT:    ;;#ASMEND735; CHECK-NEXT:    s_setpc_b64 s[30:31]736  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10737  %data = call i32 asm "; def $0", "=v"()738  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst739  call void asm "; use $0", "^VA"(i32 %result)740  ret void741}742 743define void @ds_atomic_xor_i32_ret_av_av_no_agprs(ptr addrspace(3) %ptr) #0 {744; CHECK-LABEL: ds_atomic_xor_i32_ret_av_av_no_agprs:745; CHECK:       ; %bb.0:746; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)747; CHECK-NEXT:    v_accvgpr_write_b32 a2, v40 ; Reload Reuse748; CHECK-NEXT:    v_accvgpr_write_b32 a3, v41 ; Reload Reuse749; CHECK-NEXT:    v_accvgpr_write_b32 a4, v42 ; Reload Reuse750; CHECK-NEXT:    v_accvgpr_write_b32 a5, v43 ; Reload Reuse751; CHECK-NEXT:    v_accvgpr_write_b32 a6, v44 ; Reload Reuse752; CHECK-NEXT:    v_accvgpr_write_b32 a7, v45 ; Reload Reuse753; CHECK-NEXT:    v_accvgpr_write_b32 a8, v46 ; Reload Reuse754; CHECK-NEXT:    v_accvgpr_write_b32 a9, v47 ; Reload Reuse755; CHECK-NEXT:    v_accvgpr_write_b32 a10, v56 ; Reload Reuse756; CHECK-NEXT:    v_accvgpr_write_b32 a11, v57 ; Reload Reuse757; CHECK-NEXT:    v_accvgpr_write_b32 a12, v58 ; Reload Reuse758; CHECK-NEXT:    v_accvgpr_write_b32 a13, v59 ; Reload Reuse759; CHECK-NEXT:    v_accvgpr_write_b32 a14, v60 ; Reload Reuse760; CHECK-NEXT:    v_accvgpr_write_b32 a15, v61 ; Reload Reuse761; CHECK-NEXT:    v_accvgpr_write_b32 a16, v62 ; Reload Reuse762; CHECK-NEXT:    v_accvgpr_write_b32 a17, v63 ; Reload Reuse763; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0764; CHECK-NEXT:    ;;#ASMSTART765; CHECK-NEXT:    ; def v[0:31]766; CHECK-NEXT:    ;;#ASMEND767; CHECK-NEXT:    buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill768; CHECK-NEXT:    s_nop 0769; CHECK-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill770; CHECK-NEXT:    buffer_store_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Spill771; CHECK-NEXT:    buffer_store_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Spill772; CHECK-NEXT:    buffer_store_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Spill773; CHECK-NEXT:    buffer_store_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Spill774; CHECK-NEXT:    buffer_store_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Spill775; CHECK-NEXT:    buffer_store_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Spill776; CHECK-NEXT:    buffer_store_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Spill777; CHECK-NEXT:    buffer_store_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Spill778; CHECK-NEXT:    buffer_store_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Spill779; CHECK-NEXT:    buffer_store_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Spill780; CHECK-NEXT:    buffer_store_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Spill781; CHECK-NEXT:    buffer_store_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Spill782; CHECK-NEXT:    buffer_store_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Spill783; CHECK-NEXT:    buffer_store_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Spill784; CHECK-NEXT:    buffer_store_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Spill785; CHECK-NEXT:    buffer_store_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Spill786; CHECK-NEXT:    ;;#ASMSTART787; CHECK-NEXT:    ; def a1788; CHECK-NEXT:    ;;#ASMEND789; CHECK-NEXT:    v_accvgpr_write_b32 a18, v31 ; Reload Reuse790; CHECK-NEXT:    v_accvgpr_read_b32 v0, a0791; CHECK-NEXT:    v_accvgpr_read_b32 v1, a1792; CHECK-NEXT:    ds_xor_rtn_b32 v0, v0, v1793; CHECK-NEXT:    s_waitcnt lgkmcnt(0)794; CHECK-NEXT:    v_accvgpr_write_b32 a31, v18 ; Reload Reuse795; CHECK-NEXT:    v_accvgpr_write_b32 a30, v19 ; Reload Reuse796; CHECK-NEXT:    v_accvgpr_write_b32 a29, v20 ; Reload Reuse797; CHECK-NEXT:    v_accvgpr_write_b32 a28, v21 ; Reload Reuse798; CHECK-NEXT:    v_accvgpr_write_b32 a27, v22 ; Reload Reuse799; CHECK-NEXT:    v_accvgpr_write_b32 a26, v23 ; Reload Reuse800; CHECK-NEXT:    v_accvgpr_write_b32 a25, v24 ; Reload Reuse801; CHECK-NEXT:    v_accvgpr_write_b32 a24, v25 ; Reload Reuse802; CHECK-NEXT:    v_accvgpr_write_b32 a23, v26 ; Reload Reuse803; CHECK-NEXT:    v_accvgpr_write_b32 a22, v27 ; Reload Reuse804; CHECK-NEXT:    v_accvgpr_write_b32 a21, v28 ; Reload Reuse805; CHECK-NEXT:    v_accvgpr_write_b32 a20, v29 ; Reload Reuse806; CHECK-NEXT:    v_accvgpr_write_b32 a19, v30 ; Reload Reuse807; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0808; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload809; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload810; CHECK-NEXT:    buffer_load_dword v2, off, s[0:3], s32 offset:8 ; 4-byte Folded Reload811; CHECK-NEXT:    buffer_load_dword v3, off, s[0:3], s32 offset:12 ; 4-byte Folded Reload812; CHECK-NEXT:    buffer_load_dword v4, off, s[0:3], s32 offset:16 ; 4-byte Folded Reload813; CHECK-NEXT:    buffer_load_dword v5, off, s[0:3], s32 offset:20 ; 4-byte Folded Reload814; CHECK-NEXT:    buffer_load_dword v6, off, s[0:3], s32 offset:24 ; 4-byte Folded Reload815; CHECK-NEXT:    buffer_load_dword v7, off, s[0:3], s32 offset:28 ; 4-byte Folded Reload816; CHECK-NEXT:    buffer_load_dword v8, off, s[0:3], s32 offset:32 ; 4-byte Folded Reload817; CHECK-NEXT:    buffer_load_dword v9, off, s[0:3], s32 offset:36 ; 4-byte Folded Reload818; CHECK-NEXT:    buffer_load_dword v10, off, s[0:3], s32 offset:40 ; 4-byte Folded Reload819; CHECK-NEXT:    buffer_load_dword v11, off, s[0:3], s32 offset:44 ; 4-byte Folded Reload820; CHECK-NEXT:    buffer_load_dword v12, off, s[0:3], s32 offset:48 ; 4-byte Folded Reload821; CHECK-NEXT:    buffer_load_dword v13, off, s[0:3], s32 offset:52 ; 4-byte Folded Reload822; CHECK-NEXT:    buffer_load_dword v14, off, s[0:3], s32 offset:56 ; 4-byte Folded Reload823; CHECK-NEXT:    buffer_load_dword v15, off, s[0:3], s32 offset:60 ; 4-byte Folded Reload824; CHECK-NEXT:    buffer_load_dword v16, off, s[0:3], s32 offset:64 ; 4-byte Folded Reload825; CHECK-NEXT:    buffer_load_dword v17, off, s[0:3], s32 offset:68 ; 4-byte Folded Reload826; CHECK-NEXT:    v_accvgpr_read_b32 v18, a31 ; Reload Reuse827; CHECK-NEXT:    v_accvgpr_read_b32 v19, a30 ; Reload Reuse828; CHECK-NEXT:    v_accvgpr_read_b32 v20, a29 ; Reload Reuse829; CHECK-NEXT:    v_accvgpr_read_b32 v21, a28 ; Reload Reuse830; CHECK-NEXT:    v_accvgpr_read_b32 v22, a27 ; Reload Reuse831; CHECK-NEXT:    v_accvgpr_read_b32 v23, a26 ; Reload Reuse832; CHECK-NEXT:    v_accvgpr_read_b32 v24, a25 ; Reload Reuse833; CHECK-NEXT:    v_accvgpr_read_b32 v25, a24 ; Reload Reuse834; CHECK-NEXT:    v_accvgpr_read_b32 v26, a23 ; Reload Reuse835; CHECK-NEXT:    v_accvgpr_read_b32 v27, a22 ; Reload Reuse836; CHECK-NEXT:    v_accvgpr_read_b32 v28, a21 ; Reload Reuse837; CHECK-NEXT:    v_accvgpr_read_b32 v29, a20 ; Reload Reuse838; CHECK-NEXT:    v_accvgpr_read_b32 v30, a19 ; Reload Reuse839; CHECK-NEXT:    ;;#ASMSTART840; CHECK-NEXT:    ; use a0841; CHECK-NEXT:    ;;#ASMEND842; CHECK-NEXT:    s_waitcnt vmcnt(0)843; CHECK-NEXT:    v_accvgpr_read_b32 v31, a18 ; Reload Reuse844; CHECK-NEXT:    ;;#ASMSTART845; CHECK-NEXT:    ; use v[0:31]846; CHECK-NEXT:    ;;#ASMEND847; CHECK-NEXT:    v_accvgpr_read_b32 v63, a17 ; Reload Reuse848; CHECK-NEXT:    v_accvgpr_read_b32 v62, a16 ; Reload Reuse849; CHECK-NEXT:    v_accvgpr_read_b32 v61, a15 ; Reload Reuse850; CHECK-NEXT:    v_accvgpr_read_b32 v60, a14 ; Reload Reuse851; CHECK-NEXT:    v_accvgpr_read_b32 v59, a13 ; Reload Reuse852; CHECK-NEXT:    v_accvgpr_read_b32 v58, a12 ; Reload Reuse853; CHECK-NEXT:    v_accvgpr_read_b32 v57, a11 ; Reload Reuse854; CHECK-NEXT:    v_accvgpr_read_b32 v56, a10 ; Reload Reuse855; CHECK-NEXT:    v_accvgpr_read_b32 v47, a9 ; Reload Reuse856; CHECK-NEXT:    v_accvgpr_read_b32 v46, a8 ; Reload Reuse857; CHECK-NEXT:    v_accvgpr_read_b32 v45, a7 ; Reload Reuse858; CHECK-NEXT:    v_accvgpr_read_b32 v44, a6 ; Reload Reuse859; CHECK-NEXT:    v_accvgpr_read_b32 v43, a5 ; Reload Reuse860; CHECK-NEXT:    v_accvgpr_read_b32 v42, a4 ; Reload Reuse861; CHECK-NEXT:    v_accvgpr_read_b32 v41, a3 ; Reload Reuse862; CHECK-NEXT:    v_accvgpr_read_b32 v40, a2 ; Reload Reuse863; CHECK-NEXT:    s_setpc_b64 s[30:31]864  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10865  %data = call i32 asm "; def $0", "=^VA"()866  %vgpr.def = call { <32 x i32>, <32 x i32> }  asm sideeffect "; def $0", "=${v[0:31]},=${v[32:63]}"()867  %vgpr.0 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 0868  %vgpr.1 = extractvalue { <32 x i32>, <32 x i32> } %vgpr.def, 1869  %result = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst870  call void asm sideeffect "; use $0", "{v[0:31]},{v[32:63]}"(<32 x i32> %vgpr.0, <32 x i32> %vgpr.1)871  call void asm "; use $0", "^VA"(i32 %result)872  ret void873}874 875define void @ds_atomic_xor_i32_noret_a(ptr addrspace(3) %ptr) #0 {876; CHECK-LABEL: ds_atomic_xor_i32_noret_a:877; CHECK:       ; %bb.0:878; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)879; CHECK-NEXT:    ;;#ASMSTART880; CHECK-NEXT:    ; def a0881; CHECK-NEXT:    ;;#ASMEND882; CHECK-NEXT:    ds_xor_b32 v0, a0883; CHECK-NEXT:    s_waitcnt lgkmcnt(0)884; CHECK-NEXT:    s_setpc_b64 s[30:31]885  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10886  %data = call i32 asm "; def $0", "=a"()887  %unused = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst888  ret void889}890 891define void @ds_atomic_xor_i32_noret_av(ptr addrspace(3) %ptr) #0 {892; CHECK-LABEL: ds_atomic_xor_i32_noret_av:893; CHECK:       ; %bb.0:894; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)895; CHECK-NEXT:    ;;#ASMSTART896; CHECK-NEXT:    ; def v1897; CHECK-NEXT:    ;;#ASMEND898; CHECK-NEXT:    ds_xor_b32 v0, v1899; CHECK-NEXT:    s_waitcnt lgkmcnt(0)900; CHECK-NEXT:    s_setpc_b64 s[30:31]901  %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10902  %data = call i32 asm "; def $0", "=^VA"()903  %unused = atomicrmw xor ptr addrspace(3) %ptr, i32 %data seq_cst904  ret void905}906 907;---------------------------------------------------------------------908; xor i64 cases909;---------------------------------------------------------------------910 911; Input and result use AGPR912define void @ds_atomic_xor_i64_ret_a_a(ptr addrspace(3) %ptr) #0 {913; CHECK-LABEL: ds_atomic_xor_i64_ret_a_a:914; CHECK:       ; %bb.0:915; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)916; CHECK-NEXT:    ;;#ASMSTART917; CHECK-NEXT:    ; def a[0:1]918; CHECK-NEXT:    ;;#ASMEND919; CHECK-NEXT:    v_accvgpr_read_b32 v3, a1920; CHECK-NEXT:    v_accvgpr_read_b32 v2, a0921; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]922; CHECK-NEXT:    s_waitcnt lgkmcnt(0)923; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0924; CHECK-NEXT:    v_accvgpr_write_b32 a1, v1925; CHECK-NEXT:    ;;#ASMSTART926; CHECK-NEXT:    ; use a[0:1]927; CHECK-NEXT:    ;;#ASMEND928; CHECK-NEXT:    s_setpc_b64 s[30:31]929  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10930  %data = call i64 asm "; def $0", "=a"()931  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst932  call void asm "; use $0", "a"(i64 %result)933  ret void934}935 936; Input is AGPR, result used as VGPR.937define void @ds_atomic_xor_i64_ret_a_v(ptr addrspace(3) %ptr) #0 {938; CHECK-LABEL: ds_atomic_xor_i64_ret_a_v:939; CHECK:       ; %bb.0:940; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)941; CHECK-NEXT:    ;;#ASMSTART942; CHECK-NEXT:    ; def a[0:1]943; CHECK-NEXT:    ;;#ASMEND944; CHECK-NEXT:    v_accvgpr_read_b32 v3, a1945; CHECK-NEXT:    v_accvgpr_read_b32 v2, a0946; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]947; CHECK-NEXT:    s_waitcnt lgkmcnt(0)948; CHECK-NEXT:    ;;#ASMSTART949; CHECK-NEXT:    ; use v[0:1]950; CHECK-NEXT:    ;;#ASMEND951; CHECK-NEXT:    s_setpc_b64 s[30:31]952  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10953  %data = call i64 asm "; def $0", "=a"()954  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst955  call void asm "; use $0", "v"(i64 %result)956  ret void957}958 959; Input is VGPR, result used as AGPR960define void @ds_atomic_xor_i64_ret_v_a(ptr addrspace(3) %ptr) #0 {961; CHECK-LABEL: ds_atomic_xor_i64_ret_v_a:962; CHECK:       ; %bb.0:963; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)964; CHECK-NEXT:    ;;#ASMSTART965; CHECK-NEXT:    ; def v[2:3]966; CHECK-NEXT:    ;;#ASMEND967; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]968; CHECK-NEXT:    s_waitcnt lgkmcnt(0)969; CHECK-NEXT:    v_accvgpr_write_b32 a0, v0970; CHECK-NEXT:    v_accvgpr_write_b32 a1, v1971; CHECK-NEXT:    ;;#ASMSTART972; CHECK-NEXT:    ; use a[0:1]973; CHECK-NEXT:    ;;#ASMEND974; CHECK-NEXT:    s_setpc_b64 s[30:31]975  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10976  %data = call i64 asm "; def $0", "=v"()977  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst978  call void asm "; use $0", "a"(i64 %result)979  ret void980}981 982; Input is AV, result also used as AV983define void @ds_atomic_xor_i64_ret_av_av(ptr addrspace(3) %ptr) #0 {984; CHECK-LABEL: ds_atomic_xor_i64_ret_av_av:985; CHECK:       ; %bb.0:986; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)987; CHECK-NEXT:    ;;#ASMSTART988; CHECK-NEXT:    ; def v[2:3]989; CHECK-NEXT:    ;;#ASMEND990; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]991; CHECK-NEXT:    s_waitcnt lgkmcnt(0)992; CHECK-NEXT:    ;;#ASMSTART993; CHECK-NEXT:    ; use v[0:1]994; CHECK-NEXT:    ;;#ASMEND995; CHECK-NEXT:    s_setpc_b64 s[30:31]996  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 10997  %data = call i64 asm "; def $0", "=^VA"()998  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst999  call void asm "; use $0", "^VA"(i64 %result)1000  ret void1001}1002 1003; Input is AV, used as v1004define void @ds_atomic_xor_i64_ret_av_v(ptr addrspace(3) %ptr) #0 {1005; CHECK-LABEL: ds_atomic_xor_i64_ret_av_v:1006; CHECK:       ; %bb.0:1007; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1008; CHECK-NEXT:    ;;#ASMSTART1009; CHECK-NEXT:    ; def v[2:3]1010; CHECK-NEXT:    ;;#ASMEND1011; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]1012; CHECK-NEXT:    s_waitcnt lgkmcnt(0)1013; CHECK-NEXT:    ;;#ASMSTART1014; CHECK-NEXT:    ; use v[0:1]1015; CHECK-NEXT:    ;;#ASMEND1016; CHECK-NEXT:    s_setpc_b64 s[30:31]1017  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 101018  %data = call i64 asm "; def $0", "=^VA"()1019  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst1020  call void asm "; use $0", "v"(i64 %result)1021  ret void1022}1023 1024; Input is AV, used as a1025define void @ds_atomic_xor_i64_ret_av_a(ptr addrspace(3) %ptr) #0 {1026; CHECK-LABEL: ds_atomic_xor_i64_ret_av_a:1027; CHECK:       ; %bb.0:1028; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1029; CHECK-NEXT:    ;;#ASMSTART1030; CHECK-NEXT:    ; def v[2:3]1031; CHECK-NEXT:    ;;#ASMEND1032; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]1033; CHECK-NEXT:    s_waitcnt lgkmcnt(0)1034; CHECK-NEXT:    v_accvgpr_write_b32 a0, v01035; CHECK-NEXT:    v_accvgpr_write_b32 a1, v11036; CHECK-NEXT:    ;;#ASMSTART1037; CHECK-NEXT:    ; use a[0:1]1038; CHECK-NEXT:    ;;#ASMEND1039; CHECK-NEXT:    s_setpc_b64 s[30:31]1040  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 101041  %data = call i64 asm "; def $0", "=^VA"()1042  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst1043  call void asm "; use $0", "a"(i64 %result)1044  ret void1045}1046 1047; Input is a, result used as AV1048define void @ds_atomic_xor_i64_ret_a_av(ptr addrspace(3) %ptr) #0 {1049; CHECK-LABEL: ds_atomic_xor_i64_ret_a_av:1050; CHECK:       ; %bb.0:1051; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1052; CHECK-NEXT:    ;;#ASMSTART1053; CHECK-NEXT:    ; def a[0:1]1054; CHECK-NEXT:    ;;#ASMEND1055; CHECK-NEXT:    v_accvgpr_read_b32 v3, a11056; CHECK-NEXT:    v_accvgpr_read_b32 v2, a01057; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]1058; CHECK-NEXT:    s_waitcnt lgkmcnt(0)1059; CHECK-NEXT:    ;;#ASMSTART1060; CHECK-NEXT:    ; use v[0:1]1061; CHECK-NEXT:    ;;#ASMEND1062; CHECK-NEXT:    s_setpc_b64 s[30:31]1063  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 101064  %data = call i64 asm "; def $0", "=a"()1065  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst1066  call void asm "; use $0", "^VA"(i64 %result)1067  ret void1068}1069 1070; Input is v, result used as AV1071define void @ds_atomic_xor_i64_ret_v_av(ptr addrspace(3) %ptr) #0 {1072; CHECK-LABEL: ds_atomic_xor_i64_ret_v_av:1073; CHECK:       ; %bb.0:1074; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1075; CHECK-NEXT:    ;;#ASMSTART1076; CHECK-NEXT:    ; def v[2:3]1077; CHECK-NEXT:    ;;#ASMEND1078; CHECK-NEXT:    ds_xor_rtn_b64 v[0:1], v0, v[2:3]1079; CHECK-NEXT:    s_waitcnt lgkmcnt(0)1080; CHECK-NEXT:    ;;#ASMSTART1081; CHECK-NEXT:    ; use v[0:1]1082; CHECK-NEXT:    ;;#ASMEND1083; CHECK-NEXT:    s_setpc_b64 s[30:31]1084  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i32 0, i32 101085  %data = call i64 asm "; def $0", "=v"()1086  %result = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst1087  call void asm "; use $0", "^VA"(i64 %result)1088  ret void1089}1090 1091define void @ds_atomic_xor_i64_noret_a(ptr addrspace(3) %ptr) #0 {1092; CHECK-LABEL: ds_atomic_xor_i64_noret_a:1093; CHECK:       ; %bb.0:1094; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1095; CHECK-NEXT:    ;;#ASMSTART1096; CHECK-NEXT:    ; def a[0:1]1097; CHECK-NEXT:    ;;#ASMEND1098; CHECK-NEXT:    ds_xor_b64 v0, a[0:1]1099; CHECK-NEXT:    s_waitcnt lgkmcnt(0)1100; CHECK-NEXT:    s_setpc_b64 s[30:31]1101  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i64 0, i64 101102  %data = call i64 asm "; def $0", "=a"()1103  %unused = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst1104  ret void1105}1106 1107define void @ds_atomic_xor_i64_noret_av(ptr addrspace(3) %ptr) #0 {1108; CHECK-LABEL: ds_atomic_xor_i64_noret_av:1109; CHECK:       ; %bb.0:1110; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1111; CHECK-NEXT:    ;;#ASMSTART1112; CHECK-NEXT:    ; def v[2:3]1113; CHECK-NEXT:    ;;#ASMEND1114; CHECK-NEXT:    ds_xor_b64 v0, v[2:3]1115; CHECK-NEXT:    s_waitcnt lgkmcnt(0)1116; CHECK-NEXT:    s_setpc_b64 s[30:31]1117  %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(3) %ptr, i64 0, i64 101118  %data = call i64 asm "; def $0", "=^VA"()1119  %unused = atomicrmw xor ptr addrspace(3) %ptr, i64 %data seq_cst1120  ret void1121}1122 1123attributes #0 = { nounwind "amdgpu-waves-per-eu"="10,10" }1124