brintos

brintos / llvm-project-archived public Read only

0
0
Text · 49.9 KiB · b548943 Raw
844 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 %s3 4define i8 @test_atomicrmw_xchg_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {5; CHECK-LABEL: @test_atomicrmw_xchg_i8_global_system(6; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)7; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i648; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 39; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 310; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3211; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]12; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -113; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i3214; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]15; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 416; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]17; CHECK:       atomicrmw.start:18; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]19; CHECK-NEXT:    [[TMP5:%.*]] = and i32 [[LOADED]], [[INV_MASK]]20; CHECK-NEXT:    [[TMP6:%.*]] = or i32 [[TMP5]], [[VALOPERAND_SHIFTED]]21; CHECK-NEXT:    [[TMP7:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP6]] seq_cst seq_cst, align 422; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 123; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 024; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]25; CHECK:       atomicrmw.end:26; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]27; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i828; CHECK-NEXT:    ret i8 [[EXTRACTED]]29;30  %res = atomicrmw xchg ptr addrspace(1) %ptr, i8 %value seq_cst31  ret i8 %res32}33 34define i8 @test_atomicrmw_add_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {35; CHECK-LABEL: @test_atomicrmw_add_i8_global_system(36; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)37; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i6438; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 339; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 340; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3241; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]42; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -143; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i3244; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]45; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 446; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]47; CHECK:       atomicrmw.start:48; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]49; CHECK-NEXT:    [[NEW:%.*]] = add i32 [[LOADED]], [[VALOPERAND_SHIFTED]]50; CHECK-NEXT:    [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]51; CHECK-NEXT:    [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]52; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]53; CHECK-NEXT:    [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] seq_cst seq_cst, align 454; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 155; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 056; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]57; CHECK:       atomicrmw.end:58; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]59; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i860; CHECK-NEXT:    ret i8 [[EXTRACTED]]61;62  %res = atomicrmw add ptr addrspace(1) %ptr, i8 %value seq_cst63  ret i8 %res64}65 66define i8 @test_atomicrmw_add_i8_global_system_align2(ptr addrspace(1) %ptr, i8 %value) {67; CHECK-LABEL: @test_atomicrmw_add_i8_global_system_align2(68; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)69; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i6470; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 371; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 372; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3273; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]74; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -175; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i3276; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]77; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 478; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]79; CHECK:       atomicrmw.start:80; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]81; CHECK-NEXT:    [[NEW:%.*]] = add i32 [[LOADED]], [[VALOPERAND_SHIFTED]]82; CHECK-NEXT:    [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]83; CHECK-NEXT:    [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]84; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]85; CHECK-NEXT:    [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] seq_cst seq_cst, align 486; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 187; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 088; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]89; CHECK:       atomicrmw.end:90; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]91; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i892; CHECK-NEXT:    ret i8 [[EXTRACTED]]93;94  %res = atomicrmw add ptr addrspace(1) %ptr, i8 %value seq_cst, align 295  ret i8 %res96}97 98define i8 @test_atomicrmw_add_i8_global_system_align4(ptr addrspace(1) %ptr, i8 %value) {99; CHECK-LABEL: @test_atomicrmw_add_i8_global_system_align4(100; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[VALUE:%.*]] to i32101; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr addrspace(1) [[PTR:%.*]], align 4102; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]103; CHECK:       atomicrmw.start:104; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]105; CHECK-NEXT:    [[NEW:%.*]] = add i32 [[LOADED]], [[TMP1]]106; CHECK-NEXT:    [[TMP3:%.*]] = and i32 [[NEW]], 255107; CHECK-NEXT:    [[TMP4:%.*]] = and i32 [[LOADED]], -256108; CHECK-NEXT:    [[TMP5:%.*]] = or i32 [[TMP4]], [[TMP3]]109; CHECK-NEXT:    [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[TMP5]] seq_cst seq_cst, align 4110; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1111; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0112; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]113; CHECK:       atomicrmw.end:114; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[NEWLOADED]] to i8115; CHECK-NEXT:    ret i8 [[EXTRACTED]]116;117  %res = atomicrmw add ptr addrspace(1) %ptr, i8 %value seq_cst, align 4118  ret i8 %res119}120 121define i8 @test_atomicrmw_sub_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {122; CHECK-LABEL: @test_atomicrmw_sub_i8_global_system(123; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)124; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64125; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3126; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3127; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32128; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]129; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1130; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32131; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]132; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4133; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]134; CHECK:       atomicrmw.start:135; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]136; CHECK-NEXT:    [[NEW:%.*]] = sub i32 [[LOADED]], [[VALOPERAND_SHIFTED]]137; CHECK-NEXT:    [[TMP5:%.*]] = and i32 [[NEW]], [[MASK]]138; CHECK-NEXT:    [[TMP6:%.*]] = and i32 [[LOADED]], [[INV_MASK]]139; CHECK-NEXT:    [[TMP7:%.*]] = or i32 [[TMP6]], [[TMP5]]140; CHECK-NEXT:    [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP7]] seq_cst seq_cst, align 4141; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1142; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0143; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]144; CHECK:       atomicrmw.end:145; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]146; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8147; CHECK-NEXT:    ret i8 [[EXTRACTED]]148;149  %res = atomicrmw sub ptr addrspace(1) %ptr, i8 %value seq_cst150  ret i8 %res151}152 153define i8 @test_atomicrmw_and_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {154; CHECK-LABEL: @test_atomicrmw_and_i8_global_system(155; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)156; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64157; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3158; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3159; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32160; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]161; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1162; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32163; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]164; CHECK-NEXT:    [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]165; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4166; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]167; CHECK:       atomicrmw.start:168; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]169; CHECK-NEXT:    [[NEW:%.*]] = and i32 [[LOADED]], [[ANDOPERAND]]170; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst, align 4171; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1172; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0173; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]174; CHECK:       atomicrmw.end:175; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]176; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8177; CHECK-NEXT:    ret i8 [[EXTRACTED]]178;179  %res = atomicrmw and ptr addrspace(1) %ptr, i8 %value seq_cst180  ret i8 %res181}182 183define i8 @test_atomicrmw_nand_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {184; CHECK-LABEL: @test_atomicrmw_nand_i8_global_system(185; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)186; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64187; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3188; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3189; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32190; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]191; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1192; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32193; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]194; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4195; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]196; CHECK:       atomicrmw.start:197; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]198; CHECK-NEXT:    [[TMP5:%.*]] = and i32 [[LOADED]], [[VALOPERAND_SHIFTED]]199; CHECK-NEXT:    [[NEW:%.*]] = xor i32 [[TMP5]], -1200; CHECK-NEXT:    [[TMP6:%.*]] = and i32 [[NEW]], [[MASK]]201; CHECK-NEXT:    [[TMP7:%.*]] = and i32 [[LOADED]], [[INV_MASK]]202; CHECK-NEXT:    [[TMP8:%.*]] = or i32 [[TMP7]], [[TMP6]]203; CHECK-NEXT:    [[TMP9:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[TMP8]] seq_cst seq_cst, align 4204; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP9]], 1205; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP9]], 0206; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]207; CHECK:       atomicrmw.end:208; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]209; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8210; CHECK-NEXT:    ret i8 [[EXTRACTED]]211;212  %res = atomicrmw nand ptr addrspace(1) %ptr, i8 %value seq_cst213  ret i8 %res214}215 216define i8 @test_atomicrmw_or_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {217; CHECK-LABEL: @test_atomicrmw_or_i8_global_system(218; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)219; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64220; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3221; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3222; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32223; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]224; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1225; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32226; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]227; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4228; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]229; CHECK:       atomicrmw.start:230; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]231; CHECK-NEXT:    [[NEW:%.*]] = or i32 [[LOADED]], [[VALOPERAND_SHIFTED]]232; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst, align 4233; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1234; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0235; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]236; CHECK:       atomicrmw.end:237; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]238; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8239; CHECK-NEXT:    ret i8 [[EXTRACTED]]240;241  %res = atomicrmw or ptr addrspace(1) %ptr, i8 %value seq_cst242  ret i8 %res243}244 245define i8 @test_atomicrmw_xor_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {246; CHECK-LABEL: @test_atomicrmw_xor_i8_global_system(247; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)248; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64249; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3250; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3251; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32252; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]253; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1254; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[VALUE:%.*]] to i32255; CHECK-NEXT:    [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]256; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4257; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]258; CHECK:       atomicrmw.start:259; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP4]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]260; CHECK-NEXT:    [[NEW:%.*]] = xor i32 [[LOADED]], [[VALOPERAND_SHIFTED]]261; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[NEW]] seq_cst seq_cst, align 4262; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1263; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0264; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]265; CHECK:       atomicrmw.end:266; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]267; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8268; CHECK-NEXT:    ret i8 [[EXTRACTED]]269;270  %res = atomicrmw xor ptr addrspace(1) %ptr, i8 %value seq_cst271  ret i8 %res272}273 274define i8 @test_atomicrmw_max_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {275; CHECK-LABEL: @test_atomicrmw_max_i8_global_system(276; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)277; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64278; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3279; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3280; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32281; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]282; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1283; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4284; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]285; CHECK:       atomicrmw.start:286; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]287; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]288; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8289; CHECK-NEXT:    [[TMP4:%.*]] = icmp sgt i8 [[EXTRACTED]], [[VALUE:%.*]]290; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]291; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32292; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]293; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]294; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]295; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4296; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1297; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0298; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]299; CHECK:       atomicrmw.end:300; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]301; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8302; CHECK-NEXT:    ret i8 [[EXTRACTED3]]303;304  %res = atomicrmw max ptr addrspace(1) %ptr, i8 %value seq_cst305  ret i8 %res306}307 308define i8 @test_atomicrmw_min_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {309; CHECK-LABEL: @test_atomicrmw_min_i8_global_system(310; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)311; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64312; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3313; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3314; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32315; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]316; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1317; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4318; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]319; CHECK:       atomicrmw.start:320; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]321; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]322; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8323; CHECK-NEXT:    [[TMP4:%.*]] = icmp sle i8 [[EXTRACTED]], [[VALUE:%.*]]324; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]325; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32326; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]327; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]328; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]329; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4330; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1331; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0332; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]333; CHECK:       atomicrmw.end:334; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]335; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8336; CHECK-NEXT:    ret i8 [[EXTRACTED3]]337;338  %res = atomicrmw min ptr addrspace(1) %ptr, i8 %value seq_cst339  ret i8 %res340}341 342define i8 @test_atomicrmw_umax_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {343; CHECK-LABEL: @test_atomicrmw_umax_i8_global_system(344; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)345; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64346; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3347; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3348; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32349; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]350; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1351; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4352; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]353; CHECK:       atomicrmw.start:354; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]355; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]356; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8357; CHECK-NEXT:    [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]358; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]359; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32360; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]361; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]362; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]363; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4364; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1365; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0366; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]367; CHECK:       atomicrmw.end:368; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]369; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8370; CHECK-NEXT:    ret i8 [[EXTRACTED3]]371;372  %res = atomicrmw umax ptr addrspace(1) %ptr, i8 %value seq_cst373  ret i8 %res374}375 376define i8 @test_atomicrmw_umin_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {377; CHECK-LABEL: @test_atomicrmw_umin_i8_global_system(378; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)379; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64380; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3381; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3382; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32383; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]384; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1385; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4386; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]387; CHECK:       atomicrmw.start:388; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]389; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]390; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8391; CHECK-NEXT:    [[TMP4:%.*]] = icmp ule i8 [[EXTRACTED]], [[VALUE:%.*]]392; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP4]], i8 [[EXTRACTED]], i8 [[VALUE]]393; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32394; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]395; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]396; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]397; CHECK-NEXT:    [[TMP5:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4398; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP5]], 1399; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP5]], 0400; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]401; CHECK:       atomicrmw.end:402; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]403; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8404; CHECK-NEXT:    ret i8 [[EXTRACTED3]]405;406  %res = atomicrmw umin ptr addrspace(1) %ptr, i8 %value seq_cst407  ret i8 %res408}409 410define i8 @test_cmpxchg_i8_global_system(ptr addrspace(1) %out, i8 %in, i8 %old) {411; CHECK-LABEL: @test_cmpxchg_i8_global_system(412; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i8, ptr addrspace(1) [[OUT:%.*]], i64 4413; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[GEP]], i64 -4)414; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[GEP]] to i64415; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3416; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3417; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32418; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]419; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1420; CHECK-NEXT:    [[TMP3:%.*]] = zext i8 [[IN:%.*]] to i32421; CHECK-NEXT:    [[TMP4:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]422; CHECK-NEXT:    [[TMP5:%.*]] = zext i8 [[OLD:%.*]] to i32423; CHECK-NEXT:    [[TMP6:%.*]] = shl i32 [[TMP5]], [[SHIFTAMT]]424; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4425; CHECK-NEXT:    [[TMP8:%.*]] = and i32 [[TMP7]], [[INV_MASK]]426; CHECK-NEXT:    br label [[PARTWORD_CMPXCHG_LOOP:%.*]]427; CHECK:       partword.cmpxchg.loop:428; CHECK-NEXT:    [[TMP9:%.*]] = phi i32 [ [[TMP8]], [[TMP0:%.*]] ], [ [[TMP15:%.*]], [[PARTWORD_CMPXCHG_FAILURE:%.*]] ]429; CHECK-NEXT:    [[TMP10:%.*]] = or i32 [[TMP9]], [[TMP4]]430; CHECK-NEXT:    [[TMP11:%.*]] = or i32 [[TMP9]], [[TMP6]]431; CHECK-NEXT:    [[TMP12:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[TMP11]], i32 [[TMP10]] seq_cst seq_cst, align 4432; CHECK-NEXT:    [[TMP13:%.*]] = extractvalue { i32, i1 } [[TMP12]], 0433; CHECK-NEXT:    [[TMP14:%.*]] = extractvalue { i32, i1 } [[TMP12]], 1434; CHECK-NEXT:    br i1 [[TMP14]], label [[PARTWORD_CMPXCHG_END:%.*]], label [[PARTWORD_CMPXCHG_FAILURE]]435; CHECK:       partword.cmpxchg.failure:436; CHECK-NEXT:    [[TMP15]] = and i32 [[TMP13]], [[INV_MASK]]437; CHECK-NEXT:    [[TMP16:%.*]] = icmp ne i32 [[TMP9]], [[TMP15]]438; CHECK-NEXT:    br i1 [[TMP16]], label [[PARTWORD_CMPXCHG_LOOP]], label [[PARTWORD_CMPXCHG_END]]439; CHECK:       partword.cmpxchg.end:440; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[TMP13]], [[SHIFTAMT]]441; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8442; CHECK-NEXT:    [[TMP17:%.*]] = insertvalue { i8, i1 } poison, i8 [[EXTRACTED]], 0443; CHECK-NEXT:    [[TMP18:%.*]] = insertvalue { i8, i1 } [[TMP17]], i1 [[TMP14]], 1444; CHECK-NEXT:    [[EXTRACT:%.*]] = extractvalue { i8, i1 } [[TMP18]], 0445; CHECK-NEXT:    ret i8 [[EXTRACT]]446;447  %gep = getelementptr i8, ptr addrspace(1) %out, i64 4448  %res = cmpxchg ptr addrspace(1) %gep, i8 %old, i8 %in seq_cst seq_cst449  %extract = extractvalue {i8, i1} %res, 0450  ret i8 %extract451}452 453define i8 @test_atomicrmw_inc_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {454; CHECK-LABEL: @test_atomicrmw_inc_i8_global_system(455; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)456; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64457; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3458; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3459; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32460; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]461; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1462; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4463; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]464; CHECK:       atomicrmw.start:465; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]466; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]467; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8468; CHECK-NEXT:    [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1469; CHECK-NEXT:    [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]470; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]471; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32472; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]473; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]474; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]475; CHECK-NEXT:    [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4476; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1477; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0478; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]479; CHECK:       atomicrmw.end:480; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]481; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8482; CHECK-NEXT:    ret i8 [[EXTRACTED3]]483;484  %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i8 %value seq_cst485  ret i8 %res486}487 488define i8 @test_atomicrmw_inc_i8_global_system_align2(ptr addrspace(1) %ptr, i8 %value) {489; CHECK-LABEL: @test_atomicrmw_inc_i8_global_system_align2(490; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)491; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64492; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3493; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3494; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32495; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]496; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1497; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4498; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]499; CHECK:       atomicrmw.start:500; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]501; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]502; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8503; CHECK-NEXT:    [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1504; CHECK-NEXT:    [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]505; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]506; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32507; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]508; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]509; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]510; CHECK-NEXT:    [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4511; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1512; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0513; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]514; CHECK:       atomicrmw.end:515; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]516; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8517; CHECK-NEXT:    ret i8 [[EXTRACTED3]]518;519  %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i8 %value seq_cst, align 2520  ret i8 %res521}522 523define i8 @test_atomicrmw_inc_i8_global_system_align4(ptr addrspace(1) %ptr, i8 %value) {524; CHECK-LABEL: @test_atomicrmw_inc_i8_global_system_align4(525; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR:%.*]], align 4526; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]527; CHECK:       atomicrmw.start:528; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]529; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i8530; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[EXTRACTED]], 1531; CHECK-NEXT:    [[TMP3:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]532; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 0, i8 [[TMP2]]533; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32534; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], -256535; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]536; CHECK-NEXT:    [[TMP4:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4537; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1538; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 0539; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]540; CHECK:       atomicrmw.end:541; CHECK-NEXT:    [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i8542; CHECK-NEXT:    ret i8 [[EXTRACTED1]]543;544  %res = atomicrmw uinc_wrap ptr addrspace(1) %ptr, i8 %value seq_cst, align 4545  ret i8 %res546}547 548define i8 @test_atomicrmw_inc_i8_flat_system(ptr %ptr, i8 %value) {549; CHECK-LABEL: @test_atomicrmw_inc_i8_flat_system(550; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)551; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i64552; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3553; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3554; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32555; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]556; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1557; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 4558; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]559; CHECK:       atomicrmw.start:560; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]561; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]562; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8563; CHECK-NEXT:    [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1564; CHECK-NEXT:    [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]565; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]566; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32567; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]568; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]569; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]570; CHECK-NEXT:    [[TMP6:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4571; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1572; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0573; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]574; CHECK:       atomicrmw.end:575; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]576; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8577; CHECK-NEXT:    ret i8 [[EXTRACTED3]]578;579  %res = atomicrmw uinc_wrap ptr %ptr, i8 %value seq_cst580  ret i8 %res581}582 583define i8 @test_atomicrmw_inc_i8_flat_system_align2(ptr %ptr, i8 %value) {584; CHECK-LABEL: @test_atomicrmw_inc_i8_flat_system_align2(585; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)586; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i64587; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3588; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3589; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32590; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]591; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1592; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 4593; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]594; CHECK:       atomicrmw.start:595; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]596; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]597; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8598; CHECK-NEXT:    [[TMP4:%.*]] = add i8 [[EXTRACTED]], 1599; CHECK-NEXT:    [[TMP5:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]600; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP5]], i8 0, i8 [[TMP4]]601; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32602; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]603; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]604; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]605; CHECK-NEXT:    [[TMP6:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4606; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1607; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0608; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]609; CHECK:       atomicrmw.end:610; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]611; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8612; CHECK-NEXT:    ret i8 [[EXTRACTED3]]613;614  %res = atomicrmw uinc_wrap ptr %ptr, i8 %value seq_cst, align 2615  ret i8 %res616}617 618define i8 @test_atomicrmw_inc_i8_flat_system_align4(ptr %ptr, i8 %value) {619; CHECK-LABEL: @test_atomicrmw_inc_i8_flat_system_align4(620; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[PTR:%.*]], align 4621; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]622; CHECK:       atomicrmw.start:623; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]624; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i8625; CHECK-NEXT:    [[TMP2:%.*]] = add i8 [[EXTRACTED]], 1626; CHECK-NEXT:    [[TMP3:%.*]] = icmp uge i8 [[EXTRACTED]], [[VALUE:%.*]]627; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 0, i8 [[TMP2]]628; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32629; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], -256630; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]631; CHECK-NEXT:    [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4632; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1633; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP4]], 0634; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]635; CHECK:       atomicrmw.end:636; CHECK-NEXT:    [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i8637; CHECK-NEXT:    ret i8 [[EXTRACTED1]]638;639  %res = atomicrmw uinc_wrap ptr %ptr, i8 %value seq_cst, align 4640  ret i8 %res641}642 643define i8 @test_atomicrmw_dec_i8_global_system(ptr addrspace(1) %ptr, i8 %value) {644; CHECK-LABEL: @test_atomicrmw_dec_i8_global_system(645; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)646; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64647; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3648; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3649; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32650; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]651; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1652; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4653; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]654; CHECK:       atomicrmw.start:655; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]656; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]657; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8658; CHECK-NEXT:    [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 1659; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 0660; CHECK-NEXT:    [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]661; CHECK-NEXT:    [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]662; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]663; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32664; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]665; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]666; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]667; CHECK-NEXT:    [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4668; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1669; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0670; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]671; CHECK:       atomicrmw.end:672; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]673; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8674; CHECK-NEXT:    ret i8 [[EXTRACTED3]]675;676  %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i8 %value seq_cst677  ret i8 %res678}679 680define i8 @test_atomicrmw_dec_i8_global_system_align2(ptr addrspace(1) %ptr, i8 %value) {681; CHECK-LABEL: @test_atomicrmw_dec_i8_global_system_align2(682; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[PTR:%.*]], i64 -4)683; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr addrspace(1) [[PTR]] to i64684; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3685; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3686; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32687; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]688; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1689; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[ALIGNEDADDR]], align 4690; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]691; CHECK:       atomicrmw.start:692; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]693; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]694; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8695; CHECK-NEXT:    [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 1696; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 0697; CHECK-NEXT:    [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]698; CHECK-NEXT:    [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]699; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]700; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32701; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]702; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]703; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]704; CHECK-NEXT:    [[TMP8:%.*]] = cmpxchg ptr addrspace(1) [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4705; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1706; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0707; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]708; CHECK:       atomicrmw.end:709; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]710; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8711; CHECK-NEXT:    ret i8 [[EXTRACTED3]]712;713  %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i8 %value seq_cst, align 2714  ret i8 %res715}716 717define i8 @test_atomicrmw_dec_i8_global_system_align4(ptr addrspace(1) %ptr, i8 %value) {718; CHECK-LABEL: @test_atomicrmw_dec_i8_global_system_align4(719; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr addrspace(1) [[PTR:%.*]], align 4720; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]721; CHECK:       atomicrmw.start:722; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]723; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i8724; CHECK-NEXT:    [[TMP2:%.*]] = sub i8 [[EXTRACTED]], 1725; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[EXTRACTED]], 0726; CHECK-NEXT:    [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]727; CHECK-NEXT:    [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]728; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP5]], i8 [[VALUE]], i8 [[TMP2]]729; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32730; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], -256731; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]732; CHECK-NEXT:    [[TMP6:%.*]] = cmpxchg ptr addrspace(1) [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4733; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1734; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0735; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]736; CHECK:       atomicrmw.end:737; CHECK-NEXT:    [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i8738; CHECK-NEXT:    ret i8 [[EXTRACTED1]]739;740  %res = atomicrmw udec_wrap ptr addrspace(1) %ptr, i8 %value seq_cst, align 4741  ret i8 %res742}743 744define i8 @test_atomicrmw_dec_i8_flat_system(ptr %ptr, i8 %value) {745; CHECK-LABEL: @test_atomicrmw_dec_i8_flat_system(746; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)747; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i64748; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3749; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3750; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32751; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]752; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1753; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 4754; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]755; CHECK:       atomicrmw.start:756; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]757; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]758; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8759; CHECK-NEXT:    [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 1760; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 0761; CHECK-NEXT:    [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]762; CHECK-NEXT:    [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]763; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]764; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32765; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]766; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]767; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]768; CHECK-NEXT:    [[TMP8:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4769; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1770; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0771; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]772; CHECK:       atomicrmw.end:773; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]774; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8775; CHECK-NEXT:    ret i8 [[EXTRACTED3]]776;777  %res = atomicrmw udec_wrap ptr %ptr, i8 %value seq_cst778  ret i8 %res779}780 781define i8 @test_atomicrmw_dec_i8_flat_system_align2(ptr %ptr, i8 %value) {782; CHECK-LABEL: @test_atomicrmw_dec_i8_flat_system_align2(783; CHECK-NEXT:    [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 -4)784; CHECK-NEXT:    [[TMP1:%.*]] = ptrtoint ptr [[PTR]] to i64785; CHECK-NEXT:    [[PTRLSB:%.*]] = and i64 [[TMP1]], 3786; CHECK-NEXT:    [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3787; CHECK-NEXT:    [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32788; CHECK-NEXT:    [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]789; CHECK-NEXT:    [[INV_MASK:%.*]] = xor i32 [[MASK]], -1790; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ALIGNEDADDR]], align 4791; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]792; CHECK:       atomicrmw.start:793; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP3]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]794; CHECK-NEXT:    [[SHIFTED:%.*]] = lshr i32 [[LOADED]], [[SHIFTAMT]]795; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8796; CHECK-NEXT:    [[TMP4:%.*]] = sub i8 [[EXTRACTED]], 1797; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i8 [[EXTRACTED]], 0798; CHECK-NEXT:    [[TMP6:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]799; CHECK-NEXT:    [[TMP7:%.*]] = or i1 [[TMP5]], [[TMP6]]800; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP7]], i8 [[VALUE]], i8 [[TMP4]]801; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32802; CHECK-NEXT:    [[SHIFTED1:%.*]] = shl nuw i32 [[EXTENDED]], [[SHIFTAMT]]803; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], [[INV_MASK]]804; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[SHIFTED1]]805; CHECK-NEXT:    [[TMP8:%.*]] = cmpxchg ptr [[ALIGNEDADDR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4806; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP8]], 1807; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP8]], 0808; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]809; CHECK:       atomicrmw.end:810; CHECK-NEXT:    [[SHIFTED2:%.*]] = lshr i32 [[NEWLOADED]], [[SHIFTAMT]]811; CHECK-NEXT:    [[EXTRACTED3:%.*]] = trunc i32 [[SHIFTED2]] to i8812; CHECK-NEXT:    ret i8 [[EXTRACTED3]]813;814  %res = atomicrmw udec_wrap ptr %ptr, i8 %value seq_cst, align 2815  ret i8 %res816}817 818define i8 @test_atomicrmw_dec_i8_flat_system_align4(ptr %ptr, i8 %value) {819; CHECK-LABEL: @test_atomicrmw_dec_i8_flat_system_align4(820; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[PTR:%.*]], align 4821; CHECK-NEXT:    br label [[ATOMICRMW_START:%.*]]822; CHECK:       atomicrmw.start:823; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP1]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ]824; CHECK-NEXT:    [[EXTRACTED:%.*]] = trunc i32 [[LOADED]] to i8825; CHECK-NEXT:    [[TMP2:%.*]] = sub i8 [[EXTRACTED]], 1826; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8 [[EXTRACTED]], 0827; CHECK-NEXT:    [[TMP4:%.*]] = icmp ugt i8 [[EXTRACTED]], [[VALUE:%.*]]828; CHECK-NEXT:    [[TMP5:%.*]] = or i1 [[TMP3]], [[TMP4]]829; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP5]], i8 [[VALUE]], i8 [[TMP2]]830; CHECK-NEXT:    [[EXTENDED:%.*]] = zext i8 [[NEW]] to i32831; CHECK-NEXT:    [[UNMASKED:%.*]] = and i32 [[LOADED]], -256832; CHECK-NEXT:    [[INSERTED:%.*]] = or i32 [[UNMASKED]], [[EXTENDED]]833; CHECK-NEXT:    [[TMP6:%.*]] = cmpxchg ptr [[PTR]], i32 [[LOADED]], i32 [[INSERTED]] seq_cst seq_cst, align 4834; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1835; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP6]], 0836; CHECK-NEXT:    br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]]837; CHECK:       atomicrmw.end:838; CHECK-NEXT:    [[EXTRACTED1:%.*]] = trunc i32 [[NEWLOADED]] to i8839; CHECK-NEXT:    ret i8 [[EXTRACTED1]]840;841  %res = atomicrmw udec_wrap ptr %ptr, i8 %value seq_cst, align 4842  ret i8 %res843}844