722 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; i32 cases6;---------------------------------------------------------------------7 8define void @global_atomic_cmpxchg_i32_ret_av_av__av(ptr addrspace(1) %ptr) #0 {9; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_av_av__av:10; CHECK: ; %bb.0:11; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)12; CHECK-NEXT: ;;#ASMSTART13; CHECK-NEXT: ; def v314; CHECK-NEXT: ;;#ASMEND15; CHECK-NEXT: ;;#ASMSTART16; CHECK-NEXT: ; def v217; CHECK-NEXT: ;;#ASMEND18; CHECK-NEXT: buffer_wbl219; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc20; CHECK-NEXT: s_waitcnt vmcnt(0)21; CHECK-NEXT: buffer_invl222; CHECK-NEXT: buffer_wbinvl1_vol23; CHECK-NEXT: ;;#ASMSTART24; CHECK-NEXT: ; use v025; CHECK-NEXT: ;;#ASMEND26; CHECK-NEXT: s_setpc_b64 s[30:31]27 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1028 %data0 = call i32 asm "; def $0", "=^VA"()29 %data1 = call i32 asm "; def $0", "=^VA"()30 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic31 %result = extractvalue { i32, i1 } %pair, 032 call void asm "; use $0", "^VA"(i32 %result)33 ret void34}35 36define void @global_atomic_cmpxchg_i32_ret_av_av__v(ptr addrspace(1) %ptr) #0 {37; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_av_av__v:38; CHECK: ; %bb.0:39; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)40; CHECK-NEXT: ;;#ASMSTART41; CHECK-NEXT: ; def v342; CHECK-NEXT: ;;#ASMEND43; CHECK-NEXT: ;;#ASMSTART44; CHECK-NEXT: ; def v245; CHECK-NEXT: ;;#ASMEND46; CHECK-NEXT: buffer_wbl247; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc48; CHECK-NEXT: s_waitcnt vmcnt(0)49; CHECK-NEXT: buffer_invl250; CHECK-NEXT: buffer_wbinvl1_vol51; CHECK-NEXT: ;;#ASMSTART52; CHECK-NEXT: ; use v053; CHECK-NEXT: ;;#ASMEND54; CHECK-NEXT: s_setpc_b64 s[30:31]55 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1056 %data0 = call i32 asm "; def $0", "=^VA"()57 %data1 = call i32 asm "; def $0", "=^VA"()58 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic59 %result = extractvalue { i32, i1 } %pair, 060 call void asm "; use $0", "v"(i32 %result)61 ret void62}63 64define void @global_atomic_cmpxchg_i32_ret_av_av__a(ptr addrspace(1) %ptr) #0 {65; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_av_av__a:66; CHECK: ; %bb.0:67; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)68; CHECK-NEXT: ;;#ASMSTART69; CHECK-NEXT: ; def v370; CHECK-NEXT: ;;#ASMEND71; CHECK-NEXT: ;;#ASMSTART72; CHECK-NEXT: ; def v273; CHECK-NEXT: ;;#ASMEND74; CHECK-NEXT: buffer_wbl275; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc76; CHECK-NEXT: s_waitcnt vmcnt(0)77; CHECK-NEXT: buffer_invl278; CHECK-NEXT: buffer_wbinvl1_vol79; CHECK-NEXT: v_accvgpr_write_b32 a0, v080; CHECK-NEXT: ;;#ASMSTART81; CHECK-NEXT: ; use a082; CHECK-NEXT: ;;#ASMEND83; CHECK-NEXT: s_setpc_b64 s[30:31]84 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 1085 %data0 = call i32 asm "; def $0", "=^VA"()86 %data1 = call i32 asm "; def $0", "=^VA"()87 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic88 %result = extractvalue { i32, i1 } %pair, 089 call void asm "; use $0", "a"(i32 %result)90 ret void91}92 93define void @global_atomic_cmpxchg_i32_ret_a_a__a(ptr addrspace(1) %ptr) #0 {94; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_a_a__a:95; CHECK: ; %bb.0:96; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)97; CHECK-NEXT: ;;#ASMSTART98; CHECK-NEXT: ; def a199; CHECK-NEXT: ;;#ASMEND100; CHECK-NEXT: ;;#ASMSTART101; CHECK-NEXT: ; def a0102; CHECK-NEXT: ;;#ASMEND103; CHECK-NEXT: v_accvgpr_read_b32 v3, a1104; CHECK-NEXT: v_accvgpr_read_b32 v2, a0105; CHECK-NEXT: buffer_wbl2106; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc107; CHECK-NEXT: s_waitcnt vmcnt(0)108; CHECK-NEXT: buffer_invl2109; CHECK-NEXT: buffer_wbinvl1_vol110; CHECK-NEXT: v_accvgpr_write_b32 a0, v0111; CHECK-NEXT: ;;#ASMSTART112; CHECK-NEXT: ; use a0113; CHECK-NEXT: ;;#ASMEND114; CHECK-NEXT: s_setpc_b64 s[30:31]115 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10116 %data0 = call i32 asm "; def $0", "=a"()117 %data1 = call i32 asm "; def $0", "=a"()118 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic119 %result = extractvalue { i32, i1 } %pair, 0120 call void asm "; use $0", "a"(i32 %result)121 ret void122}123 124define void @global_atomic_cmpxchg_i32_ret_a_a__v(ptr addrspace(1) %ptr) #0 {125; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_a_a__v:126; CHECK: ; %bb.0:127; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)128; CHECK-NEXT: ;;#ASMSTART129; CHECK-NEXT: ; def a1130; CHECK-NEXT: ;;#ASMEND131; CHECK-NEXT: ;;#ASMSTART132; CHECK-NEXT: ; def a0133; CHECK-NEXT: ;;#ASMEND134; CHECK-NEXT: v_accvgpr_read_b32 v3, a1135; CHECK-NEXT: v_accvgpr_read_b32 v2, a0136; CHECK-NEXT: buffer_wbl2137; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc138; CHECK-NEXT: s_waitcnt vmcnt(0)139; CHECK-NEXT: buffer_invl2140; CHECK-NEXT: buffer_wbinvl1_vol141; CHECK-NEXT: ;;#ASMSTART142; CHECK-NEXT: ; use v0143; CHECK-NEXT: ;;#ASMEND144; CHECK-NEXT: s_setpc_b64 s[30:31]145 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10146 %data0 = call i32 asm "; def $0", "=a"()147 %data1 = call i32 asm "; def $0", "=a"()148 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic149 %result = extractvalue { i32, i1 } %pair, 0150 call void asm "; use $0", "v"(i32 %result)151 ret void152}153 154define void @global_atomic_cmpxchg_i32_ret_v_a__v(ptr addrspace(1) %ptr) #0 {155; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_v_a__v:156; CHECK: ; %bb.0:157; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)158; CHECK-NEXT: ;;#ASMSTART159; CHECK-NEXT: ; def v2160; CHECK-NEXT: ;;#ASMEND161; CHECK-NEXT: v_accvgpr_write_b32 a1, v2162; CHECK-NEXT: ;;#ASMSTART163; CHECK-NEXT: ; def a0164; CHECK-NEXT: ;;#ASMEND165; CHECK-NEXT: v_accvgpr_read_b32 v3, a1166; CHECK-NEXT: v_accvgpr_read_b32 v2, a0167; CHECK-NEXT: buffer_wbl2168; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc169; CHECK-NEXT: s_waitcnt vmcnt(0)170; CHECK-NEXT: buffer_invl2171; CHECK-NEXT: buffer_wbinvl1_vol172; CHECK-NEXT: ;;#ASMSTART173; CHECK-NEXT: ; use v0174; CHECK-NEXT: ;;#ASMEND175; CHECK-NEXT: s_setpc_b64 s[30:31]176 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10177 %data0 = call i32 asm "; def $0", "=v"()178 %data1 = call i32 asm "; def $0", "=a"()179 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic180 %result = extractvalue { i32, i1 } %pair, 0181 call void asm "; use $0", "v"(i32 %result)182 ret void183}184 185define void @global_atomic_cmpxchg_i32_ret_a_v__v(ptr addrspace(1) %ptr) #0 {186; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_a_v__v:187; CHECK: ; %bb.0:188; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)189; CHECK-NEXT: ;;#ASMSTART190; CHECK-NEXT: ; def a0191; CHECK-NEXT: ;;#ASMEND192; CHECK-NEXT: v_accvgpr_read_b32 v3, a0193; CHECK-NEXT: ;;#ASMSTART194; CHECK-NEXT: ; def v2195; CHECK-NEXT: ;;#ASMEND196; CHECK-NEXT: buffer_wbl2197; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc198; CHECK-NEXT: s_waitcnt vmcnt(0)199; CHECK-NEXT: buffer_invl2200; CHECK-NEXT: buffer_wbinvl1_vol201; CHECK-NEXT: ;;#ASMSTART202; CHECK-NEXT: ; use v0203; CHECK-NEXT: ;;#ASMEND204; CHECK-NEXT: s_setpc_b64 s[30:31]205 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10206 %data0 = call i32 asm "; def $0", "=a"()207 %data1 = call i32 asm "; def $0", "=v"()208 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic209 %result = extractvalue { i32, i1 } %pair, 0210 call void asm "; use $0", "v"(i32 %result)211 ret void212}213 214define void @global_atomic_cmpxchg_i32_ret_v_v__a(ptr addrspace(1) %ptr) #0 {215; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_v_v__a:216; CHECK: ; %bb.0:217; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)218; CHECK-NEXT: ;;#ASMSTART219; CHECK-NEXT: ; def v3220; CHECK-NEXT: ;;#ASMEND221; CHECK-NEXT: ;;#ASMSTART222; CHECK-NEXT: ; def v2223; CHECK-NEXT: ;;#ASMEND224; CHECK-NEXT: buffer_wbl2225; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc226; CHECK-NEXT: s_waitcnt vmcnt(0)227; CHECK-NEXT: buffer_invl2228; CHECK-NEXT: buffer_wbinvl1_vol229; CHECK-NEXT: v_accvgpr_write_b32 a0, v0230; CHECK-NEXT: ;;#ASMSTART231; CHECK-NEXT: ; use a0232; CHECK-NEXT: ;;#ASMEND233; CHECK-NEXT: s_setpc_b64 s[30:31]234 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10235 %data0 = call i32 asm "; def $0", "=v"()236 %data1 = call i32 asm "; def $0", "=v"()237 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic238 %result = extractvalue { i32, i1 } %pair, 0239 call void asm "; use $0", "a"(i32 %result)240 ret void241}242 243define void @global_atomic_cmpxchg_i32_ret_av_v__av(ptr addrspace(1) %ptr) #0 {244; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_av_v__av:245; CHECK: ; %bb.0:246; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)247; CHECK-NEXT: ;;#ASMSTART248; CHECK-NEXT: ; def v3249; CHECK-NEXT: ;;#ASMEND250; CHECK-NEXT: ;;#ASMSTART251; CHECK-NEXT: ; def v2252; CHECK-NEXT: ;;#ASMEND253; CHECK-NEXT: buffer_wbl2254; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc255; CHECK-NEXT: s_waitcnt vmcnt(0)256; CHECK-NEXT: buffer_invl2257; CHECK-NEXT: buffer_wbinvl1_vol258; CHECK-NEXT: ;;#ASMSTART259; CHECK-NEXT: ; use v0260; CHECK-NEXT: ;;#ASMEND261; CHECK-NEXT: s_setpc_b64 s[30:31]262 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10263 %data0 = call i32 asm "; def $0", "=^VA"()264 %data1 = call i32 asm "; def $0", "=v"()265 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic266 %result = extractvalue { i32, i1 } %pair, 0267 call void asm "; use $0", "^VA"(i32 %result)268 ret void269}270 271define void @global_atomic_cmpxchg_i32_ret_v_av__av(ptr addrspace(1) %ptr) #0 {272; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_v_av__av:273; CHECK: ; %bb.0:274; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)275; CHECK-NEXT: ;;#ASMSTART276; CHECK-NEXT: ; def v3277; CHECK-NEXT: ;;#ASMEND278; CHECK-NEXT: ;;#ASMSTART279; CHECK-NEXT: ; def v2280; CHECK-NEXT: ;;#ASMEND281; CHECK-NEXT: buffer_wbl2282; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc283; CHECK-NEXT: s_waitcnt vmcnt(0)284; CHECK-NEXT: buffer_invl2285; CHECK-NEXT: buffer_wbinvl1_vol286; CHECK-NEXT: ;;#ASMSTART287; CHECK-NEXT: ; use v0288; CHECK-NEXT: ;;#ASMEND289; CHECK-NEXT: s_setpc_b64 s[30:31]290 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10291 %data0 = call i32 asm "; def $0", "=v"()292 %data1 = call i32 asm "; def $0", "=^VA"()293 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic294 %result = extractvalue { i32, i1 } %pair, 0295 call void asm "; use $0", "^VA"(i32 %result)296 ret void297}298 299define void @global_atomic_cmpxchg_i32_ret_av_a__av(ptr addrspace(1) %ptr) #0 {300; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_av_a__av:301; CHECK: ; %bb.0:302; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)303; CHECK-NEXT: ;;#ASMSTART304; CHECK-NEXT: ; def a1305; CHECK-NEXT: ;;#ASMEND306; CHECK-NEXT: ;;#ASMSTART307; CHECK-NEXT: ; def a0308; CHECK-NEXT: ;;#ASMEND309; CHECK-NEXT: v_accvgpr_read_b32 v3, a1310; CHECK-NEXT: v_accvgpr_read_b32 v2, a0311; CHECK-NEXT: buffer_wbl2312; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc313; CHECK-NEXT: s_waitcnt vmcnt(0)314; CHECK-NEXT: buffer_invl2315; CHECK-NEXT: buffer_wbinvl1_vol316; CHECK-NEXT: ;;#ASMSTART317; CHECK-NEXT: ; use v0318; CHECK-NEXT: ;;#ASMEND319; CHECK-NEXT: s_setpc_b64 s[30:31]320 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10321 %data0 = call i32 asm "; def $0", "=^VA"()322 %data1 = call i32 asm "; def $0", "=a"()323 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic324 %result = extractvalue { i32, i1 } %pair, 0325 call void asm "; use $0", "^VA"(i32 %result)326 ret void327}328 329define void @global_atomic_cmpxchg_i32_ret_a_av__av(ptr addrspace(1) %ptr) #0 {330; CHECK-LABEL: global_atomic_cmpxchg_i32_ret_a_av__av:331; CHECK: ; %bb.0:332; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)333; CHECK-NEXT: ;;#ASMSTART334; CHECK-NEXT: ; def a1335; CHECK-NEXT: ;;#ASMEND336; CHECK-NEXT: ;;#ASMSTART337; CHECK-NEXT: ; def a0338; CHECK-NEXT: ;;#ASMEND339; CHECK-NEXT: v_accvgpr_read_b32 v3, a1340; CHECK-NEXT: v_accvgpr_read_b32 v2, a0341; CHECK-NEXT: buffer_wbl2342; CHECK-NEXT: global_atomic_cmpswap v0, v[0:1], v[2:3], off offset:40 glc343; CHECK-NEXT: s_waitcnt vmcnt(0)344; CHECK-NEXT: buffer_invl2345; CHECK-NEXT: buffer_wbinvl1_vol346; CHECK-NEXT: ;;#ASMSTART347; CHECK-NEXT: ; use v0348; CHECK-NEXT: ;;#ASMEND349; CHECK-NEXT: s_setpc_b64 s[30:31]350 %gep.0 = getelementptr inbounds [512 x i32], ptr addrspace(1) %ptr, i64 0, i64 10351 %data0 = call i32 asm "; def $0", "=a"()352 %data1 = call i32 asm "; def $0", "=^VA"()353 %pair = cmpxchg ptr addrspace(1) %gep.0, i32 %data0, i32 %data1 seq_cst monotonic354 %result = extractvalue { i32, i1 } %pair, 0355 call void asm "; use $0", "^VA"(i32 %result)356 ret void357}358 359;---------------------------------------------------------------------360; i64 cases361;---------------------------------------------------------------------362 363define void @global_atomic_cmpxchg_i64_ret_av_av__av(ptr addrspace(1) %ptr) #0 {364; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_av_av__av:365; CHECK: ; %bb.0:366; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)367; CHECK-NEXT: ;;#ASMSTART368; CHECK-NEXT: ; def v[4:5]369; CHECK-NEXT: ;;#ASMEND370; CHECK-NEXT: ;;#ASMSTART371; CHECK-NEXT: ; def v[2:3]372; CHECK-NEXT: ;;#ASMEND373; CHECK-NEXT: buffer_wbl2374; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc375; CHECK-NEXT: s_waitcnt vmcnt(0)376; CHECK-NEXT: buffer_invl2377; CHECK-NEXT: buffer_wbinvl1_vol378; CHECK-NEXT: ;;#ASMSTART379; CHECK-NEXT: ; use v[0:1]380; CHECK-NEXT: ;;#ASMEND381; CHECK-NEXT: s_setpc_b64 s[30:31]382 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10383 %data0 = call i64 asm "; def $0", "=^VA"()384 %data1 = call i64 asm "; def $0", "=^VA"()385 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic386 %result = extractvalue { i64, i1 } %pair, 0387 call void asm "; use $0", "^VA"(i64 %result)388 ret void389}390 391define void @global_atomic_cmpxchg_i64_ret_av_av__v(ptr addrspace(1) %ptr) #0 {392; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_av_av__v:393; CHECK: ; %bb.0:394; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)395; CHECK-NEXT: ;;#ASMSTART396; CHECK-NEXT: ; def v[4:5]397; CHECK-NEXT: ;;#ASMEND398; CHECK-NEXT: ;;#ASMSTART399; CHECK-NEXT: ; def v[2:3]400; CHECK-NEXT: ;;#ASMEND401; CHECK-NEXT: buffer_wbl2402; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc403; CHECK-NEXT: s_waitcnt vmcnt(0)404; CHECK-NEXT: buffer_invl2405; CHECK-NEXT: buffer_wbinvl1_vol406; CHECK-NEXT: ;;#ASMSTART407; CHECK-NEXT: ; use v[0:1]408; CHECK-NEXT: ;;#ASMEND409; CHECK-NEXT: s_setpc_b64 s[30:31]410 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10411 %data0 = call i64 asm "; def $0", "=^VA"()412 %data1 = call i64 asm "; def $0", "=^VA"()413 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic414 %result = extractvalue { i64, i1 } %pair, 0415 call void asm "; use $0", "v"(i64 %result)416 ret void417}418 419define void @global_atomic_cmpxchg_i64_ret_av_av__a(ptr addrspace(1) %ptr) #0 {420; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_av_av__a:421; CHECK: ; %bb.0:422; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)423; CHECK-NEXT: ;;#ASMSTART424; CHECK-NEXT: ; def v[4:5]425; CHECK-NEXT: ;;#ASMEND426; CHECK-NEXT: ;;#ASMSTART427; CHECK-NEXT: ; def v[2:3]428; CHECK-NEXT: ;;#ASMEND429; CHECK-NEXT: buffer_wbl2430; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc431; CHECK-NEXT: s_waitcnt vmcnt(0)432; CHECK-NEXT: buffer_invl2433; CHECK-NEXT: buffer_wbinvl1_vol434; CHECK-NEXT: v_accvgpr_write_b32 a0, v0435; CHECK-NEXT: v_accvgpr_write_b32 a1, v1436; CHECK-NEXT: ;;#ASMSTART437; CHECK-NEXT: ; use a[0:1]438; CHECK-NEXT: ;;#ASMEND439; CHECK-NEXT: s_setpc_b64 s[30:31]440 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10441 %data0 = call i64 asm "; def $0", "=^VA"()442 %data1 = call i64 asm "; def $0", "=^VA"()443 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic444 %result = extractvalue { i64, i1 } %pair, 0445 call void asm "; use $0", "a"(i64 %result)446 ret void447}448 449define void @global_atomic_cmpxchg_i64_ret_a_a__a(ptr addrspace(1) %ptr) #0 {450; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_a_a__a:451; CHECK: ; %bb.0:452; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)453; CHECK-NEXT: ;;#ASMSTART454; CHECK-NEXT: ; def a[0:1]455; CHECK-NEXT: ;;#ASMEND456; CHECK-NEXT: ;;#ASMSTART457; CHECK-NEXT: ; def a[2:3]458; CHECK-NEXT: ;;#ASMEND459; CHECK-NEXT: v_accvgpr_read_b32 v2, a2460; CHECK-NEXT: v_accvgpr_read_b32 v3, a3461; CHECK-NEXT: v_accvgpr_read_b32 v4, a0462; CHECK-NEXT: v_accvgpr_read_b32 v5, a1463; CHECK-NEXT: buffer_wbl2464; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc465; CHECK-NEXT: s_waitcnt vmcnt(0)466; CHECK-NEXT: buffer_invl2467; CHECK-NEXT: buffer_wbinvl1_vol468; CHECK-NEXT: v_accvgpr_write_b32 a0, v0469; CHECK-NEXT: v_accvgpr_write_b32 a1, v1470; CHECK-NEXT: ;;#ASMSTART471; CHECK-NEXT: ; use a[0:1]472; CHECK-NEXT: ;;#ASMEND473; CHECK-NEXT: s_setpc_b64 s[30:31]474 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10475 %data0 = call i64 asm "; def $0", "=a"()476 %data1 = call i64 asm "; def $0", "=a"()477 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic478 %result = extractvalue { i64, i1 } %pair, 0479 call void asm "; use $0", "a"(i64 %result)480 ret void481}482 483define void @global_atomic_cmpxchg_i64_ret_a_a__v(ptr addrspace(1) %ptr) #0 {484; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_a_a__v:485; CHECK: ; %bb.0:486; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)487; CHECK-NEXT: ;;#ASMSTART488; CHECK-NEXT: ; def a[0:1]489; CHECK-NEXT: ;;#ASMEND490; CHECK-NEXT: ;;#ASMSTART491; CHECK-NEXT: ; def a[2:3]492; CHECK-NEXT: ;;#ASMEND493; CHECK-NEXT: v_accvgpr_read_b32 v2, a2494; CHECK-NEXT: v_accvgpr_read_b32 v3, a3495; CHECK-NEXT: v_accvgpr_read_b32 v4, a0496; CHECK-NEXT: v_accvgpr_read_b32 v5, a1497; CHECK-NEXT: buffer_wbl2498; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc499; CHECK-NEXT: s_waitcnt vmcnt(0)500; CHECK-NEXT: buffer_invl2501; CHECK-NEXT: buffer_wbinvl1_vol502; CHECK-NEXT: ;;#ASMSTART503; CHECK-NEXT: ; use v[0:1]504; CHECK-NEXT: ;;#ASMEND505; CHECK-NEXT: s_setpc_b64 s[30:31]506 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10507 %data0 = call i64 asm "; def $0", "=a"()508 %data1 = call i64 asm "; def $0", "=a"()509 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic510 %result = extractvalue { i64, i1 } %pair, 0511 call void asm "; use $0", "v"(i64 %result)512 ret void513}514 515define void @global_atomic_cmpxchg_i64_ret_v_a__v(ptr addrspace(1) %ptr) #0 {516; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_v_a__v:517; CHECK: ; %bb.0:518; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)519; CHECK-NEXT: ;;#ASMSTART520; CHECK-NEXT: ; def a[0:1]521; CHECK-NEXT: ;;#ASMEND522; CHECK-NEXT: v_accvgpr_read_b32 v2, a0523; CHECK-NEXT: v_accvgpr_read_b32 v3, a1524; CHECK-NEXT: ;;#ASMSTART525; CHECK-NEXT: ; def v[4:5]526; CHECK-NEXT: ;;#ASMEND527; CHECK-NEXT: buffer_wbl2528; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc529; CHECK-NEXT: s_waitcnt vmcnt(0)530; CHECK-NEXT: buffer_invl2531; CHECK-NEXT: buffer_wbinvl1_vol532; CHECK-NEXT: ;;#ASMSTART533; CHECK-NEXT: ; use v[0:1]534; CHECK-NEXT: ;;#ASMEND535; CHECK-NEXT: s_setpc_b64 s[30:31]536 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10537 %data0 = call i64 asm "; def $0", "=v"()538 %data1 = call i64 asm "; def $0", "=a"()539 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic540 %result = extractvalue { i64, i1 } %pair, 0541 call void asm "; use $0", "v"(i64 %result)542 ret void543}544 545define void @global_atomic_cmpxchg_i64_ret_a_v__v(ptr addrspace(1) %ptr) #0 {546; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_a_v__v:547; CHECK: ; %bb.0:548; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)549; CHECK-NEXT: ;;#ASMSTART550; CHECK-NEXT: ; def a[0:1]551; CHECK-NEXT: ;;#ASMEND552; CHECK-NEXT: v_accvgpr_read_b32 v4, a0553; CHECK-NEXT: v_accvgpr_read_b32 v5, a1554; CHECK-NEXT: ;;#ASMSTART555; CHECK-NEXT: ; def v[2:3]556; CHECK-NEXT: ;;#ASMEND557; CHECK-NEXT: buffer_wbl2558; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc559; CHECK-NEXT: s_waitcnt vmcnt(0)560; CHECK-NEXT: buffer_invl2561; CHECK-NEXT: buffer_wbinvl1_vol562; CHECK-NEXT: ;;#ASMSTART563; CHECK-NEXT: ; use v[0:1]564; CHECK-NEXT: ;;#ASMEND565; CHECK-NEXT: s_setpc_b64 s[30:31]566 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10567 %data0 = call i64 asm "; def $0", "=a"()568 %data1 = call i64 asm "; def $0", "=v"()569 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic570 %result = extractvalue { i64, i1 } %pair, 0571 call void asm "; use $0", "v"(i64 %result)572 ret void573}574 575define void @global_atomic_cmpxchg_i64_ret_v_v__a(ptr addrspace(1) %ptr) #0 {576; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_v_v__a:577; CHECK: ; %bb.0:578; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)579; CHECK-NEXT: ;;#ASMSTART580; CHECK-NEXT: ; def v[4:5]581; CHECK-NEXT: ;;#ASMEND582; CHECK-NEXT: ;;#ASMSTART583; CHECK-NEXT: ; def v[2:3]584; CHECK-NEXT: ;;#ASMEND585; CHECK-NEXT: buffer_wbl2586; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc587; CHECK-NEXT: s_waitcnt vmcnt(0)588; CHECK-NEXT: buffer_invl2589; CHECK-NEXT: buffer_wbinvl1_vol590; CHECK-NEXT: v_accvgpr_write_b32 a0, v0591; CHECK-NEXT: v_accvgpr_write_b32 a1, v1592; CHECK-NEXT: ;;#ASMSTART593; CHECK-NEXT: ; use a[0:1]594; CHECK-NEXT: ;;#ASMEND595; CHECK-NEXT: s_setpc_b64 s[30:31]596 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10597 %data0 = call i64 asm "; def $0", "=v"()598 %data1 = call i64 asm "; def $0", "=v"()599 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic600 %result = extractvalue { i64, i1 } %pair, 0601 call void asm "; use $0", "a"(i64 %result)602 ret void603}604 605define void @global_atomic_cmpxchg_i64_ret_av_v__av(ptr addrspace(1) %ptr) #0 {606; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_av_v__av:607; CHECK: ; %bb.0:608; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)609; CHECK-NEXT: ;;#ASMSTART610; CHECK-NEXT: ; def v[4:5]611; CHECK-NEXT: ;;#ASMEND612; CHECK-NEXT: ;;#ASMSTART613; CHECK-NEXT: ; def v[2:3]614; CHECK-NEXT: ;;#ASMEND615; CHECK-NEXT: buffer_wbl2616; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc617; CHECK-NEXT: s_waitcnt vmcnt(0)618; CHECK-NEXT: buffer_invl2619; CHECK-NEXT: buffer_wbinvl1_vol620; CHECK-NEXT: ;;#ASMSTART621; CHECK-NEXT: ; use v[0:1]622; CHECK-NEXT: ;;#ASMEND623; CHECK-NEXT: s_setpc_b64 s[30:31]624 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10625 %data0 = call i64 asm "; def $0", "=^VA"()626 %data1 = call i64 asm "; def $0", "=v"()627 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic628 %result = extractvalue { i64, i1 } %pair, 0629 call void asm "; use $0", "^VA"(i64 %result)630 ret void631}632 633define void @global_atomic_cmpxchg_i64_ret_v_av__av(ptr addrspace(1) %ptr) #0 {634; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_v_av__av:635; CHECK: ; %bb.0:636; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)637; CHECK-NEXT: ;;#ASMSTART638; CHECK-NEXT: ; def v[4:5]639; CHECK-NEXT: ;;#ASMEND640; CHECK-NEXT: ;;#ASMSTART641; CHECK-NEXT: ; def v[2:3]642; CHECK-NEXT: ;;#ASMEND643; CHECK-NEXT: buffer_wbl2644; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc645; CHECK-NEXT: s_waitcnt vmcnt(0)646; CHECK-NEXT: buffer_invl2647; CHECK-NEXT: buffer_wbinvl1_vol648; CHECK-NEXT: ;;#ASMSTART649; CHECK-NEXT: ; use v[0:1]650; CHECK-NEXT: ;;#ASMEND651; CHECK-NEXT: s_setpc_b64 s[30:31]652 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10653 %data0 = call i64 asm "; def $0", "=v"()654 %data1 = call i64 asm "; def $0", "=^VA"()655 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic656 %result = extractvalue { i64, i1 } %pair, 0657 call void asm "; use $0", "^VA"(i64 %result)658 ret void659}660 661define void @global_atomic_cmpxchg_i64_ret_av_a__av(ptr addrspace(1) %ptr) #0 {662; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_av_a__av:663; CHECK: ; %bb.0:664; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)665; CHECK-NEXT: ;;#ASMSTART666; CHECK-NEXT: ; def a[0:1]667; CHECK-NEXT: ;;#ASMEND668; CHECK-NEXT: v_accvgpr_read_b32 v2, a0669; CHECK-NEXT: v_accvgpr_read_b32 v3, a1670; CHECK-NEXT: ;;#ASMSTART671; CHECK-NEXT: ; def v[4:5]672; CHECK-NEXT: ;;#ASMEND673; CHECK-NEXT: buffer_wbl2674; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc675; CHECK-NEXT: s_waitcnt vmcnt(0)676; CHECK-NEXT: buffer_invl2677; CHECK-NEXT: buffer_wbinvl1_vol678; CHECK-NEXT: ;;#ASMSTART679; CHECK-NEXT: ; use v[0:1]680; CHECK-NEXT: ;;#ASMEND681; CHECK-NEXT: s_setpc_b64 s[30:31]682 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10683 %data0 = call i64 asm "; def $0", "=^VA"()684 %data1 = call i64 asm "; def $0", "=a"()685 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic686 %result = extractvalue { i64, i1 } %pair, 0687 call void asm "; use $0", "^VA"(i64 %result)688 ret void689}690 691define void @global_atomic_cmpxchg_i64_ret_a_av__av(ptr addrspace(1) %ptr) #0 {692; CHECK-LABEL: global_atomic_cmpxchg_i64_ret_a_av__av:693; CHECK: ; %bb.0:694; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)695; CHECK-NEXT: ;;#ASMSTART696; CHECK-NEXT: ; def a[0:1]697; CHECK-NEXT: ;;#ASMEND698; CHECK-NEXT: v_accvgpr_read_b32 v4, a0699; CHECK-NEXT: v_accvgpr_read_b32 v5, a1700; CHECK-NEXT: ;;#ASMSTART701; CHECK-NEXT: ; def v[2:3]702; CHECK-NEXT: ;;#ASMEND703; CHECK-NEXT: buffer_wbl2704; CHECK-NEXT: global_atomic_cmpswap_x2 v[0:1], v[0:1], v[2:5], off offset:80 glc705; CHECK-NEXT: s_waitcnt vmcnt(0)706; CHECK-NEXT: buffer_invl2707; CHECK-NEXT: buffer_wbinvl1_vol708; CHECK-NEXT: ;;#ASMSTART709; CHECK-NEXT: ; use v[0:1]710; CHECK-NEXT: ;;#ASMEND711; CHECK-NEXT: s_setpc_b64 s[30:31]712 %gep.0 = getelementptr inbounds [512 x i64], ptr addrspace(1) %ptr, i64 0, i64 10713 %data0 = call i64 asm "; def $0", "=a"()714 %data1 = call i64 asm "; def $0", "=^VA"()715 %pair = cmpxchg ptr addrspace(1) %gep.0, i64 %data0, i64 %data1 seq_cst monotonic716 %result = extractvalue { i64, i1 } %pair, 0717 call void asm "; use $0", "^VA"(i64 %result)718 ret void719}720 721attributes #0 = { nounwind "amdgpu-waves-per-eu"="10,10" }722