1610 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX803 %s3; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX906 %s4; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx908 -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX908 %s5; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX90A %s6; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx942 -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX942 %s7; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX10 %s8; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX11 %s9; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -passes=atomic-expand %s | FileCheck -check-prefixes=COMMON,GFX12 %s10 11;---------------------------------------------------------------------12; atomicrmw xchg13;---------------------------------------------------------------------14 15; xchg is supported over PCIe, so no expansion is necessary16define i32 @test_atomicrmw_xchg_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {17; COMMON-LABEL: define i32 @test_atomicrmw_xchg_i32_global_agent(18; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0:[0-9]+]] {19; COMMON-NEXT: [[RES:%.*]] = atomicrmw xchg ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 420; COMMON-NEXT: ret i32 [[RES]]21;22 %res = atomicrmw xchg ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst23 ret i32 %res24}25 26; xchg is supported over PCIe, so no expansion is necessary. Metadata should be ignored.27define i32 @test_atomicrmw_xchg_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {28; COMMON-LABEL: define i32 @test_atomicrmw_xchg_i32_global_agent__amdgpu_no_fine_grained_memory(29; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {30; COMMON-NEXT: [[RES:%.*]] = atomicrmw xchg ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0:![0-9]+]]31; COMMON-NEXT: ret i32 [[RES]]32;33 %res = atomicrmw xchg ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !034 ret i32 %res35}36 37; xchg is supported over PCIe, so no expansion is necessary. Metadata should be ignored.38define i32 @test_atomicrmw_xchg_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {39; COMMON-LABEL: define i32 @test_atomicrmw_xchg_i32_global_agent__amdgpu_no_remote_memory(40; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {41; COMMON-NEXT: [[RES:%.*]] = atomicrmw xchg ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]42; COMMON-NEXT: ret i32 [[RES]]43;44 %res = atomicrmw xchg ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !045 ret i32 %res46}47 48; xchg is supported over PCIe, so no expansion is necessary. Metadata should be ignored.49define i32 @test_atomicrmw_xchg_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {50; COMMON-LABEL: define i32 @test_atomicrmw_xchg_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(51; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {52; COMMON-NEXT: [[RES:%.*]] = atomicrmw xchg ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]53; COMMON-NEXT: ret i32 [[RES]]54;55 %res = atomicrmw xchg ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !056 ret i32 %res57}58 59;---------------------------------------------------------------------60; atomicrmw add61;---------------------------------------------------------------------62 63; add is supported over PCIe, so no expansion is necessary64define i32 @test_atomicrmw_add_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {65; COMMON-LABEL: define i32 @test_atomicrmw_add_i32_global_agent(66; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {67; COMMON-NEXT: [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 468; COMMON-NEXT: ret i32 [[RES]]69;70 %res = atomicrmw add ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst71 ret i32 %res72}73 74; add is supported over PCIe, so no expansion is necessary. Metadata should be ignored.75define i32 @test_atomicrmw_add_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {76; COMMON-LABEL: define i32 @test_atomicrmw_add_i32_global_agent__amdgpu_no_fine_grained_memory(77; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {78; COMMON-NEXT: [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]79; COMMON-NEXT: ret i32 [[RES]]80;81 %res = atomicrmw add ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !082 ret i32 %res83}84 85; add is supported over PCIe, so no expansion is necessary. Metadata should be ignored.86define i32 @test_atomicrmw_add_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {87; COMMON-LABEL: define i32 @test_atomicrmw_add_i32_global_agent__amdgpu_no_remote_memory(88; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {89; COMMON-NEXT: [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]90; COMMON-NEXT: ret i32 [[RES]]91;92 %res = atomicrmw add ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !093 ret i32 %res94}95 96; add is supported over PCIe, so no expansion is necessary. Metadata should be ignored.97define i32 @test_atomicrmw_add_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {98; COMMON-LABEL: define i32 @test_atomicrmw_add_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(99; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {100; COMMON-NEXT: [[RES:%.*]] = atomicrmw add ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]101; COMMON-NEXT: ret i32 [[RES]]102;103 %res = atomicrmw add ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0104 ret i32 %res105}106 107;---------------------------------------------------------------------108; atomicrmw sub109;---------------------------------------------------------------------110 111; expansion is necessary, sub is not supported over PCIe112define i32 @test_atomicrmw_sub_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {113; GFX803-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(114; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {115; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4116; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]117; GFX803: atomicrmw.start:118; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]119; GFX803-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALUE]]120; GFX803-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4121; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1122; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0123; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]124; GFX803: atomicrmw.end:125; GFX803-NEXT: ret i32 [[NEWLOADED]]126;127; GFX906-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(128; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {129; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4130; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]131; GFX906: atomicrmw.start:132; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]133; GFX906-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALUE]]134; GFX906-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4135; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1136; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0137; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]138; GFX906: atomicrmw.end:139; GFX906-NEXT: ret i32 [[NEWLOADED]]140;141; GFX908-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(142; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {143; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4144; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]145; GFX908: atomicrmw.start:146; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]147; GFX908-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALUE]]148; GFX908-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4149; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1150; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0151; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]152; GFX908: atomicrmw.end:153; GFX908-NEXT: ret i32 [[NEWLOADED]]154;155; GFX90A-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(156; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {157; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4158; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]159; GFX90A: atomicrmw.start:160; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]161; GFX90A-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALUE]]162; GFX90A-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4163; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1164; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0165; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]166; GFX90A: atomicrmw.end:167; GFX90A-NEXT: ret i32 [[NEWLOADED]]168;169; GFX940-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(170; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {171; GFX940-NEXT: [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4172; GFX940-NEXT: ret i32 [[RES]]173;174; GFX10-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(175; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {176; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4177; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]178; GFX10: atomicrmw.start:179; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]180; GFX10-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALUE]]181; GFX10-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4182; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1183; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0184; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]185; GFX10: atomicrmw.end:186; GFX10-NEXT: ret i32 [[NEWLOADED]]187;188; GFX11-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(189; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {190; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4191; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]192; GFX11: atomicrmw.start:193; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]194; GFX11-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALUE]]195; GFX11-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4196; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1197; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0198; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]199; GFX11: atomicrmw.end:200; GFX11-NEXT: ret i32 [[NEWLOADED]]201;202; GFX12-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent(203; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {204; GFX12-NEXT: [[RES:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4205; GFX12-NEXT: ret i32 [[RES]]206;207 %res = atomicrmw sub ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst208 ret i32 %res209}210 211define i32 @test_atomicrmw_sub_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {212; COMMON-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent__amdgpu_no_fine_grained_memory(213; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {214; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]215; COMMON-NEXT: ret i32 [[NEWLOADED]]216;217 %res = atomicrmw sub ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0218 ret i32 %res219}220 221define i32 @test_atomicrmw_sub_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {222; COMMON-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent__amdgpu_no_remote_memory(223; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {224; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]225; COMMON-NEXT: ret i32 [[NEWLOADED]]226;227 %res = atomicrmw sub ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0228 ret i32 %res229}230 231define i32 @test_atomicrmw_sub_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {232; COMMON-LABEL: define i32 @test_atomicrmw_sub_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(233; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {234; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw sub ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]235; COMMON-NEXT: ret i32 [[NEWLOADED]]236;237 %res = atomicrmw sub ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0238 ret i32 %res239}240 241;---------------------------------------------------------------------242; atomicrmw and243;---------------------------------------------------------------------244 245; expansion is necessary, operation not supported over PCIe246define i32 @test_atomicrmw_and_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {247; GFX803-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(248; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {249; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4250; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]251; GFX803: atomicrmw.start:252; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]253; GFX803-NEXT: [[NEW:%.*]] = and i32 [[LOADED]], [[VALUE]]254; GFX803-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4255; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1256; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0257; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]258; GFX803: atomicrmw.end:259; GFX803-NEXT: ret i32 [[NEWLOADED]]260;261; GFX906-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(262; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {263; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4264; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]265; GFX906: atomicrmw.start:266; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]267; GFX906-NEXT: [[NEW:%.*]] = and i32 [[LOADED]], [[VALUE]]268; GFX906-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4269; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1270; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0271; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]272; GFX906: atomicrmw.end:273; GFX906-NEXT: ret i32 [[NEWLOADED]]274;275; GFX908-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(276; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {277; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4278; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]279; GFX908: atomicrmw.start:280; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]281; GFX908-NEXT: [[NEW:%.*]] = and i32 [[LOADED]], [[VALUE]]282; GFX908-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4283; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1284; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0285; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]286; GFX908: atomicrmw.end:287; GFX908-NEXT: ret i32 [[NEWLOADED]]288;289; GFX90A-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(290; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {291; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4292; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]293; GFX90A: atomicrmw.start:294; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]295; GFX90A-NEXT: [[NEW:%.*]] = and i32 [[LOADED]], [[VALUE]]296; GFX90A-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4297; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1298; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0299; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]300; GFX90A: atomicrmw.end:301; GFX90A-NEXT: ret i32 [[NEWLOADED]]302;303; GFX940-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(304; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {305; GFX940-NEXT: [[RES:%.*]] = atomicrmw and ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4306; GFX940-NEXT: ret i32 [[RES]]307;308; GFX10-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(309; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {310; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4311; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]312; GFX10: atomicrmw.start:313; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]314; GFX10-NEXT: [[NEW:%.*]] = and i32 [[LOADED]], [[VALUE]]315; GFX10-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4316; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1317; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0318; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]319; GFX10: atomicrmw.end:320; GFX10-NEXT: ret i32 [[NEWLOADED]]321;322; GFX11-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(323; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {324; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4325; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]326; GFX11: atomicrmw.start:327; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]328; GFX11-NEXT: [[NEW:%.*]] = and i32 [[LOADED]], [[VALUE]]329; GFX11-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4330; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1331; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0332; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]333; GFX11: atomicrmw.end:334; GFX11-NEXT: ret i32 [[NEWLOADED]]335;336; GFX12-LABEL: define i32 @test_atomicrmw_and_i32_global_agent(337; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {338; GFX12-NEXT: [[RES:%.*]] = atomicrmw and ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4339; GFX12-NEXT: ret i32 [[RES]]340;341 %res = atomicrmw and ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst342 ret i32 %res343}344 345define i32 @test_atomicrmw_and_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {346; COMMON-LABEL: define i32 @test_atomicrmw_and_i32_global_agent__amdgpu_no_fine_grained_memory(347; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {348; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw and ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]349; COMMON-NEXT: ret i32 [[NEWLOADED]]350;351 %res = atomicrmw and ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0352 ret i32 %res353}354 355define i32 @test_atomicrmw_and_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {356; COMMON-LABEL: define i32 @test_atomicrmw_and_i32_global_agent__amdgpu_no_remote_memory(357; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {358; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw and ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]359; COMMON-NEXT: ret i32 [[NEWLOADED]]360;361 %res = atomicrmw and ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0362 ret i32 %res363}364 365define i32 @test_atomicrmw_and_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {366; COMMON-LABEL: define i32 @test_atomicrmw_and_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(367; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {368; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw and ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]369; COMMON-NEXT: ret i32 [[NEWLOADED]]370;371 %res = atomicrmw and ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0372 ret i32 %res373}374 375;---------------------------------------------------------------------376; atomicrmw nand377;---------------------------------------------------------------------378 379; expansion is necessary, operation not supported380define i32 @test_atomicrmw_nand_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {381; COMMON-LABEL: define i32 @test_atomicrmw_nand_i32_global_agent(382; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {383; COMMON-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4384; COMMON-NEXT: br label [[ATOMICRMW_START:%.*]]385; COMMON: atomicrmw.start:386; COMMON-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]387; COMMON-NEXT: [[TMP2:%.*]] = and i32 [[LOADED]], [[VALUE]]388; COMMON-NEXT: [[NEW:%.*]] = xor i32 [[TMP2]], -1389; COMMON-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4390; COMMON-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1391; COMMON-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0392; COMMON-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]393; COMMON: atomicrmw.end:394; COMMON-NEXT: ret i32 [[NEWLOADED]]395;396 %res = atomicrmw nand ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst397 ret i32 %res398}399 400define i32 @test_atomicrmw_nand_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {401; COMMON-LABEL: define i32 @test_atomicrmw_nand_i32_global_agent__amdgpu_no_fine_grained_memory(402; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {403; COMMON-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4404; COMMON-NEXT: br label [[ATOMICRMW_START:%.*]]405; COMMON: atomicrmw.start:406; COMMON-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]407; COMMON-NEXT: [[TMP2:%.*]] = and i32 [[LOADED]], [[VALUE]]408; COMMON-NEXT: [[NEW:%.*]] = xor i32 [[TMP2]], -1409; COMMON-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]410; COMMON-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1411; COMMON-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0412; COMMON-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]413; COMMON: atomicrmw.end:414; COMMON-NEXT: ret i32 [[NEWLOADED]]415;416 %res = atomicrmw nand ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0417 ret i32 %res418}419 420define i32 @test_atomicrmw_nand_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {421; COMMON-LABEL: define i32 @test_atomicrmw_nand_i32_global_agent__amdgpu_no_remote_memory(422; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {423; COMMON-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4424; COMMON-NEXT: br label [[ATOMICRMW_START:%.*]]425; COMMON: atomicrmw.start:426; COMMON-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]427; COMMON-NEXT: [[TMP2:%.*]] = and i32 [[LOADED]], [[VALUE]]428; COMMON-NEXT: [[NEW:%.*]] = xor i32 [[TMP2]], -1429; COMMON-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]430; COMMON-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1431; COMMON-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0432; COMMON-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]433; COMMON: atomicrmw.end:434; COMMON-NEXT: ret i32 [[NEWLOADED]]435;436 %res = atomicrmw nand ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0437 ret i32 %res438}439 440define i32 @test_atomicrmw_nand_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {441; COMMON-LABEL: define i32 @test_atomicrmw_nand_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(442; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {443; COMMON-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4444; COMMON-NEXT: br label [[ATOMICRMW_START:%.*]]445; COMMON: atomicrmw.start:446; COMMON-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]447; COMMON-NEXT: [[TMP2:%.*]] = and i32 [[LOADED]], [[VALUE]]448; COMMON-NEXT: [[NEW:%.*]] = xor i32 [[TMP2]], -1449; COMMON-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]450; COMMON-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1451; COMMON-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0452; COMMON-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]453; COMMON: atomicrmw.end:454; COMMON-NEXT: ret i32 [[NEWLOADED]]455;456 %res = atomicrmw nand ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0457 ret i32 %res458}459 460;---------------------------------------------------------------------461; atomicrmw or462;---------------------------------------------------------------------463 464; expansion is necessary, operation not supported over PCIe465define i32 @test_atomicrmw_or_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {466; GFX803-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(467; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {468; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4469; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]470; GFX803: atomicrmw.start:471; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]472; GFX803-NEXT: [[NEW:%.*]] = or i32 [[LOADED]], [[VALUE]]473; GFX803-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4474; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1475; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0476; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]477; GFX803: atomicrmw.end:478; GFX803-NEXT: ret i32 [[NEWLOADED]]479;480; GFX906-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(481; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {482; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4483; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]484; GFX906: atomicrmw.start:485; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]486; GFX906-NEXT: [[NEW:%.*]] = or i32 [[LOADED]], [[VALUE]]487; GFX906-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4488; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1489; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0490; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]491; GFX906: atomicrmw.end:492; GFX906-NEXT: ret i32 [[NEWLOADED]]493;494; GFX908-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(495; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {496; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4497; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]498; GFX908: atomicrmw.start:499; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]500; GFX908-NEXT: [[NEW:%.*]] = or i32 [[LOADED]], [[VALUE]]501; GFX908-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4502; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1503; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0504; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]505; GFX908: atomicrmw.end:506; GFX908-NEXT: ret i32 [[NEWLOADED]]507;508; GFX90A-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(509; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {510; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4511; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]512; GFX90A: atomicrmw.start:513; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]514; GFX90A-NEXT: [[NEW:%.*]] = or i32 [[LOADED]], [[VALUE]]515; GFX90A-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4516; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1517; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0518; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]519; GFX90A: atomicrmw.end:520; GFX90A-NEXT: ret i32 [[NEWLOADED]]521;522; GFX940-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(523; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {524; GFX940-NEXT: [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4525; GFX940-NEXT: ret i32 [[RES]]526;527; GFX10-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(528; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {529; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4530; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]531; GFX10: atomicrmw.start:532; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]533; GFX10-NEXT: [[NEW:%.*]] = or i32 [[LOADED]], [[VALUE]]534; GFX10-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4535; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1536; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0537; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]538; GFX10: atomicrmw.end:539; GFX10-NEXT: ret i32 [[NEWLOADED]]540;541; GFX11-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(542; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {543; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4544; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]545; GFX11: atomicrmw.start:546; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]547; GFX11-NEXT: [[NEW:%.*]] = or i32 [[LOADED]], [[VALUE]]548; GFX11-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4549; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1550; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0551; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]552; GFX11: atomicrmw.end:553; GFX11-NEXT: ret i32 [[NEWLOADED]]554;555; GFX12-LABEL: define i32 @test_atomicrmw_or_i32_global_agent(556; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {557; GFX12-NEXT: [[RES:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4558; GFX12-NEXT: ret i32 [[RES]]559;560 %res = atomicrmw or ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst561 ret i32 %res562}563 564define i32 @test_atomicrmw_or_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {565; COMMON-LABEL: define i32 @test_atomicrmw_or_i32_global_agent__amdgpu_no_fine_grained_memory(566; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {567; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]568; COMMON-NEXT: ret i32 [[NEWLOADED]]569;570 %res = atomicrmw or ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0571 ret i32 %res572}573 574define i32 @test_atomicrmw_or_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {575; COMMON-LABEL: define i32 @test_atomicrmw_or_i32_global_agent__amdgpu_no_remote_memory(576; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {577; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]578; COMMON-NEXT: ret i32 [[NEWLOADED]]579;580 %res = atomicrmw or ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0581 ret i32 %res582}583 584define i32 @test_atomicrmw_or_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {585; COMMON-LABEL: define i32 @test_atomicrmw_or_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(586; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {587; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw or ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]588; COMMON-NEXT: ret i32 [[NEWLOADED]]589;590 %res = atomicrmw or ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0591 ret i32 %res592}593 594;---------------------------------------------------------------------595; atomicrmw xor596;---------------------------------------------------------------------597 598; expansion is necessary, operation not supported over PCIe599define i32 @test_atomicrmw_xor_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {600; GFX803-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(601; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {602; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4603; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]604; GFX803: atomicrmw.start:605; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]606; GFX803-NEXT: [[NEW:%.*]] = xor i32 [[LOADED]], [[VALUE]]607; GFX803-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4608; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1609; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0610; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]611; GFX803: atomicrmw.end:612; GFX803-NEXT: ret i32 [[NEWLOADED]]613;614; GFX906-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(615; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {616; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4617; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]618; GFX906: atomicrmw.start:619; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]620; GFX906-NEXT: [[NEW:%.*]] = xor i32 [[LOADED]], [[VALUE]]621; GFX906-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4622; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1623; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0624; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]625; GFX906: atomicrmw.end:626; GFX906-NEXT: ret i32 [[NEWLOADED]]627;628; GFX908-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(629; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {630; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4631; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]632; GFX908: atomicrmw.start:633; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]634; GFX908-NEXT: [[NEW:%.*]] = xor i32 [[LOADED]], [[VALUE]]635; GFX908-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4636; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1637; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0638; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]639; GFX908: atomicrmw.end:640; GFX908-NEXT: ret i32 [[NEWLOADED]]641;642; GFX90A-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(643; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {644; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4645; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]646; GFX90A: atomicrmw.start:647; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]648; GFX90A-NEXT: [[NEW:%.*]] = xor i32 [[LOADED]], [[VALUE]]649; GFX90A-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4650; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1651; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0652; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]653; GFX90A: atomicrmw.end:654; GFX90A-NEXT: ret i32 [[NEWLOADED]]655;656; GFX940-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(657; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {658; GFX940-NEXT: [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4659; GFX940-NEXT: ret i32 [[RES]]660;661; GFX10-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(662; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {663; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4664; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]665; GFX10: atomicrmw.start:666; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]667; GFX10-NEXT: [[NEW:%.*]] = xor i32 [[LOADED]], [[VALUE]]668; GFX10-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4669; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1670; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0671; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]672; GFX10: atomicrmw.end:673; GFX10-NEXT: ret i32 [[NEWLOADED]]674;675; GFX11-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(676; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {677; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4678; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]679; GFX11: atomicrmw.start:680; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]681; GFX11-NEXT: [[NEW:%.*]] = xor i32 [[LOADED]], [[VALUE]]682; GFX11-NEXT: [[TMP2:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4683; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1684; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP2]], 0685; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]686; GFX11: atomicrmw.end:687; GFX11-NEXT: ret i32 [[NEWLOADED]]688;689; GFX12-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent(690; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {691; GFX12-NEXT: [[RES:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4692; GFX12-NEXT: ret i32 [[RES]]693;694 %res = atomicrmw xor ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst695 ret i32 %res696}697 698define i32 @test_atomicrmw_xor_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {699; COMMON-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent__amdgpu_no_fine_grained_memory(700; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {701; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]702; COMMON-NEXT: ret i32 [[NEWLOADED]]703;704 %res = atomicrmw xor ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0705 ret i32 %res706}707 708define i32 @test_atomicrmw_xor_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {709; COMMON-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent__amdgpu_no_remote_memory(710; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {711; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]712; COMMON-NEXT: ret i32 [[NEWLOADED]]713;714 %res = atomicrmw xor ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0715 ret i32 %res716}717 718define i32 @test_atomicrmw_xor_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {719; COMMON-LABEL: define i32 @test_atomicrmw_xor_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(720; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {721; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw xor ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]722; COMMON-NEXT: ret i32 [[NEWLOADED]]723;724 %res = atomicrmw xor ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0725 ret i32 %res726}727 728;---------------------------------------------------------------------729; atomicrmw max730;---------------------------------------------------------------------731 732; expansion is necessary, operation not supported over PCIe733define i32 @test_atomicrmw_max_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {734; GFX803-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(735; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {736; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4737; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]738; GFX803: atomicrmw.start:739; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]740; GFX803-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[LOADED]], [[VALUE]]741; GFX803-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]742; GFX803-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4743; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1744; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0745; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]746; GFX803: atomicrmw.end:747; GFX803-NEXT: ret i32 [[NEWLOADED]]748;749; GFX906-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(750; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {751; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4752; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]753; GFX906: atomicrmw.start:754; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]755; GFX906-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[LOADED]], [[VALUE]]756; GFX906-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]757; GFX906-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4758; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1759; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0760; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]761; GFX906: atomicrmw.end:762; GFX906-NEXT: ret i32 [[NEWLOADED]]763;764; GFX908-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(765; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {766; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4767; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]768; GFX908: atomicrmw.start:769; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]770; GFX908-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[LOADED]], [[VALUE]]771; GFX908-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]772; GFX908-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4773; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1774; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0775; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]776; GFX908: atomicrmw.end:777; GFX908-NEXT: ret i32 [[NEWLOADED]]778;779; GFX90A-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(780; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {781; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4782; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]783; GFX90A: atomicrmw.start:784; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]785; GFX90A-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[LOADED]], [[VALUE]]786; GFX90A-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]787; GFX90A-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4788; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1789; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0790; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]791; GFX90A: atomicrmw.end:792; GFX90A-NEXT: ret i32 [[NEWLOADED]]793;794; GFX940-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(795; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {796; GFX940-NEXT: [[RES:%.*]] = atomicrmw max ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4797; GFX940-NEXT: ret i32 [[RES]]798;799; GFX10-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(800; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {801; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4802; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]803; GFX10: atomicrmw.start:804; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]805; GFX10-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[LOADED]], [[VALUE]]806; GFX10-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]807; GFX10-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4808; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1809; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0810; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]811; GFX10: atomicrmw.end:812; GFX10-NEXT: ret i32 [[NEWLOADED]]813;814; GFX11-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(815; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {816; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4817; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]818; GFX11: atomicrmw.start:819; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]820; GFX11-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[LOADED]], [[VALUE]]821; GFX11-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]822; GFX11-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4823; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1824; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0825; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]826; GFX11: atomicrmw.end:827; GFX11-NEXT: ret i32 [[NEWLOADED]]828;829; GFX12-LABEL: define i32 @test_atomicrmw_max_i32_global_agent(830; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {831; GFX12-NEXT: [[RES:%.*]] = atomicrmw max ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4832; GFX12-NEXT: ret i32 [[RES]]833;834 %res = atomicrmw max ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst835 ret i32 %res836}837 838define i32 @test_atomicrmw_max_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {839; COMMON-LABEL: define i32 @test_atomicrmw_max_i32_global_agent__amdgpu_no_fine_grained_memory(840; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {841; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw max ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]842; COMMON-NEXT: ret i32 [[NEWLOADED]]843;844 %res = atomicrmw max ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0845 ret i32 %res846}847 848define i32 @test_atomicrmw_max_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {849; COMMON-LABEL: define i32 @test_atomicrmw_max_i32_global_agent__amdgpu_no_remote_memory(850; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {851; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw max ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]852; COMMON-NEXT: ret i32 [[NEWLOADED]]853;854 %res = atomicrmw max ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0855 ret i32 %res856}857 858define i32 @test_atomicrmw_max_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {859; COMMON-LABEL: define i32 @test_atomicrmw_max_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(860; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {861; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw max ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]862; COMMON-NEXT: ret i32 [[NEWLOADED]]863;864 %res = atomicrmw max ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !0865 ret i32 %res866}867 868;---------------------------------------------------------------------869; atomicrmw min870;---------------------------------------------------------------------871 872; expansion is necessary, operation not supported over PCIe873define i32 @test_atomicrmw_min_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {874; GFX803-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(875; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {876; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4877; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]878; GFX803: atomicrmw.start:879; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]880; GFX803-NEXT: [[TMP2:%.*]] = icmp sle i32 [[LOADED]], [[VALUE]]881; GFX803-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]882; GFX803-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4883; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1884; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0885; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]886; GFX803: atomicrmw.end:887; GFX803-NEXT: ret i32 [[NEWLOADED]]888;889; GFX906-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(890; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {891; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4892; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]893; GFX906: atomicrmw.start:894; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]895; GFX906-NEXT: [[TMP2:%.*]] = icmp sle i32 [[LOADED]], [[VALUE]]896; GFX906-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]897; GFX906-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4898; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1899; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0900; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]901; GFX906: atomicrmw.end:902; GFX906-NEXT: ret i32 [[NEWLOADED]]903;904; GFX908-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(905; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {906; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4907; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]908; GFX908: atomicrmw.start:909; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]910; GFX908-NEXT: [[TMP2:%.*]] = icmp sle i32 [[LOADED]], [[VALUE]]911; GFX908-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]912; GFX908-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4913; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1914; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0915; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]916; GFX908: atomicrmw.end:917; GFX908-NEXT: ret i32 [[NEWLOADED]]918;919; GFX90A-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(920; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {921; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4922; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]923; GFX90A: atomicrmw.start:924; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]925; GFX90A-NEXT: [[TMP2:%.*]] = icmp sle i32 [[LOADED]], [[VALUE]]926; GFX90A-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]927; GFX90A-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4928; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1929; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0930; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]931; GFX90A: atomicrmw.end:932; GFX90A-NEXT: ret i32 [[NEWLOADED]]933;934; GFX940-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(935; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {936; GFX940-NEXT: [[RES:%.*]] = atomicrmw min ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4937; GFX940-NEXT: ret i32 [[RES]]938;939; GFX10-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(940; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {941; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4942; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]943; GFX10: atomicrmw.start:944; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]945; GFX10-NEXT: [[TMP2:%.*]] = icmp sle i32 [[LOADED]], [[VALUE]]946; GFX10-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]947; GFX10-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4948; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1949; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0950; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]951; GFX10: atomicrmw.end:952; GFX10-NEXT: ret i32 [[NEWLOADED]]953;954; GFX11-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(955; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {956; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 4957; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]958; GFX11: atomicrmw.start:959; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]960; GFX11-NEXT: [[TMP2:%.*]] = icmp sle i32 [[LOADED]], [[VALUE]]961; GFX11-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]962; GFX11-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4963; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 1964; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 0965; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]966; GFX11: atomicrmw.end:967; GFX11-NEXT: ret i32 [[NEWLOADED]]968;969; GFX12-LABEL: define i32 @test_atomicrmw_min_i32_global_agent(970; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {971; GFX12-NEXT: [[RES:%.*]] = atomicrmw min ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4972; GFX12-NEXT: ret i32 [[RES]]973;974 %res = atomicrmw min ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst975 ret i32 %res976}977 978define i32 @test_atomicrmw_min_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {979; COMMON-LABEL: define i32 @test_atomicrmw_min_i32_global_agent__amdgpu_no_fine_grained_memory(980; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {981; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw min ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]982; COMMON-NEXT: ret i32 [[NEWLOADED]]983;984 %res = atomicrmw min ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0985 ret i32 %res986}987 988define i32 @test_atomicrmw_min_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {989; COMMON-LABEL: define i32 @test_atomicrmw_min_i32_global_agent__amdgpu_no_remote_memory(990; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {991; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw min ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]992; COMMON-NEXT: ret i32 [[NEWLOADED]]993;994 %res = atomicrmw min ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !0995 ret i32 %res996}997 998define i32 @test_atomicrmw_min_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {999; COMMON-LABEL: define i32 @test_atomicrmw_min_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(1000; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1001; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw min ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]1002; COMMON-NEXT: ret i32 [[NEWLOADED]]1003;1004 %res = atomicrmw min ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !01005 ret i32 %res1006}1007 1008;---------------------------------------------------------------------1009; atomicrmw umax1010;---------------------------------------------------------------------1011 1012; expansion is necessary, operation not supported over PCIe1013define i32 @test_atomicrmw_umax_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {1014; GFX803-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1015; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1016; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41017; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]1018; GFX803: atomicrmw.start:1019; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1020; GFX803-NEXT: [[TMP2:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1021; GFX803-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1022; GFX803-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41023; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11024; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01025; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1026; GFX803: atomicrmw.end:1027; GFX803-NEXT: ret i32 [[NEWLOADED]]1028;1029; GFX906-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1030; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1031; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41032; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]1033; GFX906: atomicrmw.start:1034; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1035; GFX906-NEXT: [[TMP2:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1036; GFX906-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1037; GFX906-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41038; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11039; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01040; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1041; GFX906: atomicrmw.end:1042; GFX906-NEXT: ret i32 [[NEWLOADED]]1043;1044; GFX908-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1045; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1046; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41047; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]1048; GFX908: atomicrmw.start:1049; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1050; GFX908-NEXT: [[TMP2:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1051; GFX908-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1052; GFX908-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41053; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11054; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01055; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1056; GFX908: atomicrmw.end:1057; GFX908-NEXT: ret i32 [[NEWLOADED]]1058;1059; GFX90A-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1060; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1061; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41062; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]1063; GFX90A: atomicrmw.start:1064; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1065; GFX90A-NEXT: [[TMP2:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1066; GFX90A-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1067; GFX90A-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41068; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11069; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01070; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1071; GFX90A: atomicrmw.end:1072; GFX90A-NEXT: ret i32 [[NEWLOADED]]1073;1074; GFX940-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1075; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1076; GFX940-NEXT: [[RES:%.*]] = atomicrmw umax ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41077; GFX940-NEXT: ret i32 [[RES]]1078;1079; GFX10-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1080; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1081; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41082; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]1083; GFX10: atomicrmw.start:1084; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1085; GFX10-NEXT: [[TMP2:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1086; GFX10-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1087; GFX10-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41088; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11089; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01090; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1091; GFX10: atomicrmw.end:1092; GFX10-NEXT: ret i32 [[NEWLOADED]]1093;1094; GFX11-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1095; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1096; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41097; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]1098; GFX11: atomicrmw.start:1099; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1100; GFX11-NEXT: [[TMP2:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1101; GFX11-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1102; GFX11-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41103; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11104; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01105; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1106; GFX11: atomicrmw.end:1107; GFX11-NEXT: ret i32 [[NEWLOADED]]1108;1109; GFX12-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent(1110; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1111; GFX12-NEXT: [[RES:%.*]] = atomicrmw umax ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41112; GFX12-NEXT: ret i32 [[RES]]1113;1114 %res = atomicrmw umax ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst1115 ret i32 %res1116}1117 1118define i32 @test_atomicrmw_umax_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {1119; COMMON-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent__amdgpu_no_fine_grained_memory(1120; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1121; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw umax ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]1122; COMMON-NEXT: ret i32 [[NEWLOADED]]1123;1124 %res = atomicrmw umax ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01125 ret i32 %res1126}1127 1128define i32 @test_atomicrmw_umax_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1129; COMMON-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent__amdgpu_no_remote_memory(1130; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1131; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw umax ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]1132; COMMON-NEXT: ret i32 [[NEWLOADED]]1133;1134 %res = atomicrmw umax ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !01135 ret i32 %res1136}1137 1138define i32 @test_atomicrmw_umax_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1139; COMMON-LABEL: define i32 @test_atomicrmw_umax_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(1140; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1141; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw umax ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]1142; COMMON-NEXT: ret i32 [[NEWLOADED]]1143;1144 %res = atomicrmw umax ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !01145 ret i32 %res1146}1147 1148;---------------------------------------------------------------------1149; atomicrmw umin1150;---------------------------------------------------------------------1151 1152; expansion is necessary, operation not supported over PCIe1153define i32 @test_atomicrmw_umin_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {1154; GFX803-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1155; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1156; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41157; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]1158; GFX803: atomicrmw.start:1159; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1160; GFX803-NEXT: [[TMP2:%.*]] = icmp ule i32 [[LOADED]], [[VALUE]]1161; GFX803-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1162; GFX803-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41163; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11164; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01165; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1166; GFX803: atomicrmw.end:1167; GFX803-NEXT: ret i32 [[NEWLOADED]]1168;1169; GFX906-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1170; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1171; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41172; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]1173; GFX906: atomicrmw.start:1174; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1175; GFX906-NEXT: [[TMP2:%.*]] = icmp ule i32 [[LOADED]], [[VALUE]]1176; GFX906-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1177; GFX906-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41178; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11179; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01180; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1181; GFX906: atomicrmw.end:1182; GFX906-NEXT: ret i32 [[NEWLOADED]]1183;1184; GFX908-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1185; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1186; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41187; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]1188; GFX908: atomicrmw.start:1189; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1190; GFX908-NEXT: [[TMP2:%.*]] = icmp ule i32 [[LOADED]], [[VALUE]]1191; GFX908-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1192; GFX908-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41193; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11194; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01195; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1196; GFX908: atomicrmw.end:1197; GFX908-NEXT: ret i32 [[NEWLOADED]]1198;1199; GFX90A-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1200; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1201; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41202; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]1203; GFX90A: atomicrmw.start:1204; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1205; GFX90A-NEXT: [[TMP2:%.*]] = icmp ule i32 [[LOADED]], [[VALUE]]1206; GFX90A-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1207; GFX90A-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41208; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11209; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01210; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1211; GFX90A: atomicrmw.end:1212; GFX90A-NEXT: ret i32 [[NEWLOADED]]1213;1214; GFX940-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1215; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1216; GFX940-NEXT: [[RES:%.*]] = atomicrmw umin ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41217; GFX940-NEXT: ret i32 [[RES]]1218;1219; GFX10-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1220; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1221; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41222; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]1223; GFX10: atomicrmw.start:1224; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1225; GFX10-NEXT: [[TMP2:%.*]] = icmp ule i32 [[LOADED]], [[VALUE]]1226; GFX10-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1227; GFX10-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41228; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11229; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01230; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1231; GFX10: atomicrmw.end:1232; GFX10-NEXT: ret i32 [[NEWLOADED]]1233;1234; GFX11-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1235; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1236; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41237; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]1238; GFX11: atomicrmw.start:1239; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1240; GFX11-NEXT: [[TMP2:%.*]] = icmp ule i32 [[LOADED]], [[VALUE]]1241; GFX11-NEXT: [[NEW:%.*]] = select i1 [[TMP2]], i32 [[LOADED]], i32 [[VALUE]]1242; GFX11-NEXT: [[TMP3:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41243; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP3]], 11244; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP3]], 01245; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1246; GFX11: atomicrmw.end:1247; GFX11-NEXT: ret i32 [[NEWLOADED]]1248;1249; GFX12-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent(1250; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1251; GFX12-NEXT: [[RES:%.*]] = atomicrmw umin ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41252; GFX12-NEXT: ret i32 [[RES]]1253;1254 %res = atomicrmw umin ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst1255 ret i32 %res1256}1257 1258define i32 @test_atomicrmw_umin_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {1259; COMMON-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent__amdgpu_no_fine_grained_memory(1260; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1261; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw umin ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]1262; COMMON-NEXT: ret i32 [[NEWLOADED]]1263;1264 %res = atomicrmw umin ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01265 ret i32 %res1266}1267 1268define i32 @test_atomicrmw_umin_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1269; COMMON-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent__amdgpu_no_remote_memory(1270; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1271; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw umin ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]1272; COMMON-NEXT: ret i32 [[NEWLOADED]]1273;1274 %res = atomicrmw umin ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !01275 ret i32 %res1276}1277 1278define i32 @test_atomicrmw_umin_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1279; COMMON-LABEL: define i32 @test_atomicrmw_umin_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(1280; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1281; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw umin ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]1282; COMMON-NEXT: ret i32 [[NEWLOADED]]1283;1284 %res = atomicrmw umin ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !01285 ret i32 %res1286}1287 1288;---------------------------------------------------------------------1289; atomicrmw uinc_wrap1290;---------------------------------------------------------------------1291 1292; expansion is necessary, operation not supported over PCIe1293define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {1294; GFX803-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1295; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1296; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41297; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]1298; GFX803: atomicrmw.start:1299; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1300; GFX803-NEXT: [[TMP2:%.*]] = add i32 [[LOADED]], 11301; GFX803-NEXT: [[TMP3:%.*]] = icmp uge i32 [[LOADED]], [[VALUE]]1302; GFX803-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]]1303; GFX803-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41304; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11305; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01306; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1307; GFX803: atomicrmw.end:1308; GFX803-NEXT: ret i32 [[NEWLOADED]]1309;1310; GFX906-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1311; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1312; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41313; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]1314; GFX906: atomicrmw.start:1315; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1316; GFX906-NEXT: [[TMP2:%.*]] = add i32 [[LOADED]], 11317; GFX906-NEXT: [[TMP3:%.*]] = icmp uge i32 [[LOADED]], [[VALUE]]1318; GFX906-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]]1319; GFX906-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41320; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11321; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01322; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1323; GFX906: atomicrmw.end:1324; GFX906-NEXT: ret i32 [[NEWLOADED]]1325;1326; GFX908-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1327; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1328; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41329; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]1330; GFX908: atomicrmw.start:1331; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1332; GFX908-NEXT: [[TMP2:%.*]] = add i32 [[LOADED]], 11333; GFX908-NEXT: [[TMP3:%.*]] = icmp uge i32 [[LOADED]], [[VALUE]]1334; GFX908-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]]1335; GFX908-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41336; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11337; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01338; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1339; GFX908: atomicrmw.end:1340; GFX908-NEXT: ret i32 [[NEWLOADED]]1341;1342; GFX90A-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1343; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1344; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41345; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]1346; GFX90A: atomicrmw.start:1347; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1348; GFX90A-NEXT: [[TMP2:%.*]] = add i32 [[LOADED]], 11349; GFX90A-NEXT: [[TMP3:%.*]] = icmp uge i32 [[LOADED]], [[VALUE]]1350; GFX90A-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]]1351; GFX90A-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41352; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11353; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01354; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1355; GFX90A: atomicrmw.end:1356; GFX90A-NEXT: ret i32 [[NEWLOADED]]1357;1358; GFX940-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1359; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1360; GFX940-NEXT: [[RES:%.*]] = atomicrmw uinc_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41361; GFX940-NEXT: ret i32 [[RES]]1362;1363; GFX10-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1364; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1365; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41366; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]1367; GFX10: atomicrmw.start:1368; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1369; GFX10-NEXT: [[TMP2:%.*]] = add i32 [[LOADED]], 11370; GFX10-NEXT: [[TMP3:%.*]] = icmp uge i32 [[LOADED]], [[VALUE]]1371; GFX10-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]]1372; GFX10-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41373; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11374; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01375; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1376; GFX10: atomicrmw.end:1377; GFX10-NEXT: ret i32 [[NEWLOADED]]1378;1379; GFX11-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1380; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1381; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41382; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]1383; GFX11: atomicrmw.start:1384; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1385; GFX11-NEXT: [[TMP2:%.*]] = add i32 [[LOADED]], 11386; GFX11-NEXT: [[TMP3:%.*]] = icmp uge i32 [[LOADED]], [[VALUE]]1387; GFX11-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i32 0, i32 [[TMP2]]1388; GFX11-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41389; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11390; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01391; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1392; GFX11: atomicrmw.end:1393; GFX11-NEXT: ret i32 [[NEWLOADED]]1394;1395; GFX12-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent(1396; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1397; GFX12-NEXT: [[RES:%.*]] = atomicrmw uinc_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41398; GFX12-NEXT: ret i32 [[RES]]1399;1400 %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst1401 ret i32 %res1402}1403 1404define i32 @test_atomicrmw_uinc_wrap_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {1405; COMMON-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent__amdgpu_no_fine_grained_memory(1406; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1407; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw uinc_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]1408; COMMON-NEXT: ret i32 [[NEWLOADED]]1409;1410 %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01411 ret i32 %res1412}1413 1414define i32 @test_atomicrmw_uinc_wrap_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1415; COMMON-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent__amdgpu_no_remote_memory(1416; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1417; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw uinc_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]1418; COMMON-NEXT: ret i32 [[NEWLOADED]]1419;1420 %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !01421 ret i32 %res1422}1423 1424define i32 @test_atomicrmw_uinc_wrap_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1425; COMMON-LABEL: define i32 @test_atomicrmw_uinc_wrap_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(1426; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1427; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw uinc_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]1428; COMMON-NEXT: ret i32 [[NEWLOADED]]1429;1430 %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !01431 ret i32 %res1432}1433 1434;---------------------------------------------------------------------1435; atomicrmw udec_wrap1436;---------------------------------------------------------------------1437 1438; expansion is necessary, operation not supported over PCIe1439define i32 @test_atomicrmw_udec_wrap_i32_global_agent(ptr addrspace(1) %ptr, i32 %value) {1440; GFX803-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1441; GFX803-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1442; GFX803-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41443; GFX803-NEXT: br label [[ATOMICRMW_START:%.*]]1444; GFX803: atomicrmw.start:1445; GFX803-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1446; GFX803-NEXT: [[TMP2:%.*]] = sub i32 [[LOADED]], 11447; GFX803-NEXT: [[TMP3:%.*]] = icmp eq i32 [[LOADED]], 01448; GFX803-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1449; GFX803-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1450; GFX803-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i32 [[VALUE]], i32 [[TMP2]]1451; GFX803-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41452; GFX803-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11453; GFX803-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01454; GFX803-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1455; GFX803: atomicrmw.end:1456; GFX803-NEXT: ret i32 [[NEWLOADED]]1457;1458; GFX906-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1459; GFX906-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1460; GFX906-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41461; GFX906-NEXT: br label [[ATOMICRMW_START:%.*]]1462; GFX906: atomicrmw.start:1463; GFX906-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1464; GFX906-NEXT: [[TMP2:%.*]] = sub i32 [[LOADED]], 11465; GFX906-NEXT: [[TMP3:%.*]] = icmp eq i32 [[LOADED]], 01466; GFX906-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1467; GFX906-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1468; GFX906-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i32 [[VALUE]], i32 [[TMP2]]1469; GFX906-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41470; GFX906-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11471; GFX906-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01472; GFX906-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1473; GFX906: atomicrmw.end:1474; GFX906-NEXT: ret i32 [[NEWLOADED]]1475;1476; GFX908-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1477; GFX908-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1478; GFX908-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41479; GFX908-NEXT: br label [[ATOMICRMW_START:%.*]]1480; GFX908: atomicrmw.start:1481; GFX908-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1482; GFX908-NEXT: [[TMP2:%.*]] = sub i32 [[LOADED]], 11483; GFX908-NEXT: [[TMP3:%.*]] = icmp eq i32 [[LOADED]], 01484; GFX908-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1485; GFX908-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1486; GFX908-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i32 [[VALUE]], i32 [[TMP2]]1487; GFX908-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41488; GFX908-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11489; GFX908-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01490; GFX908-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1491; GFX908: atomicrmw.end:1492; GFX908-NEXT: ret i32 [[NEWLOADED]]1493;1494; GFX90A-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1495; GFX90A-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1496; GFX90A-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41497; GFX90A-NEXT: br label [[ATOMICRMW_START:%.*]]1498; GFX90A: atomicrmw.start:1499; GFX90A-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1500; GFX90A-NEXT: [[TMP2:%.*]] = sub i32 [[LOADED]], 11501; GFX90A-NEXT: [[TMP3:%.*]] = icmp eq i32 [[LOADED]], 01502; GFX90A-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1503; GFX90A-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1504; GFX90A-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i32 [[VALUE]], i32 [[TMP2]]1505; GFX90A-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41506; GFX90A-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11507; GFX90A-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01508; GFX90A-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1509; GFX90A: atomicrmw.end:1510; GFX90A-NEXT: ret i32 [[NEWLOADED]]1511;1512; GFX940-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1513; GFX940-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1514; GFX940-NEXT: [[RES:%.*]] = atomicrmw udec_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41515; GFX940-NEXT: ret i32 [[RES]]1516;1517; GFX10-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1518; GFX10-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1519; GFX10-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41520; GFX10-NEXT: br label [[ATOMICRMW_START:%.*]]1521; GFX10: atomicrmw.start:1522; GFX10-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1523; GFX10-NEXT: [[TMP2:%.*]] = sub i32 [[LOADED]], 11524; GFX10-NEXT: [[TMP3:%.*]] = icmp eq i32 [[LOADED]], 01525; GFX10-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1526; GFX10-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1527; GFX10-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i32 [[VALUE]], i32 [[TMP2]]1528; GFX10-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41529; GFX10-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11530; GFX10-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01531; GFX10-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1532; GFX10: atomicrmw.end:1533; GFX10-NEXT: ret i32 [[NEWLOADED]]1534;1535; GFX11-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1536; GFX11-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1537; GFX11-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR]], align 41538; GFX11-NEXT: br label [[ATOMICRMW_START:%.*]]1539; GFX11: atomicrmw.start:1540; GFX11-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1541; GFX11-NEXT: [[TMP2:%.*]] = sub i32 [[LOADED]], 11542; GFX11-NEXT: [[TMP3:%.*]] = icmp eq i32 [[LOADED]], 01543; GFX11-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LOADED]], [[VALUE]]1544; GFX11-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1545; GFX11-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i32 [[VALUE]], i32 [[TMP2]]1546; GFX11-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 41547; GFX11-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11548; GFX11-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01549; GFX11-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1550; GFX11: atomicrmw.end:1551; GFX11-NEXT: ret i32 [[NEWLOADED]]1552;1553; GFX12-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent(1554; GFX12-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1555; GFX12-NEXT: [[RES:%.*]] = atomicrmw udec_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 41556; GFX12-NEXT: ret i32 [[RES]]1557;1558 %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst1559 ret i32 %res1560}1561 1562define i32 @test_atomicrmw_udec_wrap_i32_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i32 %value) {1563; COMMON-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent__amdgpu_no_fine_grained_memory(1564; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1565; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw udec_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]]1566; COMMON-NEXT: ret i32 [[NEWLOADED]]1567;1568 %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01569 ret i32 %res1570}1571 1572define i32 @test_atomicrmw_udec_wrap_i32_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1573; COMMON-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent__amdgpu_no_remote_memory(1574; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1575; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw udec_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.remote.memory [[META0]]1576; COMMON-NEXT: ret i32 [[NEWLOADED]]1577;1578 %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !01579 ret i32 %res1580}1581 1582define i32 @test_atomicrmw_udec_wrap_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i32 %value) {1583; COMMON-LABEL: define i32 @test_atomicrmw_udec_wrap_i32_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(1584; COMMON-SAME: ptr addrspace(1) [[PTR:%.*]], i32 [[VALUE:%.*]]) #[[ATTR0]] {1585; COMMON-NEXT: [[NEWLOADED:%.*]] = atomicrmw udec_wrap ptr addrspace(1) [[PTR]], i32 [[VALUE]] syncscope("agent") seq_cst, align 4, !amdgpu.no.fine.grained.memory [[META0]], !amdgpu.no.remote.memory [[META0]]1586; COMMON-NEXT: ret i32 [[NEWLOADED]]1587;1588 %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i32 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !01589 ret i32 %res1590}1591 1592!0 = !{}1593;.1594; GFX803: [[META0]] = !{}1595;.1596; GFX906: [[META0]] = !{}1597;.1598; GFX908: [[META0]] = !{}1599;.1600; GFX90A: [[META0]] = !{}1601;.1602; GFX942: [[META0]] = !{}1603;.1604; GFX10: [[META0]] = !{}1605;.1606; GFX11: [[META0]] = !{}1607;.1608; GFX12: [[META0]] = !{}1609;.1610