346 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=atomic-expand %s | FileCheck %s3 4define { i16, i1 } @cmpxchg_flat_agent_i16(ptr %ptr, i16 %val, i16 %swap) {5; CHECK-LABEL: define { i16, i1 } @cmpxchg_flat_agent_i16(6; CHECK-SAME: ptr [[PTR:%.*]], i16 [[VAL:%.*]], i16 [[SWAP:%.*]]) {7; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -4)8; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i649; CHECK-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 310; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 311; CHECK-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3212; CHECK-NEXT: [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]13; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -114; CHECK-NEXT: [[TMP3:%.*]] = zext i16 [[SWAP]] to i3215; CHECK-NEXT: [[TMP4:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]16; CHECK-NEXT: [[TMP5:%.*]] = zext i16 [[VAL]] to i3217; CHECK-NEXT: [[TMP6:%.*]] = shl i32 [[TMP5]], [[SHIFTAMT]]18; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 419; CHECK-NEXT: [[TMP8:%.*]] = and i32 [[TMP7]], [[INV_MASK]]20; CHECK-NEXT: br label %[[PARTWORD_CMPXCHG_LOOP:.*]]21; CHECK: [[PARTWORD_CMPXCHG_LOOP]]:22; CHECK-NEXT: [[TMP9:%.*]] = phi i32 [ [[TMP8]], [[TMP0:%.*]] ], [ [[TMP15:%.*]], %[[PARTWORD_CMPXCHG_FAILURE:.*]] ]23; CHECK-NEXT: [[TMP10:%.*]] = or i32 [[TMP9]], [[TMP4]]24; CHECK-NEXT: [[TMP11:%.*]] = or i32 [[TMP9]], [[TMP6]]25; CHECK-NEXT: [[TMP12:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[TMP11]], i32 [[TMP10]] syncscope("agent") monotonic seq_cst, align 426; CHECK-NEXT: [[TMP13:%.*]] = extractvalue { i32, i1 } [[TMP12]], 027; CHECK-NEXT: [[TMP14:%.*]] = extractvalue { i32, i1 } [[TMP12]], 128; CHECK-NEXT: br i1 [[TMP14]], label %[[PARTWORD_CMPXCHG_END:.*]], label %[[PARTWORD_CMPXCHG_FAILURE]]29; CHECK: [[PARTWORD_CMPXCHG_FAILURE]]:30; CHECK-NEXT: [[TMP15]] = and i32 [[TMP13]], [[INV_MASK]]31; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP9]], [[TMP15]]32; CHECK-NEXT: br i1 [[TMP16]], label %[[PARTWORD_CMPXCHG_LOOP]], label %[[PARTWORD_CMPXCHG_END]]33; CHECK: [[PARTWORD_CMPXCHG_END]]:34; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP13]], [[SHIFTAMT]]35; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i1636; CHECK-NEXT: [[TMP17:%.*]] = insertvalue { i16, i1 } poison, i16 [[EXTRACTED]], 037; CHECK-NEXT: [[TMP18:%.*]] = insertvalue { i16, i1 } [[TMP17]], i1 [[TMP14]], 138; CHECK-NEXT: ret { i16, i1 } [[TMP18]]39;40 %result = cmpxchg ptr %ptr, i16 %val, i16 %swap syncscope("agent") monotonic seq_cst41 ret { i16, i1 } %result42}43 44define { i16, i1 } @cmpxchg_flat_agent_i16_align4(ptr %ptr, i16 %val, i16 %swap) {45; CHECK-LABEL: define { i16, i1 } @cmpxchg_flat_agent_i16_align4(46; CHECK-SAME: ptr [[PTR:%.*]], i16 [[VAL:%.*]], i16 [[SWAP:%.*]]) {47; CHECK-NEXT: [[TMP1:%.*]] = zext i16 [[SWAP]] to i3248; CHECK-NEXT: [[TMP2:%.*]] = zext i16 [[VAL]] to i3249; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[PTR]], align 450; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[TMP3]], -6553651; CHECK-NEXT: br label %[[PARTWORD_CMPXCHG_LOOP:.*]]52; CHECK: [[PARTWORD_CMPXCHG_LOOP]]:53; CHECK-NEXT: [[TMP5:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[TMP11:%.*]], %[[PARTWORD_CMPXCHG_FAILURE:.*]] ]54; CHECK-NEXT: [[TMP6:%.*]] = or i32 [[TMP5]], [[TMP1]]55; CHECK-NEXT: [[TMP7:%.*]] = or i32 [[TMP5]], [[TMP2]]56; CHECK-NEXT: [[TMP8:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP7]], i32 [[TMP6]] syncscope("agent") monotonic seq_cst, align 457; CHECK-NEXT: [[TMP9:%.*]] = extractvalue { i32, i1 } [[TMP8]], 058; CHECK-NEXT: [[TMP10:%.*]] = extractvalue { i32, i1 } [[TMP8]], 159; CHECK-NEXT: br i1 [[TMP10]], label %[[PARTWORD_CMPXCHG_END:.*]], label %[[PARTWORD_CMPXCHG_FAILURE]]60; CHECK: [[PARTWORD_CMPXCHG_FAILURE]]:61; CHECK-NEXT: [[TMP11]] = and i32 [[TMP9]], -6553662; CHECK-NEXT: [[TMP12:%.*]] = icmp ne i32 [[TMP5]], [[TMP11]]63; CHECK-NEXT: br i1 [[TMP12]], label %[[PARTWORD_CMPXCHG_LOOP]], label %[[PARTWORD_CMPXCHG_END]]64; CHECK: [[PARTWORD_CMPXCHG_END]]:65; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[TMP9]] to i1666; CHECK-NEXT: [[TMP13:%.*]] = insertvalue { i16, i1 } poison, i16 [[EXTRACTED]], 067; CHECK-NEXT: [[TMP14:%.*]] = insertvalue { i16, i1 } [[TMP13]], i1 [[TMP10]], 168; CHECK-NEXT: ret { i16, i1 } [[TMP14]]69;70 %result = cmpxchg ptr %ptr, i16 %val, i16 %swap syncscope("agent") monotonic seq_cst, align 471 ret { i16, i1 } %result72}73 74define { i32, i1 } @cmpxchg_flat_agent_i32(ptr %ptr, i32 %val, i32 %swap) {75; CHECK-LABEL: define { i32, i1 } @cmpxchg_flat_agent_i32(76; CHECK-SAME: ptr [[PTR:%.*]], i32 [[VAL:%.*]], i32 [[SWAP:%.*]]) {77; CHECK-NEXT: [[RESULT:%.*]] = cmpxchg ptr [[PTR]], i32 [[VAL]], i32 [[SWAP]] syncscope("agent") monotonic seq_cst, align 478; CHECK-NEXT: ret { i32, i1 } [[RESULT]]79;80 %result = cmpxchg ptr %ptr, i32 %val, i32 %swap syncscope("agent") monotonic seq_cst81 ret { i32, i1 } %result82}83 84define { i64, i1 } @cmpxchg_flat_agent_i64(ptr %ptr, i64 %val, i64 %swap) {85; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64(86; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {87; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])88; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]89; CHECK: [[ATOMICRMW_PRIVATE]]:90; CHECK-NEXT: [[TMP3:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)91; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr addrspace(5) [[TMP3]], align 892; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], [[VAL]]93; CHECK-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], i64 [[SWAP]], i64 [[TMP4]]94; CHECK-NEXT: store i64 [[TMP6]], ptr addrspace(5) [[TMP3]], align 895; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP4]], 096; CHECK-NEXT: [[TMP8:%.*]] = insertvalue { i64, i1 } [[TMP7]], i1 [[TMP5]], 197; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]98; CHECK: [[ATOMICRMW_GLOBAL]]:99; CHECK-NEXT: [[TMP9:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0:![0-9]+]]100; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]101; CHECK: [[ATOMICRMW_PHI]]:102; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP8]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP9]], %[[ATOMICRMW_GLOBAL]] ]103; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]104; CHECK: [[ATOMICRMW_END]]:105; CHECK-NEXT: ret { i64, i1 } [[RESULT]]106;107 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst108 ret { i64, i1 } %result109}110 111define { i64, i1 } @cmpxchg_flat_agent_i64_volatile(ptr %ptr, i64 %val, i64 %swap) {112; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64_volatile(113; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {114; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])115; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]116; CHECK: [[ATOMICRMW_PRIVATE]]:117; CHECK-NEXT: [[TMP3:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)118; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr addrspace(5) [[TMP3]], align 8119; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], [[VAL]]120; CHECK-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], i64 [[SWAP]], i64 [[TMP4]]121; CHECK-NEXT: store i64 [[TMP6]], ptr addrspace(5) [[TMP3]], align 8122; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP4]], 0123; CHECK-NEXT: [[TMP8:%.*]] = insertvalue { i64, i1 } [[TMP7]], i1 [[TMP5]], 1124; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]125; CHECK: [[ATOMICRMW_GLOBAL]]:126; CHECK-NEXT: [[TMP9:%.*]] = cmpxchg volatile ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]127; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]128; CHECK: [[ATOMICRMW_PHI]]:129; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP8]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP9]], %[[ATOMICRMW_GLOBAL]] ]130; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]131; CHECK: [[ATOMICRMW_END]]:132; CHECK-NEXT: ret { i64, i1 } [[RESULT]]133;134 %result = cmpxchg volatile ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst135 ret { i64, i1 } %result136}137 138define { i16, i1 } @cmpxchg_flat_agent_i16__noprivate(ptr %ptr, i16 %val, i16 %swap) {139; CHECK-LABEL: define { i16, i1 } @cmpxchg_flat_agent_i16__noprivate(140; CHECK-SAME: ptr [[PTR:%.*]], i16 [[VAL:%.*]], i16 [[SWAP:%.*]]) {141; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR]], i64 -4)142; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i64143; CHECK-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3144; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3145; CHECK-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32146; CHECK-NEXT: [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]147; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1148; CHECK-NEXT: [[TMP3:%.*]] = zext i16 [[SWAP]] to i32149; CHECK-NEXT: [[TMP4:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]150; CHECK-NEXT: [[TMP5:%.*]] = zext i16 [[VAL]] to i32151; CHECK-NEXT: [[TMP6:%.*]] = shl i32 [[TMP5]], [[SHIFTAMT]]152; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 4153; CHECK-NEXT: [[TMP8:%.*]] = and i32 [[TMP7]], [[INV_MASK]]154; CHECK-NEXT: br label %[[PARTWORD_CMPXCHG_LOOP:.*]]155; CHECK: [[PARTWORD_CMPXCHG_LOOP]]:156; CHECK-NEXT: [[TMP9:%.*]] = phi i32 [ [[TMP8]], [[TMP0:%.*]] ], [ [[TMP15:%.*]], %[[PARTWORD_CMPXCHG_FAILURE:.*]] ]157; CHECK-NEXT: [[TMP10:%.*]] = or i32 [[TMP9]], [[TMP4]]158; CHECK-NEXT: [[TMP11:%.*]] = or i32 [[TMP9]], [[TMP6]]159; CHECK-NEXT: [[TMP12:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[TMP11]], i32 [[TMP10]] syncscope("agent") monotonic seq_cst, align 4160; CHECK-NEXT: [[TMP13:%.*]] = extractvalue { i32, i1 } [[TMP12]], 0161; CHECK-NEXT: [[TMP14:%.*]] = extractvalue { i32, i1 } [[TMP12]], 1162; CHECK-NEXT: br i1 [[TMP14]], label %[[PARTWORD_CMPXCHG_END:.*]], label %[[PARTWORD_CMPXCHG_FAILURE]]163; CHECK: [[PARTWORD_CMPXCHG_FAILURE]]:164; CHECK-NEXT: [[TMP15]] = and i32 [[TMP13]], [[INV_MASK]]165; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP9]], [[TMP15]]166; CHECK-NEXT: br i1 [[TMP16]], label %[[PARTWORD_CMPXCHG_LOOP]], label %[[PARTWORD_CMPXCHG_END]]167; CHECK: [[PARTWORD_CMPXCHG_END]]:168; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP13]], [[SHIFTAMT]]169; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16170; CHECK-NEXT: [[TMP17:%.*]] = insertvalue { i16, i1 } poison, i16 [[EXTRACTED]], 0171; CHECK-NEXT: [[TMP18:%.*]] = insertvalue { i16, i1 } [[TMP17]], i1 [[TMP14]], 1172; CHECK-NEXT: ret { i16, i1 } [[TMP18]]173;174 %result = cmpxchg ptr %ptr, i16 %val, i16 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !0175 ret { i16, i1 } %result176}177 178define { i32, i1 } @cmpxchg_flat_agent_i32__noprivate(ptr %ptr, i32 %val, i32 %swap) {179; CHECK-LABEL: define { i32, i1 } @cmpxchg_flat_agent_i32__noprivate(180; CHECK-SAME: ptr [[PTR:%.*]], i32 [[VAL:%.*]], i32 [[SWAP:%.*]]) {181; CHECK-NEXT: [[RESULT:%.*]] = cmpxchg ptr [[PTR]], i32 [[VAL]], i32 [[SWAP]] syncscope("agent") monotonic seq_cst, align 4, !noalias.addrspace [[META0]]182; CHECK-NEXT: ret { i32, i1 } [[RESULT]]183;184 %result = cmpxchg ptr %ptr, i32 %val, i32 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !0185 ret { i32, i1 } %result186}187 188define { i64, i1 } @cmpxchg_flat_agent_i64__noprivate(ptr %ptr, i64 %val, i64 %swap) {189; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__noprivate(190; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {191; CHECK-NEXT: [[RESULT:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]192; CHECK-NEXT: ret { i64, i1 } [[RESULT]]193;194 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !0195 ret { i64, i1 } %result196}197 198define { i64, i1 } @cmpxchg_flat_agent_i64__nolocal(ptr %ptr, i64 %val, i64 %swap) {199; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__nolocal(200; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {201; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])202; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]203; CHECK: [[ATOMICRMW_PRIVATE]]:204; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)205; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspace(5) [[TMP1]], align 8206; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], [[VAL]]207; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i64 [[SWAP]], i64 [[TMP2]]208; CHECK-NEXT: store i64 [[TMP4]], ptr addrspace(5) [[TMP1]], align 8209; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP2]], 0210; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP3]], 1211; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]212; CHECK: [[ATOMICRMW_GLOBAL]]:213; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]214; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]215; CHECK: [[ATOMICRMW_PHI]]:216; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP6]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP7]], %[[ATOMICRMW_GLOBAL]] ]217; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]218; CHECK: [[ATOMICRMW_END]]:219; CHECK-NEXT: ret { i64, i1 } [[RESULT]]220;221 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !1222 ret { i64, i1 } %result223}224 225define { i64, i1 } @cmpxchg_flat_agent_i64_mmra(ptr %ptr, i64 %val, i64 %swap) {226; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64_mmra(227; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {228; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])229; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]230; CHECK: [[ATOMICRMW_PRIVATE]]:231; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)232; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspace(5) [[TMP1]], align 8233; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], [[VAL]]234; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i64 [[SWAP]], i64 [[TMP2]]235; CHECK-NEXT: store i64 [[TMP4]], ptr addrspace(5) [[TMP1]], align 8236; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP2]], 0237; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP3]], 1238; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]239; CHECK: [[ATOMICRMW_GLOBAL]]:240; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !mmra [[META1:![0-9]+]], !noalias.addrspace [[META0]]241; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]242; CHECK: [[ATOMICRMW_PHI]]:243; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP6]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP7]], %[[ATOMICRMW_GLOBAL]] ]244; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]245; CHECK: [[ATOMICRMW_END]]:246; CHECK-NEXT: ret { i64, i1 } [[RESULT]]247;248 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !mmra !4249 ret { i64, i1 } %result250}251 252define { i64, i1 } @cmpxchg_flat_agent_i64_mmra_noprivate(ptr %ptr, i64 %val, i64 %swap) {253; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64_mmra_noprivate(254; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {255; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])256; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]257; CHECK: [[ATOMICRMW_PRIVATE]]:258; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)259; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspace(5) [[TMP1]], align 8260; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], [[VAL]]261; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i64 [[SWAP]], i64 [[TMP2]]262; CHECK-NEXT: store i64 [[TMP4]], ptr addrspace(5) [[TMP1]], align 8263; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP2]], 0264; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP3]], 1265; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]266; CHECK: [[ATOMICRMW_GLOBAL]]:267; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !mmra [[META1]], !noalias.addrspace [[META0]]268; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]269; CHECK: [[ATOMICRMW_PHI]]:270; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP6]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP7]], %[[ATOMICRMW_GLOBAL]] ]271; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]272; CHECK: [[ATOMICRMW_END]]:273; CHECK-NEXT: ret { i64, i1 } [[RESULT]]274;275 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !1, !mmra !4276 ret { i64, i1 } %result277}278 279; may alias private, wrapped range280define { i64, i1 } @cmpxchg_flat_agent_i64__noalias_addrspace_edge_case0(ptr %ptr, i64 %val, i64 %swap) {281; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__noalias_addrspace_edge_case0(282; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {283; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])284; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]285; CHECK: [[ATOMICRMW_PRIVATE]]:286; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)287; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspace(5) [[TMP1]], align 8288; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], [[VAL]]289; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i64 [[SWAP]], i64 [[TMP2]]290; CHECK-NEXT: store i64 [[TMP4]], ptr addrspace(5) [[TMP1]], align 8291; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP2]], 0292; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP3]], 1293; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]294; CHECK: [[ATOMICRMW_GLOBAL]]:295; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]296; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]297; CHECK: [[ATOMICRMW_PHI]]:298; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP6]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP7]], %[[ATOMICRMW_GLOBAL]] ]299; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]300; CHECK: [[ATOMICRMW_END]]:301; CHECK-NEXT: ret { i64, i1 } [[RESULT]]302;303 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !6304 ret { i64, i1 } %result305}306 307; covers private case, but private isn't the low value.308define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_6(ptr %ptr, i64 %val, i64 %swap) {309; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_6(310; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {311; CHECK-NEXT: [[RESULT:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META4:![0-9]+]]312; CHECK-NEXT: ret { i64, i1 } [[RESULT]]313;314 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !7315 ret { i64, i1 } %result316}317 318define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_3_5(ptr %ptr, i64 %val, i64 %swap) {319; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_3_5(320; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {321; CHECK-NEXT: [[RESULT:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META5:![0-9]+]]322; CHECK-NEXT: ret { i64, i1 } [[RESULT]]323;324 %result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !8325 ret { i64, i1 } %result326}327 328!0 = !{i32 5, i32 6}329!1 = !{i32 3, i32 4}330!2 = !{!"foo", !"bar"}331!3 = !{!"bux", !"baz"}332!4 = !{!2, !3}333!5 = !{}334!6 = !{i32 6, i32 5}335!7 = !{i32 2, i32 6}336!8 = !{i32 2, i32 4, i32 5, i32 6}337 338;.339; CHECK: [[META0]] = !{i32 5, i32 6}340; CHECK: [[META1]] = !{[[META2:![0-9]+]], [[META3:![0-9]+]]}341; CHECK: [[META2]] = !{!"foo", !"bar"}342; CHECK: [[META3]] = !{!"bux", !"baz"}343; CHECK: [[META4]] = !{i32 2, i32 6}344; CHECK: [[META5]] = !{i32 2, i32 4, i32 5, i32 6}345;.346