301 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 -verify-machineinstrs < %s | FileCheck %s3 4define void @ds_atomic_cmpxchg_i32_ret_av_av__av(ptr addrspace(3) %ptr) #0 {5; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_av_av__av:6; CHECK: ; %bb.0:7; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8; CHECK-NEXT: ;;#ASMSTART9; CHECK-NEXT: ; def v110; CHECK-NEXT: ;;#ASMEND11; CHECK-NEXT: ;;#ASMSTART12; CHECK-NEXT: ; def v213; CHECK-NEXT: ;;#ASMEND14; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:4015; CHECK-NEXT: s_waitcnt lgkmcnt(0)16; CHECK-NEXT: ;;#ASMSTART17; CHECK-NEXT: ; use v018; CHECK-NEXT: ;;#ASMEND19; CHECK-NEXT: s_setpc_b64 s[30:31]20 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 1021 %data0 = call i32 asm "; def $0", "=^VA"()22 %data1 = call i32 asm "; def $0", "=^VA"()23 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic24 %result = extractvalue { i32, i1 } %pair, 025 call void asm "; use $0", "^VA"(i32 %result)26 ret void27}28 29define void @ds_atomic_cmpxchg_i32_ret_av_av__v(ptr addrspace(3) %ptr) #0 {30; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_av_av__v:31; CHECK: ; %bb.0:32; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)33; CHECK-NEXT: ;;#ASMSTART34; CHECK-NEXT: ; def v135; CHECK-NEXT: ;;#ASMEND36; CHECK-NEXT: ;;#ASMSTART37; CHECK-NEXT: ; def v238; CHECK-NEXT: ;;#ASMEND39; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:4040; CHECK-NEXT: s_waitcnt lgkmcnt(0)41; CHECK-NEXT: ;;#ASMSTART42; CHECK-NEXT: ; use v043; CHECK-NEXT: ;;#ASMEND44; CHECK-NEXT: s_setpc_b64 s[30:31]45 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 1046 %data0 = call i32 asm "; def $0", "=^VA"()47 %data1 = call i32 asm "; def $0", "=^VA"()48 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic49 %result = extractvalue { i32, i1 } %pair, 050 call void asm "; use $0", "v"(i32 %result)51 ret void52}53 54define void @ds_atomic_cmpxchg_i32_ret_av_av__a(ptr addrspace(3) %ptr) #0 {55; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_av_av__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: ;;#ASMSTART62; CHECK-NEXT: ; def v263; CHECK-NEXT: ;;#ASMEND64; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:4065; CHECK-NEXT: s_waitcnt lgkmcnt(0)66; CHECK-NEXT: v_accvgpr_write_b32 a0, v067; CHECK-NEXT: ;;#ASMSTART68; CHECK-NEXT: ; use a069; CHECK-NEXT: ;;#ASMEND70; CHECK-NEXT: s_setpc_b64 s[30:31]71 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 1072 %data0 = call i32 asm "; def $0", "=^VA"()73 %data1 = call i32 asm "; def $0", "=^VA"()74 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic75 %result = extractvalue { i32, i1 } %pair, 076 call void asm "; use $0", "a"(i32 %result)77 ret void78}79 80define void @ds_atomic_cmpxchg_i32_ret_a_a__a(ptr addrspace(3) %ptr) #0 {81; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_a_a__a:82; CHECK: ; %bb.0:83; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)84; CHECK-NEXT: ;;#ASMSTART85; CHECK-NEXT: ; def a086; CHECK-NEXT: ;;#ASMEND87; CHECK-NEXT: ;;#ASMSTART88; CHECK-NEXT: ; def a189; CHECK-NEXT: ;;#ASMEND90; CHECK-NEXT: v_accvgpr_read_b32 v1, a091; CHECK-NEXT: v_accvgpr_read_b32 v2, a192; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:4093; CHECK-NEXT: s_waitcnt lgkmcnt(0)94; CHECK-NEXT: v_accvgpr_write_b32 a0, v095; CHECK-NEXT: ;;#ASMSTART96; CHECK-NEXT: ; use a097; CHECK-NEXT: ;;#ASMEND98; CHECK-NEXT: s_setpc_b64 s[30:31]99 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10100 %data0 = call i32 asm "; def $0", "=a"()101 %data1 = call i32 asm "; def $0", "=a"()102 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic103 %result = extractvalue { i32, i1 } %pair, 0104 call void asm "; use $0", "a"(i32 %result)105 ret void106}107 108define void @ds_atomic_cmpxchg_i32_ret_a_a__v(ptr addrspace(3) %ptr) #0 {109; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_a_a__v:110; CHECK: ; %bb.0:111; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)112; CHECK-NEXT: ;;#ASMSTART113; CHECK-NEXT: ; def a0114; CHECK-NEXT: ;;#ASMEND115; CHECK-NEXT: ;;#ASMSTART116; CHECK-NEXT: ; def a1117; CHECK-NEXT: ;;#ASMEND118; CHECK-NEXT: v_accvgpr_read_b32 v1, a0119; CHECK-NEXT: v_accvgpr_read_b32 v2, a1120; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40121; CHECK-NEXT: s_waitcnt lgkmcnt(0)122; CHECK-NEXT: ;;#ASMSTART123; CHECK-NEXT: ; use v0124; CHECK-NEXT: ;;#ASMEND125; CHECK-NEXT: s_setpc_b64 s[30:31]126 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10127 %data0 = call i32 asm "; def $0", "=a"()128 %data1 = call i32 asm "; def $0", "=a"()129 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic130 %result = extractvalue { i32, i1 } %pair, 0131 call void asm "; use $0", "v"(i32 %result)132 ret void133}134 135define void @ds_atomic_cmpxchg_i32_ret_v_a__v(ptr addrspace(3) %ptr) #0 {136; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_v_a__v:137; CHECK: ; %bb.0:138; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)139; CHECK-NEXT: ;;#ASMSTART140; CHECK-NEXT: ; def a0141; CHECK-NEXT: ;;#ASMEND142; CHECK-NEXT: v_accvgpr_read_b32 v2, a0143; CHECK-NEXT: ;;#ASMSTART144; CHECK-NEXT: ; def v1145; CHECK-NEXT: ;;#ASMEND146; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40147; CHECK-NEXT: s_waitcnt lgkmcnt(0)148; CHECK-NEXT: ;;#ASMSTART149; CHECK-NEXT: ; use v0150; CHECK-NEXT: ;;#ASMEND151; CHECK-NEXT: s_setpc_b64 s[30:31]152 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10153 %data0 = call i32 asm "; def $0", "=v"()154 %data1 = call i32 asm "; def $0", "=a"()155 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic156 %result = extractvalue { i32, i1 } %pair, 0157 call void asm "; use $0", "v"(i32 %result)158 ret void159}160 161define void @ds_atomic_cmpxchg_i32_ret_a_v__v(ptr addrspace(3) %ptr) #0 {162; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_a_v__v:163; CHECK: ; %bb.0:164; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)165; CHECK-NEXT: ;;#ASMSTART166; CHECK-NEXT: ; def a0167; CHECK-NEXT: ;;#ASMEND168; CHECK-NEXT: v_accvgpr_read_b32 v2, a0169; CHECK-NEXT: ;;#ASMSTART170; CHECK-NEXT: ; def v1171; CHECK-NEXT: ;;#ASMEND172; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v2, v1 offset:40173; CHECK-NEXT: s_waitcnt lgkmcnt(0)174; CHECK-NEXT: ;;#ASMSTART175; CHECK-NEXT: ; use v0176; CHECK-NEXT: ;;#ASMEND177; CHECK-NEXT: s_setpc_b64 s[30:31]178 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10179 %data0 = call i32 asm "; def $0", "=a"()180 %data1 = call i32 asm "; def $0", "=v"()181 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic182 %result = extractvalue { i32, i1 } %pair, 0183 call void asm "; use $0", "v"(i32 %result)184 ret void185}186 187define void @ds_atomic_cmpxchg_i32_ret_v_v__a(ptr addrspace(3) %ptr) #0 {188; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_v_v__a:189; CHECK: ; %bb.0:190; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)191; CHECK-NEXT: ;;#ASMSTART192; CHECK-NEXT: ; def v1193; CHECK-NEXT: ;;#ASMEND194; CHECK-NEXT: ;;#ASMSTART195; CHECK-NEXT: ; def v2196; CHECK-NEXT: ;;#ASMEND197; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40198; CHECK-NEXT: s_waitcnt lgkmcnt(0)199; CHECK-NEXT: v_accvgpr_write_b32 a0, v0200; CHECK-NEXT: ;;#ASMSTART201; CHECK-NEXT: ; use a0202; CHECK-NEXT: ;;#ASMEND203; CHECK-NEXT: s_setpc_b64 s[30:31]204 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10205 %data0 = call i32 asm "; def $0", "=v"()206 %data1 = call i32 asm "; def $0", "=v"()207 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic208 %result = extractvalue { i32, i1 } %pair, 0209 call void asm "; use $0", "a"(i32 %result)210 ret void211}212 213define void @ds_atomic_cmpxchg_i32_ret_av_v__av(ptr addrspace(3) %ptr) #0 {214; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_av_v__av:215; CHECK: ; %bb.0:216; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)217; CHECK-NEXT: ;;#ASMSTART218; CHECK-NEXT: ; def v1219; CHECK-NEXT: ;;#ASMEND220; CHECK-NEXT: ;;#ASMSTART221; CHECK-NEXT: ; def v2222; CHECK-NEXT: ;;#ASMEND223; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40224; CHECK-NEXT: s_waitcnt lgkmcnt(0)225; CHECK-NEXT: ;;#ASMSTART226; CHECK-NEXT: ; use v0227; CHECK-NEXT: ;;#ASMEND228; CHECK-NEXT: s_setpc_b64 s[30:31]229 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10230 %data0 = call i32 asm "; def $0", "=^VA"()231 %data1 = call i32 asm "; def $0", "=v"()232 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic233 %result = extractvalue { i32, i1 } %pair, 0234 call void asm "; use $0", "^VA"(i32 %result)235 ret void236}237 238define void @ds_atomic_cmpxchg_i32_ret_v_av__av(ptr addrspace(3) %ptr) #0 {239; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_v_av__av:240; CHECK: ; %bb.0:241; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)242; CHECK-NEXT: ;;#ASMSTART243; CHECK-NEXT: ; def v1244; CHECK-NEXT: ;;#ASMEND245; CHECK-NEXT: ;;#ASMSTART246; CHECK-NEXT: ; def v2247; CHECK-NEXT: ;;#ASMEND248; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v1, v2 offset:40249; CHECK-NEXT: s_waitcnt lgkmcnt(0)250; CHECK-NEXT: ;;#ASMSTART251; CHECK-NEXT: ; use v0252; CHECK-NEXT: ;;#ASMEND253; CHECK-NEXT: s_setpc_b64 s[30:31]254 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10255 %data0 = call i32 asm "; def $0", "=v"()256 %data1 = call i32 asm "; def $0", "=^VA"()257 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic258 %result = extractvalue { i32, i1 } %pair, 0259 call void asm "; use $0", "^VA"(i32 %result)260 ret void261}262 263; FIXME: Broken264; define void @ds_atomic_cmpxchg_i32_ret_av_a__av(ptr addrspace(3) %ptr) #0 {265; %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10266; %data0 = call i32 asm "; def $0", "=^VA"()267; %data1 = call i32 asm "; def $0", "=a"()268; %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic269; %result = extractvalue { i32, i1 } %pair, 0270; call void asm "; use $0", "^VA"(i32 %result)271; ret void272; }273 274define void @ds_atomic_cmpxchg_i32_ret_a_av__av(ptr addrspace(3) %ptr) #0 {275; CHECK-LABEL: ds_atomic_cmpxchg_i32_ret_a_av__av:276; CHECK: ; %bb.0:277; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)278; CHECK-NEXT: ;;#ASMSTART279; CHECK-NEXT: ; def a0280; CHECK-NEXT: ;;#ASMEND281; CHECK-NEXT: v_accvgpr_read_b32 v2, a0282; CHECK-NEXT: ;;#ASMSTART283; CHECK-NEXT: ; def v1284; CHECK-NEXT: ;;#ASMEND285; CHECK-NEXT: ds_cmpst_rtn_b32 v0, v0, v2, v1 offset:40286; CHECK-NEXT: s_waitcnt lgkmcnt(0)287; CHECK-NEXT: ;;#ASMSTART288; CHECK-NEXT: ; use v0289; CHECK-NEXT: ;;#ASMEND290; CHECK-NEXT: s_setpc_b64 s[30:31]291 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(3) %ptr, i32 0, i32 10292 %data0 = call i32 asm "; def $0", "=a"()293 %data1 = call i32 asm "; def $0", "=^VA"()294 %pair = cmpxchg ptr addrspace(3) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic295 %result = extractvalue { i32, i1 } %pair, 0296 call void asm "; use $0", "^VA"(i32 %result)297 ret void298}299 300attributes #0 = { nounwind "amdgpu-waves-per-eu"="10,10" }301