1918 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -mtriple=amdgcn-amd-amdhsa -S -passes=atomic-expand %s | FileCheck %s --check-prefixes=CHECK,GCN3; RUN: opt -mtriple=r600-mesa-mesa3d -S -passes=atomic-expand %s | FileCheck %s --check-prefixes=CHECK,R6004 5define i8 @test_atomicrmw_xchg_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {6; GCN-LABEL: @test_atomicrmw_xchg_i8_global_agent(7; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)8; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i649; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 310; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 311; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3212; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]13; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -114; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i3215; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]16; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 417; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]18; GCN: atomicrmw.start:19; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]20; GCN-NEXT: [[TMP5:%.*]] = and i32 [[LOADED]], [[INV_MASK]]21; GCN-NEXT: [[TMP6:%.*]] = or i32 [[TMP5]], [[VALOPERAND_SHIFTED]]22; GCN-NEXT: [[TMP7:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP6]] syncscope("agent") seq_cst seq_cst, align 423; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 124; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 025; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]26; GCN: atomicrmw.end:27; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]28; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i829; GCN-NEXT: ret i8 [[EXTRACTED]]30;31; R600-LABEL: @test_atomicrmw_xchg_i8_global_agent(32; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)33; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i3234; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 335; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 336; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]37; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -138; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i3239; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]40; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 441; R600-NEXT: br label [[ATOMICRMW_START:%.*]]42; R600: atomicrmw.start:43; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]44; R600-NEXT: [[TMP5:%.*]] = and i32 [[LOADED]], [[INV_MASK]]45; R600-NEXT: [[TMP6:%.*]] = or i32 [[TMP5]], [[VALOPERAND_SHIFTED]]46; R600-NEXT: [[TMP7:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP6]] syncscope("agent") seq_cst seq_cst, align 447; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 148; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 049; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]50; R600: atomicrmw.end:51; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]52; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i853; R600-NEXT: ret i8 [[EXTRACTED]]54;55 %res = atomicrmw xchg ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst56 ret i8 %res57}58 59define i8 @test_atomicrmw_add_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {60; GCN-LABEL: @test_atomicrmw_add_i8_global_agent(61; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)62; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i6463; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 364; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 365; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3266; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]67; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -168; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i3269; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]70; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 471; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]72; GCN: atomicrmw.start:73; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]74; GCN-NEXT: [[NEW:%.*]] = add i32 [[LOADED]], [[VALOPERAND_SHIFTED]]75; GCN-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]76; GCN-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]77; GCN-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]78; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 479; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 180; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 081; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]82; GCN: atomicrmw.end:83; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]84; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i885; GCN-NEXT: ret i8 [[EXTRACTED]]86;87; R600-LABEL: @test_atomicrmw_add_i8_global_agent(88; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)89; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i3290; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 391; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 392; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]93; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -194; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i3295; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]96; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 497; R600-NEXT: br label [[ATOMICRMW_START:%.*]]98; R600: atomicrmw.start:99; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]100; R600-NEXT: [[NEW:%.*]] = add i32 [[LOADED]], [[VALOPERAND_SHIFTED]]101; R600-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]102; R600-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]103; R600-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]104; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 4105; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1106; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0107; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]108; R600: atomicrmw.end:109; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]110; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8111; R600-NEXT: ret i8 [[EXTRACTED]]112;113 %res = atomicrmw add ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst114 ret i8 %res115}116 117define i8 @test_atomicrmw_add_i8_global_agent_align2(ptr addrspace(1) %ptr, i8 %value) {118; GCN-LABEL: @test_atomicrmw_add_i8_global_agent_align2(119; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)120; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64121; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3122; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3123; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32124; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]125; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1126; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32127; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]128; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4129; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]130; GCN: atomicrmw.start:131; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]132; GCN-NEXT: [[NEW:%.*]] = add i32 [[LOADED]], [[VALOPERAND_SHIFTED]]133; GCN-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]134; GCN-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]135; GCN-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]136; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 4137; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1138; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0139; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]140; GCN: atomicrmw.end:141; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]142; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8143; GCN-NEXT: ret i8 [[EXTRACTED]]144;145; R600-LABEL: @test_atomicrmw_add_i8_global_agent_align2(146; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)147; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32148; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3149; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3150; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]151; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1152; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32153; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]154; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4155; R600-NEXT: br label [[ATOMICRMW_START:%.*]]156; R600: atomicrmw.start:157; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]158; R600-NEXT: [[NEW:%.*]] = add i32 [[LOADED]], [[VALOPERAND_SHIFTED]]159; R600-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]160; R600-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]161; R600-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]162; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 4163; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1164; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0165; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]166; R600: atomicrmw.end:167; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]168; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8169; R600-NEXT: ret i8 [[EXTRACTED]]170;171 %res = atomicrmw add ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, align 2172 ret i8 %res173}174 175define i8 @test_atomicrmw_add_i8_global_agent_align4(ptr addrspace(1) %ptr, i8 %value) {176; CHECK-LABEL: @test_atomicrmw_add_i8_global_agent_align4(177; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[VALUE:%.*]] to i32178; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(1) [[PTR:%.*]], align 4179; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]180; CHECK: atomicrmw.start:181; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]182; CHECK-NEXT: [[NEW:%.*]] = add i32 [[LOADED]], [[TMP1]]183; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[NEW]], 255184; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[LOADED]], -256185; CHECK-NEXT: [[TMP5:%.*]] = or i32 [[TMP4]], [[TMP3]]186; CHECK-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[TMP5]] syncscope("agent") seq_cst seq_cst, align 4187; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1188; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0189; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]190; CHECK: atomicrmw.end:191; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[NEWLOADED]] to i8192; CHECK-NEXT: ret i8 [[EXTRACTED]]193;194 %res = atomicrmw add ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, align 4195 ret i8 %res196}197 198define i8 @test_atomicrmw_sub_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {199; GCN-LABEL: @test_atomicrmw_sub_i8_global_agent(200; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)201; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64202; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3203; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3204; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32205; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]206; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1207; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32208; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]209; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4210; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]211; GCN: atomicrmw.start:212; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]213; GCN-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]214; GCN-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]215; GCN-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]216; GCN-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]217; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 4218; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1219; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0220; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]221; GCN: atomicrmw.end:222; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]223; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8224; GCN-NEXT: ret i8 [[EXTRACTED]]225;226; R600-LABEL: @test_atomicrmw_sub_i8_global_agent(227; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)228; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32229; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3230; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3231; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]232; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1233; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32234; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]235; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4236; R600-NEXT: br label [[ATOMICRMW_START:%.*]]237; R600: atomicrmw.start:238; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]239; R600-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]240; R600-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]241; R600-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]242; R600-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]243; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 4244; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1245; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0246; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]247; R600: atomicrmw.end:248; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]249; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8250; R600-NEXT: ret i8 [[EXTRACTED]]251;252 %res = atomicrmw sub ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst253 ret i8 %res254}255 256define i8 @test_atomicrmw_and_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {257; GCN-LABEL: @test_atomicrmw_and_i8_global_agent(258; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)259; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64260; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3261; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3262; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32263; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]264; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1265; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32266; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]267; GCN-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]268; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4269; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]270; GCN: atomicrmw.start:271; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]272; GCN-NEXT: [[NEW:%.*]] = and i32 [[LOADED]], [[ANDOPERAND]]273; GCN-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4274; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1275; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0276; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]277; GCN: atomicrmw.end:278; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]279; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8280; GCN-NEXT: ret i8 [[EXTRACTED]]281;282; R600-LABEL: @test_atomicrmw_and_i8_global_agent(283; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)284; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32285; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3286; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3287; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]288; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1289; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32290; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]291; R600-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]292; R600-NEXT: [[TMP4:%.*]] = atomicrmw and ptr addrspace(1) [[ALIGNEDADDR]], i32 [[ANDOPERAND]] syncscope("agent") seq_cst, align 4293; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[TMP2]]294; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8295; R600-NEXT: ret i8 [[EXTRACTED]]296;297 %res = atomicrmw and ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst298 ret i8 %res299}300 301define i8 @test_atomicrmw_nand_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {302; GCN-LABEL: @test_atomicrmw_nand_i8_global_agent(303; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)304; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64305; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3306; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3307; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32308; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]309; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1310; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32311; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]312; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4313; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]314; GCN: atomicrmw.start:315; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]316; GCN-NEXT: [[TMP5:%.*]] = and i32 [[LOADED]], [[VALOPERAND_SHIFTED]]317; GCN-NEXT: [[NEW:%.*]] = xor i32 [[TMP5]], -1318; GCN-NEXT: [[TMP6:%.*]] = and i32 [[NEW]], [[MASK]]319; GCN-NEXT: [[TMP7:%.*]] = and i32 [[LOADED]], [[INV_MASK]]320; GCN-NEXT: [[TMP8:%.*]] = or i32 [[TMP7]], [[TMP6]]321; GCN-NEXT: [[TMP9:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP8]] syncscope("agent") seq_cst seq_cst, align 4322; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP9]], 1323; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP9]], 0324; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]325; GCN: atomicrmw.end:326; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]327; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8328; GCN-NEXT: ret i8 [[EXTRACTED]]329;330; R600-LABEL: @test_atomicrmw_nand_i8_global_agent(331; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)332; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32333; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3334; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3335; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]336; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1337; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32338; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]339; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4340; R600-NEXT: br label [[ATOMICRMW_START:%.*]]341; R600: atomicrmw.start:342; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]343; R600-NEXT: [[TMP5:%.*]] = and i32 [[LOADED]], [[VALOPERAND_SHIFTED]]344; R600-NEXT: [[NEW:%.*]] = xor i32 [[TMP5]], -1345; R600-NEXT: [[TMP6:%.*]] = and i32 [[NEW]], [[MASK]]346; R600-NEXT: [[TMP7:%.*]] = and i32 [[LOADED]], [[INV_MASK]]347; R600-NEXT: [[TMP8:%.*]] = or i32 [[TMP7]], [[TMP6]]348; R600-NEXT: [[TMP9:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP8]] syncscope("agent") seq_cst seq_cst, align 4349; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP9]], 1350; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP9]], 0351; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]352; R600: atomicrmw.end:353; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]354; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8355; R600-NEXT: ret i8 [[EXTRACTED]]356;357 %res = atomicrmw nand ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst358 ret i8 %res359}360 361define i8 @test_atomicrmw_or_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {362; GCN-LABEL: @test_atomicrmw_or_i8_global_agent(363; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)364; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64365; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3366; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3367; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32368; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]369; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1370; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32371; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]372; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4373; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]374; GCN: atomicrmw.start:375; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]376; GCN-NEXT: [[NEW:%.*]] = or i32 [[LOADED]], [[VALOPERAND_SHIFTED]]377; GCN-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4378; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1379; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0380; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]381; GCN: atomicrmw.end:382; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]383; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8384; GCN-NEXT: ret i8 [[EXTRACTED]]385;386; R600-LABEL: @test_atomicrmw_or_i8_global_agent(387; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)388; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32389; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3390; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3391; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]392; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1393; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32394; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]395; R600-NEXT: [[TMP4:%.*]] = atomicrmw or ptr addrspace(1) [[ALIGNEDADDR]], i32 [[VALOPERAND_SHIFTED]] syncscope("agent") seq_cst, align 4396; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[TMP2]]397; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8398; R600-NEXT: ret i8 [[EXTRACTED]]399;400 %res = atomicrmw or ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst401 ret i8 %res402}403 404define i8 @test_atomicrmw_xor_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {405; GCN-LABEL: @test_atomicrmw_xor_i8_global_agent(406; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)407; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64408; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3409; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3410; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32411; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]412; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1413; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32414; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]415; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4416; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]417; GCN: atomicrmw.start:418; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]419; GCN-NEXT: [[NEW:%.*]] = xor i32 [[LOADED]], [[VALOPERAND_SHIFTED]]420; GCN-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[NEW]] syncscope("agent") seq_cst seq_cst, align 4421; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1422; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0423; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]424; GCN: atomicrmw.end:425; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]426; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8427; GCN-NEXT: ret i8 [[EXTRACTED]]428;429; R600-LABEL: @test_atomicrmw_xor_i8_global_agent(430; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)431; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32432; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3433; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3434; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]435; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1436; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32437; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]438; R600-NEXT: [[TMP4:%.*]] = atomicrmw xor ptr addrspace(1) [[ALIGNEDADDR]], i32 [[VALOPERAND_SHIFTED]] syncscope("agent") seq_cst, align 4439; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[TMP2]]440; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8441; R600-NEXT: ret i8 [[EXTRACTED]]442;443 %res = atomicrmw xor ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst444 ret i8 %res445}446 447define i8 @test_atomicrmw_max_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {448; GCN-LABEL: @test_atomicrmw_max_i8_global_agent(449; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)450; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64451; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3452; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3453; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32454; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]455; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1456; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4457; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]458; GCN: atomicrmw.start:459; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]460; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]461; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8462; GCN-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[EXTRACTED]], [[VALUE:%.*]]463; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]464; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32465; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]466; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]467; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]468; GCN-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4469; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1470; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0471; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]472; GCN: atomicrmw.end:473; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]474; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8475; GCN-NEXT: ret i8 [[EXTRACTED3]]476;477; R600-LABEL: @test_atomicrmw_max_i8_global_agent(478; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)479; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32480; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3481; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3482; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]483; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1484; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4485; R600-NEXT: br label [[ATOMICRMW_START:%.*]]486; R600: atomicrmw.start:487; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]488; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]489; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8490; R600-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[EXTRACTED]], [[VALUE:%.*]]491; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]492; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32493; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]494; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]495; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]496; R600-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4497; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1498; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0499; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]500; R600: atomicrmw.end:501; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]502; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8503; R600-NEXT: ret i8 [[EXTRACTED3]]504;505 %res = atomicrmw max ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst506 ret i8 %res507}508 509define i8 @test_atomicrmw_min_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {510; GCN-LABEL: @test_atomicrmw_min_i8_global_agent(511; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)512; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64513; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3514; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3515; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32516; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]517; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1518; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4519; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]520; GCN: atomicrmw.start:521; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]522; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]523; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8524; GCN-NEXT: [[TMP4:%.*]] = icmp sle i8 [[EXTRACTED]], [[VALUE:%.*]]525; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]526; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32527; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]528; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]529; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]530; GCN-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4531; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1532; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0533; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]534; GCN: atomicrmw.end:535; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]536; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8537; GCN-NEXT: ret i8 [[EXTRACTED3]]538;539; R600-LABEL: @test_atomicrmw_min_i8_global_agent(540; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)541; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32542; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3543; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3544; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]545; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1546; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4547; R600-NEXT: br label [[ATOMICRMW_START:%.*]]548; R600: atomicrmw.start:549; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]550; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]551; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8552; R600-NEXT: [[TMP4:%.*]] = icmp sle i8 [[EXTRACTED]], [[VALUE:%.*]]553; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]554; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32555; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]556; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]557; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]558; R600-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4559; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1560; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0561; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]562; R600: atomicrmw.end:563; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]564; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8565; R600-NEXT: ret i8 [[EXTRACTED3]]566;567 %res = atomicrmw min ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst568 ret i8 %res569}570 571define i8 @test_atomicrmw_umax_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {572; GCN-LABEL: @test_atomicrmw_umax_i8_global_agent(573; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)574; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64575; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3576; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3577; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32578; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]579; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1580; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4581; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]582; GCN: atomicrmw.start:583; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]584; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]585; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8586; GCN-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]587; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]588; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32589; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]590; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]591; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]592; GCN-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4593; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1594; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0595; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]596; GCN: atomicrmw.end:597; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]598; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8599; GCN-NEXT: ret i8 [[EXTRACTED3]]600;601; R600-LABEL: @test_atomicrmw_umax_i8_global_agent(602; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)603; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32604; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3605; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3606; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]607; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1608; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4609; R600-NEXT: br label [[ATOMICRMW_START:%.*]]610; R600: atomicrmw.start:611; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]612; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]613; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8614; R600-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]615; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]616; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32617; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]618; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]619; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]620; R600-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4621; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1622; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0623; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]624; R600: atomicrmw.end:625; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]626; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8627; R600-NEXT: ret i8 [[EXTRACTED3]]628;629 %res = atomicrmw umax ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst630 ret i8 %res631}632 633define i8 @test_atomicrmw_umin_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {634; GCN-LABEL: @test_atomicrmw_umin_i8_global_agent(635; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)636; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64637; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3638; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3639; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32640; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]641; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1642; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4643; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]644; GCN: atomicrmw.start:645; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]646; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]647; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8648; GCN-NEXT: [[TMP4:%.*]] = icmp ule i8 [[EXTRACTED]], [[VALUE:%.*]]649; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]650; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32651; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]652; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]653; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]654; GCN-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4655; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1656; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0657; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]658; GCN: atomicrmw.end:659; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]660; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8661; GCN-NEXT: ret i8 [[EXTRACTED3]]662;663; R600-LABEL: @test_atomicrmw_umin_i8_global_agent(664; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)665; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32666; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3667; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3668; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]669; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1670; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4671; R600-NEXT: br label [[ATOMICRMW_START:%.*]]672; R600: atomicrmw.start:673; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]674; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]675; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8676; R600-NEXT: [[TMP4:%.*]] = icmp ule i8 [[EXTRACTED]], [[VALUE:%.*]]677; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]678; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32679; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]680; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]681; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]682; R600-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4683; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1684; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0685; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]686; R600: atomicrmw.end:687; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]688; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8689; R600-NEXT: ret i8 [[EXTRACTED3]]690;691 %res = atomicrmw umin ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst692 ret i8 %res693}694 695define i8 @test_cmpxchg_i8_global_agent(ptr addrspace(1) %out, i8 %in, i8 %old) {696; GCN-LABEL: @test_cmpxchg_i8_global_agent(697; GCN-NEXT: [[GEP:%.*]] = getelementptr i8, ptr addrspace(1) [[OUT:%.*]], i64 4698; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[GEP]], i64 -4)699; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[GEP]] to i64700; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3701; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3702; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32703; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]704; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1705; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[IN:%.*]] to i32706; GCN-NEXT: [[TMP4:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]707; GCN-NEXT: [[TMP5:%.*]] = zext i8 [[OLD:%.*]] to i32708; GCN-NEXT: [[TMP6:%.*]] = shl i32 [[TMP5]], [[SHIFTAMT]]709; GCN-NEXT: [[TMP7:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4710; GCN-NEXT: [[TMP8:%.*]] = and i32 [[TMP7]], [[INV_MASK]]711; GCN-NEXT: br label [[PARTWORD_CMPXCHG_LOOP:%.*]]712; GCN: partword.cmpxchg.loop:713; GCN-NEXT: [[TMP9:%.*]] = phi i32 [ [[TMP8]], [[TMP0:%.*]] ], [ [[TMP15:%.*]], [[PARTWORD_CMPXCHG_FAILURE:%.*]] ]714; GCN-NEXT: [[TMP10:%.*]] = or i32 [[TMP9]], [[TMP4]]715; GCN-NEXT: [[TMP11:%.*]] = or i32 [[TMP9]], [[TMP6]]716; GCN-NEXT: [[TMP12:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[TMP11]], i32 [[TMP10]] syncscope("agent") seq_cst seq_cst, align 4717; GCN-NEXT: [[TMP13:%.*]] = extractvalue { i32, i1 } [[TMP12]], 0718; GCN-NEXT: [[TMP14:%.*]] = extractvalue { i32, i1 } [[TMP12]], 1719; GCN-NEXT: br i1 [[TMP14]], label [[PARTWORD_CMPXCHG_END:%.*]], label [[PARTWORD_CMPXCHG_FAILURE]]720; GCN: partword.cmpxchg.failure:721; GCN-NEXT: [[TMP15]] = and i32 [[TMP13]], [[INV_MASK]]722; GCN-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP9]], [[TMP15]]723; GCN-NEXT: br i1 [[TMP16]], label [[PARTWORD_CMPXCHG_LOOP]], label [[PARTWORD_CMPXCHG_END]]724; GCN: partword.cmpxchg.end:725; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP13]], [[SHIFTAMT]]726; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8727; GCN-NEXT: [[TMP17:%.*]] = insertvalue { i8, i1 } poison, i8 [[EXTRACTED]], 0728; GCN-NEXT: [[TMP18:%.*]] = insertvalue { i8, i1 } [[TMP17]], i1 [[TMP14]], 1729; GCN-NEXT: [[EXTRACT:%.*]] = extractvalue { i8, i1 } [[TMP18]], 0730; GCN-NEXT: ret i8 [[EXTRACT]]731;732; R600-LABEL: @test_cmpxchg_i8_global_agent(733; R600-NEXT: [[GEP:%.*]] = getelementptr i8, ptr addrspace(1) [[OUT:%.*]], i64 4734; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[GEP]], i32 -4)735; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[GEP]] to i32736; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3737; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3738; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]739; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1740; R600-NEXT: [[TMP3:%.*]] = zext i8 [[IN:%.*]] to i32741; R600-NEXT: [[TMP4:%.*]] = shl i32 [[TMP3]], [[TMP2]]742; R600-NEXT: [[TMP5:%.*]] = zext i8 [[OLD:%.*]] to i32743; R600-NEXT: [[TMP6:%.*]] = shl i32 [[TMP5]], [[TMP2]]744; R600-NEXT: [[TMP7:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4745; R600-NEXT: [[TMP8:%.*]] = and i32 [[TMP7]], [[INV_MASK]]746; R600-NEXT: br label [[PARTWORD_CMPXCHG_LOOP:%.*]]747; R600: partword.cmpxchg.loop:748; R600-NEXT: [[TMP9:%.*]] = phi i32 [ [[TMP8]], [[TMP0:%.*]] ], [ [[TMP15:%.*]], [[PARTWORD_CMPXCHG_FAILURE:%.*]] ]749; R600-NEXT: [[TMP10:%.*]] = or i32 [[TMP9]], [[TMP4]]750; R600-NEXT: [[TMP11:%.*]] = or i32 [[TMP9]], [[TMP6]]751; R600-NEXT: [[TMP12:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[TMP11]], i32 [[TMP10]] syncscope("agent") seq_cst seq_cst, align 4752; R600-NEXT: [[TMP13:%.*]] = extractvalue { i32, i1 } [[TMP12]], 0753; R600-NEXT: [[TMP14:%.*]] = extractvalue { i32, i1 } [[TMP12]], 1754; R600-NEXT: br i1 [[TMP14]], label [[PARTWORD_CMPXCHG_END:%.*]], label [[PARTWORD_CMPXCHG_FAILURE]]755; R600: partword.cmpxchg.failure:756; R600-NEXT: [[TMP15]] = and i32 [[TMP13]], [[INV_MASK]]757; R600-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP9]], [[TMP15]]758; R600-NEXT: br i1 [[TMP16]], label [[PARTWORD_CMPXCHG_LOOP]], label [[PARTWORD_CMPXCHG_END]]759; R600: partword.cmpxchg.end:760; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP13]], [[TMP2]]761; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8762; R600-NEXT: [[TMP17:%.*]] = insertvalue { i8, i1 } poison, i8 [[EXTRACTED]], 0763; R600-NEXT: [[TMP18:%.*]] = insertvalue { i8, i1 } [[TMP17]], i1 [[TMP14]], 1764; R600-NEXT: [[EXTRACT:%.*]] = extractvalue { i8, i1 } [[TMP18]], 0765; R600-NEXT: ret i8 [[EXTRACT]]766;767 %gep = getelementptr i8, ptr addrspace(1) %out, i64 4768 %res = cmpxchg ptr addrspace(1) %gep, i8 %old, i8 %in syncscope("agent") seq_cst seq_cst769 %extract = extractvalue {i8, i1} %res, 0770 ret i8 %extract771}772 773define i8 @test_cmpxchg_i8_local_align2(ptr addrspace(3) %out, i8 %in, i8 %old) {774; CHECK-LABEL: @test_cmpxchg_i8_local_align2(775; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr addrspace(3) [[OUT:%.*]], i64 4776; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[GEP]], i32 -4)777; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(3) [[GEP]] to i32778; CHECK-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3779; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3780; CHECK-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]781; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1782; CHECK-NEXT: [[TMP3:%.*]] = zext i8 [[IN:%.*]] to i32783; CHECK-NEXT: [[TMP4:%.*]] = shl i32 [[TMP3]], [[TMP2]]784; CHECK-NEXT: [[TMP5:%.*]] = zext i8 [[OLD:%.*]] to i32785; CHECK-NEXT: [[TMP6:%.*]] = shl i32 [[TMP5]], [[TMP2]]786; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr addrspace(3) [[ALIGNEDADDR]], align 4787; CHECK-NEXT: [[TMP8:%.*]] = and i32 [[TMP7]], [[INV_MASK]]788; CHECK-NEXT: br label [[PARTWORD_CMPXCHG_LOOP:%.*]]789; CHECK: partword.cmpxchg.loop:790; CHECK-NEXT: [[TMP9:%.*]] = phi i32 [ [[TMP8]], [[TMP0:%.*]] ], [ [[TMP15:%.*]], [[PARTWORD_CMPXCHG_FAILURE:%.*]] ]791; CHECK-NEXT: [[TMP10:%.*]] = or i32 [[TMP9]], [[TMP4]]792; CHECK-NEXT: [[TMP11:%.*]] = or i32 [[TMP9]], [[TMP6]]793; CHECK-NEXT: [[TMP12:%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[TMP11]], i32 [[TMP10]] seq_cst seq_cst, align 4794; CHECK-NEXT: [[TMP13:%.*]] = extractvalue { i32, i1 } [[TMP12]], 0795; CHECK-NEXT: [[TMP14:%.*]] = extractvalue { i32, i1 } [[TMP12]], 1796; CHECK-NEXT: br i1 [[TMP14]], label [[PARTWORD_CMPXCHG_END:%.*]], label [[PARTWORD_CMPXCHG_FAILURE]]797; CHECK: partword.cmpxchg.failure:798; CHECK-NEXT: [[TMP15]] = and i32 [[TMP13]], [[INV_MASK]]799; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP9]], [[TMP15]]800; CHECK-NEXT: br i1 [[TMP16]], label [[PARTWORD_CMPXCHG_LOOP]], label [[PARTWORD_CMPXCHG_END]]801; CHECK: partword.cmpxchg.end:802; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP13]], [[TMP2]]803; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8804; CHECK-NEXT: [[TMP17:%.*]] = insertvalue { i8, i1 } poison, i8 [[EXTRACTED]], 0805; CHECK-NEXT: [[TMP18:%.*]] = insertvalue { i8, i1 } [[TMP17]], i1 [[TMP14]], 1806; CHECK-NEXT: [[EXTRACT:%.*]] = extractvalue { i8, i1 } [[TMP18]], 0807; CHECK-NEXT: ret i8 [[EXTRACT]]808;809 %gep = getelementptr i8, ptr addrspace(3) %out, i64 4810 %res = cmpxchg ptr addrspace(3) %gep, i8 %old, i8 %in seq_cst seq_cst, align 2811 %extract = extractvalue {i8, i1} %res, 0812 ret i8 %extract813}814 815define i8 @test_atomicrmw_inc_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {816; GCN-LABEL: @test_atomicrmw_inc_i8_global_agent(817; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)818; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64819; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3820; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3821; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32822; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]823; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1824; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4825; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]826; GCN: atomicrmw.start:827; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]828; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]829; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8830; GCN-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1831; GCN-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]832; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]833; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32834; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]835; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]836; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]837; GCN-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4838; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1839; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0840; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]841; GCN: atomicrmw.end:842; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]843; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8844; GCN-NEXT: ret i8 [[EXTRACTED3]]845;846; R600-LABEL: @test_atomicrmw_inc_i8_global_agent(847; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)848; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32849; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3850; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3851; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]852; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1853; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4854; R600-NEXT: br label [[ATOMICRMW_START:%.*]]855; R600: atomicrmw.start:856; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]857; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]858; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8859; R600-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1860; R600-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]861; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]862; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32863; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]864; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]865; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]866; R600-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4867; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1868; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0869; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]870; R600: atomicrmw.end:871; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]872; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8873; R600-NEXT: ret i8 [[EXTRACTED3]]874;875 %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst876 ret i8 %res877}878 879define i8 @test_atomicrmw_inc_i8_global_agent_align2(ptr addrspace(1) %ptr, i8 %value) {880; GCN-LABEL: @test_atomicrmw_inc_i8_global_agent_align2(881; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)882; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64883; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3884; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3885; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32886; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]887; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1888; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4889; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]890; GCN: atomicrmw.start:891; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]892; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]893; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8894; GCN-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1895; GCN-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]896; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]897; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32898; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]899; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]900; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]901; GCN-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4902; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1903; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0904; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]905; GCN: atomicrmw.end:906; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]907; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8908; GCN-NEXT: ret i8 [[EXTRACTED3]]909;910; R600-LABEL: @test_atomicrmw_inc_i8_global_agent_align2(911; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)912; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i32913; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3914; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3915; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]916; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1917; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4918; R600-NEXT: br label [[ATOMICRMW_START:%.*]]919; R600: atomicrmw.start:920; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]921; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]922; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8923; R600-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1924; R600-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]925; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]926; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32927; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]928; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]929; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]930; R600-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4931; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1932; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0933; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]934; R600: atomicrmw.end:935; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]936; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8937; R600-NEXT: ret i8 [[EXTRACTED3]]938;939 %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, align 2940 ret i8 %res941}942 943define i8 @test_atomicrmw_inc_i8_global_agent_align4(ptr addrspace(1) %ptr, i8 %value) {944; CHECK-LABEL: @test_atomicrmw_inc_i8_global_agent_align4(945; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR:%.*]], align 4946; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]947; CHECK: atomicrmw.start:948; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]949; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i8950; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[EXTRACTED]], 1951; CHECK-NEXT: [[TMP3:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]952; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i8 0, i8 [[TMP2]]953; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32954; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -256955; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]956; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 4957; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1958; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 0959; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]960; CHECK: atomicrmw.end:961; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i8962; CHECK-NEXT: ret i8 [[EXTRACTED1]]963;964 %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, align 4965 ret i8 %res966}967 968define i8 @test_atomicrmw_inc_i8_local(ptr addrspace(3) %ptr, i8 %value) {969; CHECK-LABEL: @test_atomicrmw_inc_i8_local(970; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[PTR:%.*]], i32 -4)971; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(3) [[PTR]] to i32972; CHECK-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 3973; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 3974; CHECK-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]975; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1976; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) [[ALIGNEDADDR]], align 4977; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]978; CHECK: atomicrmw.start:979; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]980; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]981; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8982; CHECK-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1983; CHECK-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]984; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]985; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32986; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]987; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]988; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]989; CHECK-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4990; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1991; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0992; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]993; CHECK: atomicrmw.end:994; CHECK-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]995; CHECK-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8996; CHECK-NEXT: ret i8 [[EXTRACTED3]]997;998 %res = atomicrmw uinc_wrap ptr addrspace(3) %ptr, i8 %value seq_cst999 ret i8 %res1000}1001 1002define i8 @test_atomicrmw_inc_i8_local_align2(ptr addrspace(3) %ptr, i8 %value) {1003; CHECK-LABEL: @test_atomicrmw_inc_i8_local_align2(1004; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[PTR:%.*]], i32 -4)1005; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(3) [[PTR]] to i321006; CHECK-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31007; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31008; CHECK-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1009; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11010; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) [[ALIGNEDADDR]], align 41011; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1012; CHECK: atomicrmw.start:1013; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1014; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1015; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81016; CHECK-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 11017; CHECK-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]1018; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]1019; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321020; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1021; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1022; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1023; CHECK-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 41024; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11025; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01026; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1027; CHECK: atomicrmw.end:1028; CHECK-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1029; CHECK-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81030; CHECK-NEXT: ret i8 [[EXTRACTED3]]1031;1032 %res = atomicrmw uinc_wrap ptr addrspace(3) %ptr, i8 %value seq_cst, align 21033 ret i8 %res1034}1035 1036define i8 @test_atomicrmw_inc_i8_local_align4(ptr addrspace(3) %ptr, i8 %value) {1037; CHECK-LABEL: @test_atomicrmw_inc_i8_local_align4(1038; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) [[PTR:%.*]], align 41039; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1040; CHECK: atomicrmw.start:1041; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1042; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i81043; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[EXTRACTED]], 11044; CHECK-NEXT: [[TMP3:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]1045; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i8 0, i8 [[TMP2]]1046; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321047; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -2561048; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]1049; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr addrspace(3) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 41050; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11051; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01052; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1053; CHECK: atomicrmw.end:1054; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i81055; CHECK-NEXT: ret i8 [[EXTRACTED1]]1056;1057 %res = atomicrmw uinc_wrap ptr addrspace(3) %ptr, i8 %value seq_cst, align 41058 ret i8 %res1059}1060 1061define i8 @test_atomicrmw_inc_i8_flat_agent(ptr %ptr, i8 %value) {1062; GCN-LABEL: @test_atomicrmw_inc_i8_flat_agent(1063; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)1064; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i641065; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31066; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31067; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321068; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1069; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11070; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41071; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1072; GCN: atomicrmw.start:1073; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1074; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]1075; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81076; GCN-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 11077; GCN-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]1078; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]1079; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321080; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]1081; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1082; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1083; GCN-NEXT: [[TMP6:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41084; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11085; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01086; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1087; GCN: atomicrmw.end:1088; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1089; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81090; GCN-NEXT: ret i8 [[EXTRACTED3]]1091;1092; R600-LABEL: @test_atomicrmw_inc_i8_flat_agent(1093; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[PTR:%.*]], i32 -4)1094; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i321095; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31096; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31097; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1098; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11099; R600-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41100; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1101; R600: atomicrmw.start:1102; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1103; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1104; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81105; R600-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 11106; R600-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]1107; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]1108; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321109; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1110; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1111; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1112; R600-NEXT: [[TMP6:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41113; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11114; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01115; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1116; R600: atomicrmw.end:1117; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1118; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81119; R600-NEXT: ret i8 [[EXTRACTED3]]1120;1121 %res = atomicrmw uinc_wrap ptr %ptr, i8 %value syncscope("agent") seq_cst1122 ret i8 %res1123}1124 1125define i8 @test_atomicrmw_inc_i8_flat_agent_align2(ptr %ptr, i8 %value) {1126; GCN-LABEL: @test_atomicrmw_inc_i8_flat_agent_align2(1127; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)1128; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i641129; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31130; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31131; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321132; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1133; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11134; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41135; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1136; GCN: atomicrmw.start:1137; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1138; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]1139; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81140; GCN-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 11141; GCN-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]1142; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]1143; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321144; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]1145; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1146; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1147; GCN-NEXT: [[TMP6:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41148; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11149; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01150; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1151; GCN: atomicrmw.end:1152; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1153; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81154; GCN-NEXT: ret i8 [[EXTRACTED3]]1155;1156; R600-LABEL: @test_atomicrmw_inc_i8_flat_agent_align2(1157; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[PTR:%.*]], i32 -4)1158; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i321159; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31160; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31161; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1162; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11163; R600-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41164; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1165; R600: atomicrmw.start:1166; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1167; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1168; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81169; R600-NEXT: [[TMP4:%.*]] = add i8 [[EXTRACTED]], 11170; R600-NEXT: [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]1171; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]1172; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321173; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1174; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1175; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1176; R600-NEXT: [[TMP6:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41177; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11178; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01179; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1180; R600: atomicrmw.end:1181; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1182; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81183; R600-NEXT: ret i8 [[EXTRACTED3]]1184;1185 %res = atomicrmw uinc_wrap ptr %ptr, i8 %value syncscope("agent") seq_cst, align 21186 ret i8 %res1187}1188 1189define i8 @test_atomicrmw_inc_i8_flat_agent_align4(ptr %ptr, i8 %value) {1190; CHECK-LABEL: @test_atomicrmw_inc_i8_flat_agent_align4(1191; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[PTR:%.*]], align 41192; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1193; CHECK: atomicrmw.start:1194; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1195; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i81196; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[EXTRACTED]], 11197; CHECK-NEXT: [[TMP3:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]1198; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP3]], i8 0, i8 [[TMP2]]1199; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321200; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -2561201; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]1202; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41203; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 11204; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 01205; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1206; CHECK: atomicrmw.end:1207; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i81208; CHECK-NEXT: ret i8 [[EXTRACTED1]]1209;1210 %res = atomicrmw uinc_wrap ptr %ptr, i8 %value syncscope("agent") seq_cst, align 41211 ret i8 %res1212}1213 1214define i8 @test_atomicrmw_dec_i8_global_agent(ptr addrspace(1) %ptr, i8 %value) {1215; GCN-LABEL: @test_atomicrmw_dec_i8_global_agent(1216; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)1217; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i641218; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31219; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31220; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321221; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1222; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11223; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41224; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1225; GCN: atomicrmw.start:1226; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1227; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]1228; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81229; GCN-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11230; GCN-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01231; GCN-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1232; GCN-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1233; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1234; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321235; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]1236; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1237; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1238; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41239; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11240; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01241; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1242; GCN: atomicrmw.end:1243; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1244; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81245; GCN-NEXT: ret i8 [[EXTRACTED3]]1246;1247; R600-LABEL: @test_atomicrmw_dec_i8_global_agent(1248; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)1249; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i321250; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31251; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31252; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1253; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11254; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41255; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1256; R600: atomicrmw.start:1257; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1258; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1259; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81260; R600-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11261; R600-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01262; R600-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1263; R600-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1264; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1265; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321266; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1267; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1268; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1269; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41270; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11271; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01272; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1273; R600: atomicrmw.end:1274; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1275; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81276; R600-NEXT: ret i8 [[EXTRACTED3]]1277;1278 %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst1279 ret i8 %res1280}1281 1282define i8 @test_atomicrmw_dec_i8_global_agent_align2(ptr addrspace(1) %ptr, i8 %value) {1283; GCN-LABEL: @test_atomicrmw_dec_i8_global_agent_align2(1284; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)1285; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i641286; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31287; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31288; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321289; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1290; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11291; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41292; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1293; GCN: atomicrmw.start:1294; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1295; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]1296; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81297; GCN-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11298; GCN-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01299; GCN-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1300; GCN-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1301; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1302; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321303; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]1304; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1305; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1306; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41307; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11308; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01309; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1310; GCN: atomicrmw.end:1311; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1312; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81313; GCN-NEXT: ret i8 [[EXTRACTED3]]1314;1315; R600-LABEL: @test_atomicrmw_dec_i8_global_agent_align2(1316; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)1317; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i321318; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31319; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31320; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1321; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11322; R600-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41323; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1324; R600: atomicrmw.start:1325; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1326; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1327; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81328; R600-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11329; R600-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01330; R600-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1331; R600-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1332; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1333; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321334; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1335; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1336; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1337; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41338; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11339; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01340; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1341; R600: atomicrmw.end:1342; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1343; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81344; R600-NEXT: ret i8 [[EXTRACTED3]]1345;1346 %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, align 21347 ret i8 %res1348}1349 1350define i8 @test_atomicrmw_dec_i8_global_agent_align4(ptr addrspace(1) %ptr, i8 %value) {1351; CHECK-LABEL: @test_atomicrmw_dec_i8_global_agent_align4(1352; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR:%.*]], align 41353; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1354; CHECK: atomicrmw.start:1355; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1356; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i81357; CHECK-NEXT: [[TMP2:%.*]] = sub i8 [[EXTRACTED]], 11358; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[EXTRACTED]], 01359; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1360; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1361; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 [[VALUE]], i8 [[TMP2]]1362; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321363; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -2561364; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]1365; CHECK-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41366; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11367; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01368; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1369; CHECK: atomicrmw.end:1370; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i81371; CHECK-NEXT: ret i8 [[EXTRACTED1]]1372;1373 %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, align 41374 ret i8 %res1375}1376 1377define i8 @test_atomicrmw_dec_i8_local(ptr addrspace(3) %ptr, i8 %value) {1378; CHECK-LABEL: @test_atomicrmw_dec_i8_local(1379; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[PTR:%.*]], i32 -4)1380; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(3) [[PTR]] to i321381; CHECK-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31382; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31383; CHECK-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1384; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11385; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) [[ALIGNEDADDR]], align 41386; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1387; CHECK: atomicrmw.start:1388; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1389; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1390; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81391; CHECK-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11392; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01393; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1394; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1395; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1396; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321397; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1398; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1399; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1400; CHECK-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 41401; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11402; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01403; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1404; CHECK: atomicrmw.end:1405; CHECK-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1406; CHECK-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81407; CHECK-NEXT: ret i8 [[EXTRACTED3]]1408;1409 %res = atomicrmw udec_wrap ptr addrspace(3) %ptr, i8 %value seq_cst1410 ret i8 %res1411}1412 1413define i8 @test_atomicrmw_dec_i8_local_align2(ptr addrspace(3) %ptr, i8 %value) {1414; CHECK-LABEL: @test_atomicrmw_dec_i8_local_align2(1415; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[PTR:%.*]], i32 -4)1416; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(3) [[PTR]] to i321417; CHECK-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31418; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31419; CHECK-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1420; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11421; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr addrspace(3) [[ALIGNEDADDR]], align 41422; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1423; CHECK: atomicrmw.start:1424; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1425; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1426; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81427; CHECK-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11428; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01429; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1430; CHECK-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1431; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1432; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321433; CHECK-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1434; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1435; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1436; CHECK-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(3) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 41437; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11438; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01439; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1440; CHECK: atomicrmw.end:1441; CHECK-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1442; CHECK-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81443; CHECK-NEXT: ret i8 [[EXTRACTED3]]1444;1445 %res = atomicrmw udec_wrap ptr addrspace(3) %ptr, i8 %value seq_cst, align 21446 ret i8 %res1447}1448 1449define i8 @test_atomicrmw_dec_i8_local_align4(ptr addrspace(3) %ptr, i8 %value) {1450; CHECK-LABEL: @test_atomicrmw_dec_i8_local_align4(1451; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(3) [[PTR:%.*]], align 41452; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1453; CHECK: atomicrmw.start:1454; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1455; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i81456; CHECK-NEXT: [[TMP2:%.*]] = sub i8 [[EXTRACTED]], 11457; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[EXTRACTED]], 01458; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1459; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1460; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 [[VALUE]], i8 [[TMP2]]1461; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321462; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -2561463; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]1464; CHECK-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(3) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 41465; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11466; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01467; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1468; CHECK: atomicrmw.end:1469; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i81470; CHECK-NEXT: ret i8 [[EXTRACTED1]]1471;1472 %res = atomicrmw udec_wrap ptr addrspace(3) %ptr, i8 %value seq_cst, align 41473 ret i8 %res1474}1475 1476define i8 @test_atomicrmw_dec_i8_flat_agent(ptr %ptr, i8 %value) {1477; GCN-LABEL: @test_atomicrmw_dec_i8_flat_agent(1478; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)1479; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i641480; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31481; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31482; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321483; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1484; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11485; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41486; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1487; GCN: atomicrmw.start:1488; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1489; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]1490; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81491; GCN-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11492; GCN-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01493; GCN-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1494; GCN-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1495; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1496; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321497; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]1498; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1499; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1500; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41501; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11502; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01503; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1504; GCN: atomicrmw.end:1505; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1506; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81507; GCN-NEXT: ret i8 [[EXTRACTED3]]1508;1509; R600-LABEL: @test_atomicrmw_dec_i8_flat_agent(1510; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[PTR:%.*]], i32 -4)1511; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i321512; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31513; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31514; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1515; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11516; R600-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41517; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1518; R600: atomicrmw.start:1519; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1520; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1521; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81522; R600-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11523; R600-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01524; R600-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1525; R600-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1526; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1527; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321528; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1529; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1530; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1531; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41532; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11533; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01534; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1535; R600: atomicrmw.end:1536; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1537; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81538; R600-NEXT: ret i8 [[EXTRACTED3]]1539;1540 %res = atomicrmw udec_wrap ptr %ptr, i8 %value syncscope("agent") seq_cst1541 ret i8 %res1542}1543 1544define i8 @test_atomicrmw_dec_i8_flat_agent_align2(ptr %ptr, i8 %value) {1545; GCN-LABEL: @test_atomicrmw_dec_i8_flat_agent_align2(1546; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)1547; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i641548; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31549; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31550; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321551; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1552; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11553; GCN-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41554; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1555; GCN: atomicrmw.start:1556; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1557; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]1558; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81559; GCN-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11560; GCN-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01561; GCN-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1562; GCN-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1563; GCN-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1564; GCN-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321565; GCN-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]1566; GCN-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1567; GCN-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1568; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41569; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11570; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01571; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1572; GCN: atomicrmw.end:1573; GCN-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1574; GCN-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81575; GCN-NEXT: ret i8 [[EXTRACTED3]]1576;1577; R600-LABEL: @test_atomicrmw_dec_i8_flat_agent_align2(1578; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[PTR:%.*]], i32 -4)1579; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i321580; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31581; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31582; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1583; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11584; R600-NEXT: [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 41585; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1586; R600: atomicrmw.start:1587; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1588; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[TMP2]]1589; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81590; R600-NEXT: [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 11591; R600-NEXT: [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 01592; R600-NEXT: [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1593; R600-NEXT: [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]1594; R600-NEXT: [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]1595; R600-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321596; R600-NEXT: [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[TMP2]]1597; R600-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1598; R600-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]1599; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41600; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11601; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01602; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1603; R600: atomicrmw.end:1604; R600-NEXT: [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1605; R600-NEXT: [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i81606; R600-NEXT: ret i8 [[EXTRACTED3]]1607;1608 %res = atomicrmw udec_wrap ptr %ptr, i8 %value syncscope("agent") seq_cst, align 21609 ret i8 %res1610}1611 1612define i8 @test_atomicrmw_dec_i8_flat_agent_align4(ptr %ptr, i8 %value) {1613; CHECK-LABEL: @test_atomicrmw_dec_i8_flat_agent_align4(1614; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[PTR:%.*]], align 41615; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1616; CHECK: atomicrmw.start:1617; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1618; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i81619; CHECK-NEXT: [[TMP2:%.*]] = sub i8 [[EXTRACTED]], 11620; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[EXTRACTED]], 01621; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]1622; CHECK-NEXT: [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]1623; CHECK-NEXT: [[NEW:%.*]] = select i1 [[TMP5]], i8 [[VALUE]], i8 [[TMP2]]1624; CHECK-NEXT: [[EXTENDED:%.*]] = zext i8 [[NEW]] to i321625; CHECK-NEXT: [[UNMASKED:%.*]] = and i32 [[LOADED]], -2561626; CHECK-NEXT: [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]1627; CHECK-NEXT: [[TMP6:%.*]] = cmpxchg ptr [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] syncscope("agent") seq_cst seq_cst, align 41628; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11629; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01630; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1631; CHECK: atomicrmw.end:1632; CHECK-NEXT: [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i81633; CHECK-NEXT: ret i8 [[EXTRACTED1]]1634;1635 %res = atomicrmw udec_wrap ptr %ptr, i8 %value syncscope("agent") seq_cst, align 41636 ret i8 %res1637}1638 1639define i8 @test_atomicrmw_xchg_i8_buffer_fat_agent(ptr addrspace(7) %ptr, i8 %value) {1640; CHECK-LABEL: @test_atomicrmw_xchg_i8_buffer_fat_agent(1641; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(7) @llvm.ptrmask.p7.i32(ptr addrspace(7) [[PTR:%.*]], i32 -4)1642; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(7) [[PTR]] to i321643; CHECK-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31644; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31645; CHECK-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1646; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11647; CHECK-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321648; CHECK-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]1649; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(7) [[ALIGNEDADDR]], align 41650; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1651; CHECK: atomicrmw.start:1652; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1653; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1654; CHECK-NEXT: [[TMP6:%.*]] = or i32 [[TMP5]], [[VALOPERAND_SHIFTED]]1655; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr addrspace(7) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP6]] syncscope("agent") seq_cst seq_cst, align 41656; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 11657; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 01658; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1659; CHECK: atomicrmw.end:1660; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1661; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81662; CHECK-NEXT: ret i8 [[EXTRACTED]]1663;1664 %res = atomicrmw xchg ptr addrspace(7) %ptr, i8 %value syncscope("agent") seq_cst1665 ret i8 %res1666}1667 1668define i8 @test_atomicrmw_xchg_i8_buffer_fat_agent_align4(ptr addrspace(7) %ptr, i8 %value) {1669; CHECK-LABEL: @test_atomicrmw_xchg_i8_buffer_fat_agent_align4(1670; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[VALUE:%.*]] to i321671; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(7) [[PTR:%.*]], align 41672; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1673; CHECK: atomicrmw.start:1674; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1675; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[LOADED]], -2561676; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP3]], [[TMP1]]1677; CHECK-NEXT: [[TMP5:%.*]] = cmpxchg ptr addrspace(7) [[PTR]], i32 [[LOADED]], i32 [[TMP4]] syncscope("agent") seq_cst seq_cst, align 41678; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 11679; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 01680; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1681; CHECK: atomicrmw.end:1682; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[NEWLOADED]] to i81683; CHECK-NEXT: ret i8 [[EXTRACTED]]1684;1685 %res = atomicrmw xchg ptr addrspace(7) %ptr, i8 %value syncscope("agent") seq_cst, align 41686 ret i8 %res1687}1688 1689define i8 @test_atomicrmw_add_i8_buffer_fat_agent(ptr addrspace(7) %ptr, i8 %value) {1690; CHECK-LABEL: @test_atomicrmw_add_i8_buffer_fat_agent(1691; CHECK-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(7) @llvm.ptrmask.p7.i32(ptr addrspace(7) [[PTR:%.*]], i32 -4)1692; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(7) [[PTR]] to i321693; CHECK-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31694; CHECK-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31695; CHECK-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1696; CHECK-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11697; CHECK-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321698; CHECK-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]1699; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(7) [[ALIGNEDADDR]], align 41700; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1701; CHECK: atomicrmw.start:1702; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1703; CHECK-NEXT: [[NEW:%.*]] = add i32 [[LOADED]], [[VALOPERAND_SHIFTED]]1704; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]1705; CHECK-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1706; CHECK-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]1707; CHECK-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(7) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 41708; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11709; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01710; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1711; CHECK: atomicrmw.end:1712; CHECK-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1713; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81714; CHECK-NEXT: ret i8 [[EXTRACTED]]1715;1716 %res = atomicrmw add ptr addrspace(7) %ptr, i8 %value syncscope("agent") seq_cst1717 ret i8 %res1718}1719 1720define i8 @test_atomicrmw_add_i8_buffer_fat_agent_align4(ptr addrspace(7) %ptr, i8 %value) {1721; CHECK-LABEL: @test_atomicrmw_add_i8_buffer_fat_agent_align4(1722; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[VALUE:%.*]] to i321723; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr addrspace(7) [[PTR:%.*]], align 41724; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]1725; CHECK: atomicrmw.start:1726; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1727; CHECK-NEXT: [[NEW:%.*]] = add i32 [[LOADED]], [[TMP1]]1728; CHECK-NEXT: [[TMP3:%.*]] = and i32 [[NEW]], 2551729; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[LOADED]], -2561730; CHECK-NEXT: [[TMP5:%.*]] = or i32 [[TMP4]], [[TMP3]]1731; CHECK-NEXT: [[TMP6:%.*]] = cmpxchg ptr addrspace(7) [[PTR]], i32 [[LOADED]], i32 [[TMP5]] syncscope("agent") seq_cst seq_cst, align 41732; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 11733; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 01734; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1735; CHECK: atomicrmw.end:1736; CHECK-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[NEWLOADED]] to i81737; CHECK-NEXT: ret i8 [[EXTRACTED]]1738;1739 %res = atomicrmw add ptr addrspace(7) %ptr, i8 %value syncscope("agent") seq_cst, align 41740 ret i8 %res1741}1742 1743define i8 @test_atomicrmw_sub_i8_global_agent__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i8 %value) {1744; GCN-LABEL: @test_atomicrmw_sub_i8_global_agent__amdgpu_no_remote_memory(1745; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)1746; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i641747; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31748; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31749; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321750; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1751; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11752; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321753; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]1754; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41755; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1756; GCN: atomicrmw.start:1757; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1758; GCN-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]1759; GCN-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]1760; GCN-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1761; GCN-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]1762; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 41763; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11764; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01765; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1766; GCN: atomicrmw.end:1767; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1768; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81769; GCN-NEXT: ret i8 [[EXTRACTED]]1770;1771; R600-LABEL: @test_atomicrmw_sub_i8_global_agent__amdgpu_no_remote_memory(1772; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)1773; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i321774; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31775; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31776; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1777; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11778; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321779; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]1780; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41781; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1782; R600: atomicrmw.start:1783; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1784; R600-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]1785; R600-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]1786; R600-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1787; R600-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]1788; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 41789; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11790; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01791; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1792; R600: atomicrmw.end:1793; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1794; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81795; R600-NEXT: ret i8 [[EXTRACTED]]1796;1797 %res = atomicrmw sub ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, !amdgpu.no.remote.memory !01798 ret i8 %res1799}1800 1801define i8 @test_atomicrmw_sub_i8_global_agent__amdgpu_no_fine_grained_memory(ptr addrspace(1) %ptr, i8 %value) {1802; GCN-LABEL: @test_atomicrmw_sub_i8_global_agent__amdgpu_no_fine_grained_memory(1803; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)1804; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i641805; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31806; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31807; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321808; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1809; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11810; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321811; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]1812; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41813; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1814; GCN: atomicrmw.start:1815; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1816; GCN-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]1817; GCN-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]1818; GCN-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1819; GCN-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]1820; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 41821; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11822; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01823; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1824; GCN: atomicrmw.end:1825; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1826; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81827; GCN-NEXT: ret i8 [[EXTRACTED]]1828;1829; R600-LABEL: @test_atomicrmw_sub_i8_global_agent__amdgpu_no_fine_grained_memory(1830; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)1831; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i321832; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31833; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31834; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1835; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11836; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321837; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]1838; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41839; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1840; R600: atomicrmw.start:1841; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1842; R600-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]1843; R600-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]1844; R600-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1845; R600-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]1846; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 41847; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11848; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01849; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1850; R600: atomicrmw.end:1851; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1852; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81853; R600-NEXT: ret i8 [[EXTRACTED]]1854;1855 %res = atomicrmw sub ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !01856 ret i8 %res1857}1858 1859define i8 @test_atomicrmw_sub_i8_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(ptr addrspace(1) %ptr, i8 %value) {1860; GCN-LABEL: @test_atomicrmw_sub_i8_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(1861; GCN-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)1862; GCN-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i641863; GCN-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 31864; GCN-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 31865; GCN-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i321866; GCN-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]1867; GCN-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11868; GCN-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321869; GCN-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]1870; GCN-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41871; GCN-NEXT: br label [[ATOMICRMW_START:%.*]]1872; GCN: atomicrmw.start:1873; GCN-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1874; GCN-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]1875; GCN-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]1876; GCN-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1877; GCN-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]1878; GCN-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 41879; GCN-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11880; GCN-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01881; GCN-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1882; GCN: atomicrmw.end:1883; GCN-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]1884; GCN-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81885; GCN-NEXT: ret i8 [[EXTRACTED]]1886;1887; R600-LABEL: @test_atomicrmw_sub_i8_global_agent__amdgpu_no_fine_grained_memory__amdgpu_no_remote_memory(1888; R600-NEXT: [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i32(ptr addrspace(1) [[PTR:%.*]], i32 -4)1889; R600-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i321890; R600-NEXT: [[PTRLSB:%.*]] = and i32 [[TMP1]], 31891; R600-NEXT: [[TMP2:%.*]] = shl i32 [[PTRLSB]], 31892; R600-NEXT: [[MASK:%.*]] = shl i32 255, [[TMP2]]1893; R600-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -11894; R600-NEXT: [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i321895; R600-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[TMP2]]1896; R600-NEXT: [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 41897; R600-NEXT: br label [[ATOMICRMW_START:%.*]]1898; R600: atomicrmw.start:1899; R600-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]1900; R600-NEXT: [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]1901; R600-NEXT: [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]1902; R600-NEXT: [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]1903; R600-NEXT: [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]1904; R600-NEXT: [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] syncscope("agent") seq_cst seq_cst, align 41905; R600-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 11906; R600-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 01907; R600-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]1908; R600: atomicrmw.end:1909; R600-NEXT: [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[TMP2]]1910; R600-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i81911; R600-NEXT: ret i8 [[EXTRACTED]]1912;1913 %res = atomicrmw sub ptr addrspace(1) %ptr, i8 %value syncscope("agent") seq_cst, !amdgpu.no.fine.grained.memory !0, !amdgpu.no.remote.memory !01914 ret i8 %res1915}1916 1917!0 = !{}1918