brintos

brintos / llvm-project-archived public Read only

0
0
Text · 126.8 KiB · 647f187 Raw
2644 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -mtriple=xtensa-- -passes=atomic-expand %s | FileCheck %s3 4define i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind {5; CHECK-LABEL: define i8 @atomicrmw_xchg_i8_monotonic(6; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0:[0-9]+]] {7; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_exchange_1(ptr [[A]], i8 [[B]], i32 0)8; CHECK-NEXT:    ret i8 [[TMP1]]9;10  %res = atomicrmw xchg ptr %a, i8 %b monotonic11  ret i8 %res12}13 14define i8 @atomicrmw_xchg_i8_acquire(ptr %a, i8 %b) nounwind {15; CHECK-LABEL: define i8 @atomicrmw_xchg_i8_acquire(16; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {17; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_exchange_1(ptr [[A]], i8 [[B]], i32 2)18; CHECK-NEXT:    ret i8 [[TMP1]]19;20  %res = atomicrmw xchg ptr %a, i8 %b acquire21  ret i8 %res22}23 24define i8 @atomicrmw_xchg_i8_release(ptr %a, i8 %b) nounwind {25; CHECK-LABEL: define i8 @atomicrmw_xchg_i8_release(26; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {27; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_exchange_1(ptr [[A]], i8 [[B]], i32 3)28; CHECK-NEXT:    ret i8 [[TMP1]]29;30  %res = atomicrmw xchg ptr %a, i8 %b release31  ret i8 %res32}33 34define i8 @atomicrmw_xchg_i8_acq_rel(ptr %a, i8 %b) nounwind {35; CHECK-LABEL: define i8 @atomicrmw_xchg_i8_acq_rel(36; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {37; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_exchange_1(ptr [[A]], i8 [[B]], i32 4)38; CHECK-NEXT:    ret i8 [[TMP1]]39;40  %res = atomicrmw xchg ptr %a, i8 %b acq_rel41  ret i8 %res42}43 44define i8 @atomicrmw_xchg_i8_seq_cst(ptr %a, i8 %b) nounwind {45; CHECK-LABEL: define i8 @atomicrmw_xchg_i8_seq_cst(46; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {47; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_exchange_1(ptr [[A]], i8 [[B]], i32 5)48; CHECK-NEXT:    ret i8 [[TMP1]]49;50  %res = atomicrmw xchg ptr %a, i8 %b seq_cst51  ret i8 %res52}53 54define i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind {55; CHECK-LABEL: define i8 @atomicrmw_add_i8_monotonic(56; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {57; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_add_1(ptr [[A]], i8 [[B]], i32 0)58; CHECK-NEXT:    ret i8 [[TMP1]]59;60  %res = atomicrmw add ptr %a, i8 %b monotonic61  ret i8 %res62}63 64define i8 @atomicrmw_add_i8_acquire(ptr %a, i8 %b) nounwind {65; CHECK-LABEL: define i8 @atomicrmw_add_i8_acquire(66; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {67; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_add_1(ptr [[A]], i8 [[B]], i32 2)68; CHECK-NEXT:    ret i8 [[TMP1]]69;70  %res = atomicrmw add ptr %a, i8 %b acquire71  ret i8 %res72}73 74define i8 @atomicrmw_add_i8_release(ptr %a, i8 %b) nounwind {75; CHECK-LABEL: define i8 @atomicrmw_add_i8_release(76; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {77; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_add_1(ptr [[A]], i8 [[B]], i32 3)78; CHECK-NEXT:    ret i8 [[TMP1]]79;80  %res = atomicrmw add ptr %a, i8 %b release81  ret i8 %res82}83 84define i8 @atomicrmw_add_i8_acq_rel(ptr %a, i8 %b) nounwind {85; CHECK-LABEL: define i8 @atomicrmw_add_i8_acq_rel(86; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {87; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_add_1(ptr [[A]], i8 [[B]], i32 4)88; CHECK-NEXT:    ret i8 [[TMP1]]89;90  %res = atomicrmw add ptr %a, i8 %b acq_rel91  ret i8 %res92}93 94define i8 @atomicrmw_add_i8_seq_cst(ptr %a, i8 %b) nounwind {95; CHECK-LABEL: define i8 @atomicrmw_add_i8_seq_cst(96; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {97; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_add_1(ptr [[A]], i8 [[B]], i32 5)98; CHECK-NEXT:    ret i8 [[TMP1]]99;100  %res = atomicrmw add ptr %a, i8 %b seq_cst101  ret i8 %res102}103 104define i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind {105; CHECK-LABEL: define i8 @atomicrmw_sub_i8_monotonic(106; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {107; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_sub_1(ptr [[A]], i8 [[B]], i32 0)108; CHECK-NEXT:    ret i8 [[TMP1]]109;110  %res = atomicrmw sub ptr %a, i8 %b monotonic111  ret i8 %res112}113 114define i8 @atomicrmw_sub_i8_acquire(ptr %a, i8 %b) nounwind {115; CHECK-LABEL: define i8 @atomicrmw_sub_i8_acquire(116; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {117; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_sub_1(ptr [[A]], i8 [[B]], i32 2)118; CHECK-NEXT:    ret i8 [[TMP1]]119;120  %res = atomicrmw sub ptr %a, i8 %b acquire121  ret i8 %res122}123 124define i8 @atomicrmw_sub_i8_release(ptr %a, i8 %b) nounwind {125; CHECK-LABEL: define i8 @atomicrmw_sub_i8_release(126; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {127; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_sub_1(ptr [[A]], i8 [[B]], i32 3)128; CHECK-NEXT:    ret i8 [[TMP1]]129;130  %res = atomicrmw sub ptr %a, i8 %b release131  ret i8 %res132}133 134define i8 @atomicrmw_sub_i8_acq_rel(ptr %a, i8 %b) nounwind {135; CHECK-LABEL: define i8 @atomicrmw_sub_i8_acq_rel(136; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {137; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_sub_1(ptr [[A]], i8 [[B]], i32 4)138; CHECK-NEXT:    ret i8 [[TMP1]]139;140  %res = atomicrmw sub ptr %a, i8 %b acq_rel141  ret i8 %res142}143 144define i8 @atomicrmw_sub_i8_seq_cst(ptr %a, i8 %b) nounwind {145; CHECK-LABEL: define i8 @atomicrmw_sub_i8_seq_cst(146; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {147; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_sub_1(ptr [[A]], i8 [[B]], i32 5)148; CHECK-NEXT:    ret i8 [[TMP1]]149;150  %res = atomicrmw sub ptr %a, i8 %b seq_cst151  ret i8 %res152}153 154define i8 @atomicrmw_and_i8_monotonic(ptr %a, i8 %b) nounwind {155; CHECK-LABEL: define i8 @atomicrmw_and_i8_monotonic(156; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {157; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_and_1(ptr [[A]], i8 [[B]], i32 0)158; CHECK-NEXT:    ret i8 [[TMP1]]159;160  %res = atomicrmw and ptr %a, i8 %b monotonic161  ret i8 %res162}163 164define i8 @atomicrmw_and_i8_acquire(ptr %a, i8 %b) nounwind {165; CHECK-LABEL: define i8 @atomicrmw_and_i8_acquire(166; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {167; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_and_1(ptr [[A]], i8 [[B]], i32 2)168; CHECK-NEXT:    ret i8 [[TMP1]]169;170  %res = atomicrmw and ptr %a, i8 %b acquire171  ret i8 %res172}173 174define i8 @atomicrmw_and_i8_release(ptr %a, i8 %b) nounwind {175; CHECK-LABEL: define i8 @atomicrmw_and_i8_release(176; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {177; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_and_1(ptr [[A]], i8 [[B]], i32 3)178; CHECK-NEXT:    ret i8 [[TMP1]]179;180  %res = atomicrmw and ptr %a, i8 %b release181  ret i8 %res182}183 184define i8 @atomicrmw_and_i8_acq_rel(ptr %a, i8 %b) nounwind {185; CHECK-LABEL: define i8 @atomicrmw_and_i8_acq_rel(186; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {187; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_and_1(ptr [[A]], i8 [[B]], i32 4)188; CHECK-NEXT:    ret i8 [[TMP1]]189;190  %res = atomicrmw and ptr %a, i8 %b acq_rel191  ret i8 %res192}193 194define i8 @atomicrmw_and_i8_seq_cst(ptr %a, i8 %b) nounwind {195; CHECK-LABEL: define i8 @atomicrmw_and_i8_seq_cst(196; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {197; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_and_1(ptr [[A]], i8 [[B]], i32 5)198; CHECK-NEXT:    ret i8 [[TMP1]]199;200  %res = atomicrmw and ptr %a, i8 %b seq_cst201  ret i8 %res202}203 204define i8 @atomicrmw_nand_i8_monotonic(ptr %a, i8 %b) nounwind {205; CHECK-LABEL: define i8 @atomicrmw_nand_i8_monotonic(206; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {207; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_nand_1(ptr [[A]], i8 [[B]], i32 0)208; CHECK-NEXT:    ret i8 [[TMP1]]209;210  %res = atomicrmw nand ptr %a, i8 %b monotonic211  ret i8 %res212}213 214define i8 @atomicrmw_nand_i8_acquire(ptr %a, i8 %b) nounwind {215; CHECK-LABEL: define i8 @atomicrmw_nand_i8_acquire(216; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {217; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_nand_1(ptr [[A]], i8 [[B]], i32 2)218; CHECK-NEXT:    ret i8 [[TMP1]]219;220  %res = atomicrmw nand ptr %a, i8 %b acquire221  ret i8 %res222}223 224define i8 @atomicrmw_nand_i8_release(ptr %a, i8 %b) nounwind {225; CHECK-LABEL: define i8 @atomicrmw_nand_i8_release(226; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {227; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_nand_1(ptr [[A]], i8 [[B]], i32 3)228; CHECK-NEXT:    ret i8 [[TMP1]]229;230  %res = atomicrmw nand ptr %a, i8 %b release231  ret i8 %res232}233 234define i8 @atomicrmw_nand_i8_acq_rel(ptr %a, i8 %b) nounwind {235; CHECK-LABEL: define i8 @atomicrmw_nand_i8_acq_rel(236; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {237; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_nand_1(ptr [[A]], i8 [[B]], i32 4)238; CHECK-NEXT:    ret i8 [[TMP1]]239;240  %res = atomicrmw nand ptr %a, i8 %b acq_rel241  ret i8 %res242}243 244define i8 @atomicrmw_nand_i8_seq_cst(ptr %a, i8 %b) nounwind {245; CHECK-LABEL: define i8 @atomicrmw_nand_i8_seq_cst(246; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {247; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_nand_1(ptr [[A]], i8 [[B]], i32 5)248; CHECK-NEXT:    ret i8 [[TMP1]]249;250  %res = atomicrmw nand ptr %a, i8 %b seq_cst251  ret i8 %res252}253 254define i8 @atomicrmw_or_i8_monotonic(ptr %a, i8 %b) nounwind {255; CHECK-LABEL: define i8 @atomicrmw_or_i8_monotonic(256; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {257; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_or_1(ptr [[A]], i8 [[B]], i32 0)258; CHECK-NEXT:    ret i8 [[TMP1]]259;260  %res = atomicrmw or ptr %a, i8 %b monotonic261  ret i8 %res262}263 264define i8 @atomicrmw_or_i8_acquire(ptr %a, i8 %b) nounwind {265; CHECK-LABEL: define i8 @atomicrmw_or_i8_acquire(266; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {267; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_or_1(ptr [[A]], i8 [[B]], i32 2)268; CHECK-NEXT:    ret i8 [[TMP1]]269;270  %res = atomicrmw or ptr %a, i8 %b acquire271  ret i8 %res272}273 274define i8 @atomicrmw_or_i8_release(ptr %a, i8 %b) nounwind {275; CHECK-LABEL: define i8 @atomicrmw_or_i8_release(276; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {277; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_or_1(ptr [[A]], i8 [[B]], i32 3)278; CHECK-NEXT:    ret i8 [[TMP1]]279;280  %res = atomicrmw or ptr %a, i8 %b release281  ret i8 %res282}283 284define i8 @atomicrmw_or_i8_acq_rel(ptr %a, i8 %b) nounwind {285; CHECK-LABEL: define i8 @atomicrmw_or_i8_acq_rel(286; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {287; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_or_1(ptr [[A]], i8 [[B]], i32 4)288; CHECK-NEXT:    ret i8 [[TMP1]]289;290  %res = atomicrmw or ptr %a, i8 %b acq_rel291  ret i8 %res292}293 294define i8 @atomicrmw_or_i8_seq_cst(ptr %a, i8 %b) nounwind {295; CHECK-LABEL: define i8 @atomicrmw_or_i8_seq_cst(296; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {297; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_or_1(ptr [[A]], i8 [[B]], i32 5)298; CHECK-NEXT:    ret i8 [[TMP1]]299;300  %res = atomicrmw or ptr %a, i8 %b seq_cst301  ret i8 %res302}303 304define i8 @atomicrmw_xor_i8_monotonic(ptr %a, i8 %b) nounwind {305; CHECK-LABEL: define i8 @atomicrmw_xor_i8_monotonic(306; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {307; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_xor_1(ptr [[A]], i8 [[B]], i32 0)308; CHECK-NEXT:    ret i8 [[TMP1]]309;310  %res = atomicrmw xor ptr %a, i8 %b monotonic311  ret i8 %res312}313 314define i8 @atomicrmw_xor_i8_acquire(ptr %a, i8 %b) nounwind {315; CHECK-LABEL: define i8 @atomicrmw_xor_i8_acquire(316; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {317; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_xor_1(ptr [[A]], i8 [[B]], i32 2)318; CHECK-NEXT:    ret i8 [[TMP1]]319;320  %res = atomicrmw xor ptr %a, i8 %b acquire321  ret i8 %res322}323 324define i8 @atomicrmw_xor_i8_release(ptr %a, i8 %b) nounwind {325; CHECK-LABEL: define i8 @atomicrmw_xor_i8_release(326; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {327; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_xor_1(ptr [[A]], i8 [[B]], i32 3)328; CHECK-NEXT:    ret i8 [[TMP1]]329;330  %res = atomicrmw xor ptr %a, i8 %b release331  ret i8 %res332}333 334define i8 @atomicrmw_xor_i8_acq_rel(ptr %a, i8 %b) nounwind {335; CHECK-LABEL: define i8 @atomicrmw_xor_i8_acq_rel(336; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {337; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_xor_1(ptr [[A]], i8 [[B]], i32 4)338; CHECK-NEXT:    ret i8 [[TMP1]]339;340  %res = atomicrmw xor ptr %a, i8 %b acq_rel341  ret i8 %res342}343 344define i8 @atomicrmw_xor_i8_seq_cst(ptr %a, i8 %b) nounwind {345; CHECK-LABEL: define i8 @atomicrmw_xor_i8_seq_cst(346; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {347; CHECK-NEXT:    [[TMP1:%.*]] = call i8 @__atomic_fetch_xor_1(ptr [[A]], i8 [[B]], i32 5)348; CHECK-NEXT:    ret i8 [[TMP1]]349;350  %res = atomicrmw xor ptr %a, i8 %b seq_cst351  ret i8 %res352}353 354define i8 @atomicrmw_max_i8_monotonic(ptr %a, i8 %b) nounwind {355; CHECK-LABEL: define i8 @atomicrmw_max_i8_monotonic(356; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {357; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4358; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1359; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]360; CHECK:       [[ATOMICRMW_START]]:361; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]362; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i8 [[LOADED]], [[B]]363; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]364; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])365; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4366; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 0, i32 0)367; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4368; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])369; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0370; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1371; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1372; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0373; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]374; CHECK:       [[ATOMICRMW_END]]:375; CHECK-NEXT:    ret i8 [[NEWLOADED]]376;377  %res = atomicrmw max ptr %a, i8 %b monotonic378  ret i8 %res379}380 381define i8 @atomicrmw_max_i8_acquire(ptr %a, i8 %b) nounwind {382; CHECK-LABEL: define i8 @atomicrmw_max_i8_acquire(383; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {384; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4385; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1386; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]387; CHECK:       [[ATOMICRMW_START]]:388; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]389; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i8 [[LOADED]], [[B]]390; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]391; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])392; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4393; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 2, i32 2)394; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4395; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])396; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0397; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1398; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1399; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0400; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]401; CHECK:       [[ATOMICRMW_END]]:402; CHECK-NEXT:    ret i8 [[NEWLOADED]]403;404  %res = atomicrmw max ptr %a, i8 %b acquire405  ret i8 %res406}407 408define i8 @atomicrmw_max_i8_release(ptr %a, i8 %b) nounwind {409; CHECK-LABEL: define i8 @atomicrmw_max_i8_release(410; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {411; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4412; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1413; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]414; CHECK:       [[ATOMICRMW_START]]:415; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]416; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i8 [[LOADED]], [[B]]417; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]418; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])419; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4420; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 3, i32 0)421; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4422; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])423; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0424; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1425; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1426; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0427; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]428; CHECK:       [[ATOMICRMW_END]]:429; CHECK-NEXT:    ret i8 [[NEWLOADED]]430;431  %res = atomicrmw max ptr %a, i8 %b release432  ret i8 %res433}434 435define i8 @atomicrmw_max_i8_acq_rel(ptr %a, i8 %b) nounwind {436; CHECK-LABEL: define i8 @atomicrmw_max_i8_acq_rel(437; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {438; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4439; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1440; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]441; CHECK:       [[ATOMICRMW_START]]:442; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]443; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i8 [[LOADED]], [[B]]444; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]445; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])446; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4447; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 4, i32 2)448; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4449; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])450; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0451; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1452; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1453; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0454; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]455; CHECK:       [[ATOMICRMW_END]]:456; CHECK-NEXT:    ret i8 [[NEWLOADED]]457;458  %res = atomicrmw max ptr %a, i8 %b acq_rel459  ret i8 %res460}461 462define i8 @atomicrmw_max_i8_seq_cst(ptr %a, i8 %b) nounwind {463; CHECK-LABEL: define i8 @atomicrmw_max_i8_seq_cst(464; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {465; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4466; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1467; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]468; CHECK:       [[ATOMICRMW_START]]:469; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]470; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i8 [[LOADED]], [[B]]471; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]472; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])473; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4474; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 5, i32 5)475; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4476; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])477; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0478; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1479; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1480; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0481; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]482; CHECK:       [[ATOMICRMW_END]]:483; CHECK-NEXT:    ret i8 [[NEWLOADED]]484;485  %res = atomicrmw max ptr %a, i8 %b seq_cst486  ret i8 %res487}488 489define i8 @atomicrmw_min_i8_monotonic(ptr %a, i8 %b) nounwind {490; CHECK-LABEL: define i8 @atomicrmw_min_i8_monotonic(491; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {492; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4493; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1494; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]495; CHECK:       [[ATOMICRMW_START]]:496; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]497; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i8 [[LOADED]], [[B]]498; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]499; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])500; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4501; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 0, i32 0)502; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4503; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])504; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0505; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1506; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1507; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0508; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]509; CHECK:       [[ATOMICRMW_END]]:510; CHECK-NEXT:    ret i8 [[NEWLOADED]]511;512  %res = atomicrmw min ptr %a, i8 %b monotonic513  ret i8 %res514}515 516define i8 @atomicrmw_min_i8_acquire(ptr %a, i8 %b) nounwind {517; CHECK-LABEL: define i8 @atomicrmw_min_i8_acquire(518; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {519; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4520; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1521; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]522; CHECK:       [[ATOMICRMW_START]]:523; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]524; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i8 [[LOADED]], [[B]]525; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]526; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])527; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4528; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 2, i32 2)529; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4530; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])531; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0532; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1533; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1534; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0535; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]536; CHECK:       [[ATOMICRMW_END]]:537; CHECK-NEXT:    ret i8 [[NEWLOADED]]538;539  %res = atomicrmw min ptr %a, i8 %b acquire540  ret i8 %res541}542 543define i8 @atomicrmw_min_i8_release(ptr %a, i8 %b) nounwind {544; CHECK-LABEL: define i8 @atomicrmw_min_i8_release(545; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {546; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4547; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1548; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]549; CHECK:       [[ATOMICRMW_START]]:550; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]551; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i8 [[LOADED]], [[B]]552; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]553; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])554; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4555; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 3, i32 0)556; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4557; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])558; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0559; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1560; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1561; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0562; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]563; CHECK:       [[ATOMICRMW_END]]:564; CHECK-NEXT:    ret i8 [[NEWLOADED]]565;566  %res = atomicrmw min ptr %a, i8 %b release567  ret i8 %res568}569 570define i8 @atomicrmw_min_i8_acq_rel(ptr %a, i8 %b) nounwind {571; CHECK-LABEL: define i8 @atomicrmw_min_i8_acq_rel(572; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {573; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4574; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1575; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]576; CHECK:       [[ATOMICRMW_START]]:577; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]578; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i8 [[LOADED]], [[B]]579; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]580; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])581; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4582; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 4, i32 2)583; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4584; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])585; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0586; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1587; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1588; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0589; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]590; CHECK:       [[ATOMICRMW_END]]:591; CHECK-NEXT:    ret i8 [[NEWLOADED]]592;593  %res = atomicrmw min ptr %a, i8 %b acq_rel594  ret i8 %res595}596 597define i8 @atomicrmw_min_i8_seq_cst(ptr %a, i8 %b) nounwind {598; CHECK-LABEL: define i8 @atomicrmw_min_i8_seq_cst(599; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {600; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4601; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1602; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]603; CHECK:       [[ATOMICRMW_START]]:604; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]605; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i8 [[LOADED]], [[B]]606; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]607; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])608; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4609; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 5, i32 5)610; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4611; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])612; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0613; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1614; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1615; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0616; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]617; CHECK:       [[ATOMICRMW_END]]:618; CHECK-NEXT:    ret i8 [[NEWLOADED]]619;620  %res = atomicrmw min ptr %a, i8 %b seq_cst621  ret i8 %res622}623 624define i8 @atomicrmw_umax_i8_monotonic(ptr %a, i8 %b) nounwind {625; CHECK-LABEL: define i8 @atomicrmw_umax_i8_monotonic(626; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {627; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4628; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1629; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]630; CHECK:       [[ATOMICRMW_START]]:631; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]632; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i8 [[LOADED]], [[B]]633; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]634; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])635; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4636; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 0, i32 0)637; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4638; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])639; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0640; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1641; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1642; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0643; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]644; CHECK:       [[ATOMICRMW_END]]:645; CHECK-NEXT:    ret i8 [[NEWLOADED]]646;647  %res = atomicrmw umax ptr %a, i8 %b monotonic648  ret i8 %res649}650 651define i8 @atomicrmw_umax_i8_acquire(ptr %a, i8 %b) nounwind {652; CHECK-LABEL: define i8 @atomicrmw_umax_i8_acquire(653; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {654; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4655; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1656; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]657; CHECK:       [[ATOMICRMW_START]]:658; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]659; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i8 [[LOADED]], [[B]]660; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]661; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])662; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4663; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 2, i32 2)664; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4665; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])666; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0667; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1668; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1669; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0670; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]671; CHECK:       [[ATOMICRMW_END]]:672; CHECK-NEXT:    ret i8 [[NEWLOADED]]673;674  %res = atomicrmw umax ptr %a, i8 %b acquire675  ret i8 %res676}677 678define i8 @atomicrmw_umax_i8_release(ptr %a, i8 %b) nounwind {679; CHECK-LABEL: define i8 @atomicrmw_umax_i8_release(680; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {681; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4682; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1683; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]684; CHECK:       [[ATOMICRMW_START]]:685; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]686; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i8 [[LOADED]], [[B]]687; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]688; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])689; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4690; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 3, i32 0)691; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4692; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])693; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0694; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1695; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1696; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0697; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]698; CHECK:       [[ATOMICRMW_END]]:699; CHECK-NEXT:    ret i8 [[NEWLOADED]]700;701  %res = atomicrmw umax ptr %a, i8 %b release702  ret i8 %res703}704 705define i8 @atomicrmw_umax_i8_acq_rel(ptr %a, i8 %b) nounwind {706; CHECK-LABEL: define i8 @atomicrmw_umax_i8_acq_rel(707; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {708; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4709; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1710; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]711; CHECK:       [[ATOMICRMW_START]]:712; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]713; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i8 [[LOADED]], [[B]]714; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]715; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])716; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4717; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 4, i32 2)718; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4719; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])720; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0721; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1722; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1723; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0724; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]725; CHECK:       [[ATOMICRMW_END]]:726; CHECK-NEXT:    ret i8 [[NEWLOADED]]727;728  %res = atomicrmw umax ptr %a, i8 %b acq_rel729  ret i8 %res730}731 732define i8 @atomicrmw_umax_i8_seq_cst(ptr %a, i8 %b) nounwind {733; CHECK-LABEL: define i8 @atomicrmw_umax_i8_seq_cst(734; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {735; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4736; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1737; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]738; CHECK:       [[ATOMICRMW_START]]:739; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]740; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i8 [[LOADED]], [[B]]741; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]742; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])743; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4744; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 5, i32 5)745; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4746; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])747; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0748; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1749; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1750; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0751; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]752; CHECK:       [[ATOMICRMW_END]]:753; CHECK-NEXT:    ret i8 [[NEWLOADED]]754;755  %res = atomicrmw umax ptr %a, i8 %b seq_cst756  ret i8 %res757}758 759define i8 @atomicrmw_umin_i8_monotonic(ptr %a, i8 %b) nounwind {760; CHECK-LABEL: define i8 @atomicrmw_umin_i8_monotonic(761; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {762; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4763; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1764; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]765; CHECK:       [[ATOMICRMW_START]]:766; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]767; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i8 [[LOADED]], [[B]]768; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]769; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])770; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4771; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 0, i32 0)772; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4773; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])774; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0775; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1776; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1777; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0778; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]779; CHECK:       [[ATOMICRMW_END]]:780; CHECK-NEXT:    ret i8 [[NEWLOADED]]781;782  %res = atomicrmw umin ptr %a, i8 %b monotonic783  ret i8 %res784}785 786define i8 @atomicrmw_umin_i8_acquire(ptr %a, i8 %b) nounwind {787; CHECK-LABEL: define i8 @atomicrmw_umin_i8_acquire(788; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {789; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4790; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1791; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]792; CHECK:       [[ATOMICRMW_START]]:793; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]794; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i8 [[LOADED]], [[B]]795; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]796; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])797; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4798; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 2, i32 2)799; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4800; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])801; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0802; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1803; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1804; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0805; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]806; CHECK:       [[ATOMICRMW_END]]:807; CHECK-NEXT:    ret i8 [[NEWLOADED]]808;809  %res = atomicrmw umin ptr %a, i8 %b acquire810  ret i8 %res811}812 813define i8 @atomicrmw_umin_i8_release(ptr %a, i8 %b) nounwind {814; CHECK-LABEL: define i8 @atomicrmw_umin_i8_release(815; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {816; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4817; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1818; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]819; CHECK:       [[ATOMICRMW_START]]:820; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]821; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i8 [[LOADED]], [[B]]822; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]823; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])824; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4825; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 3, i32 0)826; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4827; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])828; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0829; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1830; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1831; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0832; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]833; CHECK:       [[ATOMICRMW_END]]:834; CHECK-NEXT:    ret i8 [[NEWLOADED]]835;836  %res = atomicrmw umin ptr %a, i8 %b release837  ret i8 %res838}839 840define i8 @atomicrmw_umin_i8_acq_rel(ptr %a, i8 %b) nounwind {841; CHECK-LABEL: define i8 @atomicrmw_umin_i8_acq_rel(842; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {843; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4844; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1845; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]846; CHECK:       [[ATOMICRMW_START]]:847; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]848; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i8 [[LOADED]], [[B]]849; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]850; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])851; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4852; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 4, i32 2)853; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4854; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])855; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0856; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1857; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1858; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0859; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]860; CHECK:       [[ATOMICRMW_END]]:861; CHECK-NEXT:    ret i8 [[NEWLOADED]]862;863  %res = atomicrmw umin ptr %a, i8 %b acq_rel864  ret i8 %res865}866 867define i8 @atomicrmw_umin_i8_seq_cst(ptr %a, i8 %b) nounwind {868; CHECK-LABEL: define i8 @atomicrmw_umin_i8_seq_cst(869; CHECK-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {870; CHECK-NEXT:    [[TMP1:%.*]] = alloca i8, align 4871; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[A]], align 1872; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]873; CHECK:       [[ATOMICRMW_START]]:874; CHECK-NEXT:    [[LOADED:%.*]] = phi i8 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]875; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i8 [[LOADED]], [[B]]876; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i8 [[LOADED]], i8 [[B]]877; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])878; CHECK-NEXT:    store i8 [[LOADED]], ptr [[TMP1]], align 4879; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_1(ptr [[A]], ptr [[TMP1]], i8 [[NEW]], i32 5, i32 5)880; CHECK-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP1]], align 4881; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])882; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i8, i1 } poison, i8 [[TMP5]], 0883; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i8, i1 } [[TMP6]], i1 [[TMP4]], 1884; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP7]], 1885; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP7]], 0886; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]887; CHECK:       [[ATOMICRMW_END]]:888; CHECK-NEXT:    ret i8 [[NEWLOADED]]889;890  %res = atomicrmw umin ptr %a, i8 %b seq_cst891  ret i8 %res892}893 894define i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind {895; CHECK-LABEL: define i16 @atomicrmw_xchg_i16_monotonic(896; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {897; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_exchange_2(ptr [[A]], i16 [[B]], i32 0)898; CHECK-NEXT:    ret i16 [[TMP1]]899;900  %res = atomicrmw xchg ptr %a, i16 %b monotonic901  ret i16 %res902}903 904define i16 @atomicrmw_xchg_i16_acquire(ptr %a, i16 %b) nounwind {905; CHECK-LABEL: define i16 @atomicrmw_xchg_i16_acquire(906; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {907; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_exchange_2(ptr [[A]], i16 [[B]], i32 2)908; CHECK-NEXT:    ret i16 [[TMP1]]909;910  %res = atomicrmw xchg ptr %a, i16 %b acquire911  ret i16 %res912}913 914define i16 @atomicrmw_xchg_i16_release(ptr %a, i16 %b) nounwind {915; CHECK-LABEL: define i16 @atomicrmw_xchg_i16_release(916; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {917; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_exchange_2(ptr [[A]], i16 [[B]], i32 3)918; CHECK-NEXT:    ret i16 [[TMP1]]919;920  %res = atomicrmw xchg ptr %a, i16 %b release921  ret i16 %res922}923 924define i16 @atomicrmw_xchg_i16_acq_rel(ptr %a, i16 %b) nounwind {925; CHECK-LABEL: define i16 @atomicrmw_xchg_i16_acq_rel(926; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {927; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_exchange_2(ptr [[A]], i16 [[B]], i32 4)928; CHECK-NEXT:    ret i16 [[TMP1]]929;930  %res = atomicrmw xchg ptr %a, i16 %b acq_rel931  ret i16 %res932}933 934define i16 @atomicrmw_xchg_i16_seq_cst(ptr %a, i16 %b) nounwind {935; CHECK-LABEL: define i16 @atomicrmw_xchg_i16_seq_cst(936; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {937; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_exchange_2(ptr [[A]], i16 [[B]], i32 5)938; CHECK-NEXT:    ret i16 [[TMP1]]939;940  %res = atomicrmw xchg ptr %a, i16 %b seq_cst941  ret i16 %res942}943 944define i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind {945; CHECK-LABEL: define i16 @atomicrmw_add_i16_monotonic(946; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {947; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_add_2(ptr [[A]], i16 [[B]], i32 0)948; CHECK-NEXT:    ret i16 [[TMP1]]949;950  %res = atomicrmw add ptr %a, i16 %b monotonic951  ret i16 %res952}953 954define i16 @atomicrmw_add_i16_acquire(ptr %a, i16 %b) nounwind {955; CHECK-LABEL: define i16 @atomicrmw_add_i16_acquire(956; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {957; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_add_2(ptr [[A]], i16 [[B]], i32 2)958; CHECK-NEXT:    ret i16 [[TMP1]]959;960  %res = atomicrmw add ptr %a, i16 %b acquire961  ret i16 %res962}963 964define i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind {965; CHECK-LABEL: define i16 @atomicrmw_add_i16_release(966; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {967; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_add_2(ptr [[A]], i16 [[B]], i32 3)968; CHECK-NEXT:    ret i16 [[TMP1]]969;970  %res = atomicrmw add ptr %a, i16 %b release971  ret i16 %res972}973 974define i16 @atomicrmw_add_i16_acq_rel(ptr %a, i16 %b) nounwind {975; CHECK-LABEL: define i16 @atomicrmw_add_i16_acq_rel(976; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {977; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_add_2(ptr [[A]], i16 [[B]], i32 4)978; CHECK-NEXT:    ret i16 [[TMP1]]979;980  %res = atomicrmw add ptr %a, i16 %b acq_rel981  ret i16 %res982}983 984define i16 @atomicrmw_add_i16_seq_cst(ptr %a, i16 %b) nounwind {985; CHECK-LABEL: define i16 @atomicrmw_add_i16_seq_cst(986; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {987; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_add_2(ptr [[A]], i16 [[B]], i32 5)988; CHECK-NEXT:    ret i16 [[TMP1]]989;990  %res = atomicrmw add ptr %a, i16 %b seq_cst991  ret i16 %res992}993 994define i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind {995; CHECK-LABEL: define i16 @atomicrmw_sub_i16_monotonic(996; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {997; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_sub_2(ptr [[A]], i16 [[B]], i32 0)998; CHECK-NEXT:    ret i16 [[TMP1]]999;1000  %res = atomicrmw sub ptr %a, i16 %b monotonic1001  ret i16 %res1002}1003 1004define i16 @atomicrmw_sub_i16_acquire(ptr %a, i16 %b) nounwind {1005; CHECK-LABEL: define i16 @atomicrmw_sub_i16_acquire(1006; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1007; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_sub_2(ptr [[A]], i16 [[B]], i32 2)1008; CHECK-NEXT:    ret i16 [[TMP1]]1009;1010  %res = atomicrmw sub ptr %a, i16 %b acquire1011  ret i16 %res1012}1013 1014define i16 @atomicrmw_sub_i16_release(ptr %a, i16 %b) nounwind {1015; CHECK-LABEL: define i16 @atomicrmw_sub_i16_release(1016; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1017; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_sub_2(ptr [[A]], i16 [[B]], i32 3)1018; CHECK-NEXT:    ret i16 [[TMP1]]1019;1020  %res = atomicrmw sub ptr %a, i16 %b release1021  ret i16 %res1022}1023 1024define i16 @atomicrmw_sub_i16_acq_rel(ptr %a, i16 %b) nounwind {1025; CHECK-LABEL: define i16 @atomicrmw_sub_i16_acq_rel(1026; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1027; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_sub_2(ptr [[A]], i16 [[B]], i32 4)1028; CHECK-NEXT:    ret i16 [[TMP1]]1029;1030  %res = atomicrmw sub ptr %a, i16 %b acq_rel1031  ret i16 %res1032}1033 1034define i16 @atomicrmw_sub_i16_seq_cst(ptr %a, i16 %b) nounwind {1035; CHECK-LABEL: define i16 @atomicrmw_sub_i16_seq_cst(1036; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1037; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_sub_2(ptr [[A]], i16 [[B]], i32 5)1038; CHECK-NEXT:    ret i16 [[TMP1]]1039;1040  %res = atomicrmw sub ptr %a, i16 %b seq_cst1041  ret i16 %res1042}1043 1044define i16 @atomicrmw_and_i16_monotonic(ptr %a, i16 %b) nounwind {1045; CHECK-LABEL: define i16 @atomicrmw_and_i16_monotonic(1046; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1047; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_and_2(ptr [[A]], i16 [[B]], i32 0)1048; CHECK-NEXT:    ret i16 [[TMP1]]1049;1050  %res = atomicrmw and ptr %a, i16 %b monotonic1051  ret i16 %res1052}1053 1054define i16 @atomicrmw_and_i16_acquire(ptr %a, i16 %b) nounwind {1055; CHECK-LABEL: define i16 @atomicrmw_and_i16_acquire(1056; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1057; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_and_2(ptr [[A]], i16 [[B]], i32 2)1058; CHECK-NEXT:    ret i16 [[TMP1]]1059;1060  %res = atomicrmw and ptr %a, i16 %b acquire1061  ret i16 %res1062}1063 1064define i16 @atomicrmw_and_i16_release(ptr %a, i16 %b) nounwind {1065; CHECK-LABEL: define i16 @atomicrmw_and_i16_release(1066; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1067; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_and_2(ptr [[A]], i16 [[B]], i32 3)1068; CHECK-NEXT:    ret i16 [[TMP1]]1069;1070  %res = atomicrmw and ptr %a, i16 %b release1071  ret i16 %res1072}1073 1074define i16 @atomicrmw_and_i16_acq_rel(ptr %a, i16 %b) nounwind {1075; CHECK-LABEL: define i16 @atomicrmw_and_i16_acq_rel(1076; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1077; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_and_2(ptr [[A]], i16 [[B]], i32 4)1078; CHECK-NEXT:    ret i16 [[TMP1]]1079;1080  %res = atomicrmw and ptr %a, i16 %b acq_rel1081  ret i16 %res1082}1083 1084define i16 @atomicrmw_and_i16_seq_cst(ptr %a, i16 %b) nounwind {1085; CHECK-LABEL: define i16 @atomicrmw_and_i16_seq_cst(1086; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1087; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_and_2(ptr [[A]], i16 [[B]], i32 5)1088; CHECK-NEXT:    ret i16 [[TMP1]]1089;1090  %res = atomicrmw and ptr %a, i16 %b seq_cst1091  ret i16 %res1092}1093 1094define i16 @atomicrmw_nand_i16_monotonic(ptr %a, i16 %b) nounwind {1095; CHECK-LABEL: define i16 @atomicrmw_nand_i16_monotonic(1096; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1097; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_nand_2(ptr [[A]], i16 [[B]], i32 0)1098; CHECK-NEXT:    ret i16 [[TMP1]]1099;1100  %res = atomicrmw nand ptr %a, i16 %b monotonic1101  ret i16 %res1102}1103 1104define i16 @atomicrmw_nand_i16_acquire(ptr %a, i16 %b) nounwind {1105; CHECK-LABEL: define i16 @atomicrmw_nand_i16_acquire(1106; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1107; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_nand_2(ptr [[A]], i16 [[B]], i32 2)1108; CHECK-NEXT:    ret i16 [[TMP1]]1109;1110  %res = atomicrmw nand ptr %a, i16 %b acquire1111  ret i16 %res1112}1113 1114define i16 @atomicrmw_nand_i16_release(ptr %a, i16 %b) nounwind {1115; CHECK-LABEL: define i16 @atomicrmw_nand_i16_release(1116; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1117; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_nand_2(ptr [[A]], i16 [[B]], i32 3)1118; CHECK-NEXT:    ret i16 [[TMP1]]1119;1120  %res = atomicrmw nand ptr %a, i16 %b release1121  ret i16 %res1122}1123 1124define i16 @atomicrmw_nand_i16_acq_rel(ptr %a, i16 %b) nounwind {1125; CHECK-LABEL: define i16 @atomicrmw_nand_i16_acq_rel(1126; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1127; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_nand_2(ptr [[A]], i16 [[B]], i32 4)1128; CHECK-NEXT:    ret i16 [[TMP1]]1129;1130  %res = atomicrmw nand ptr %a, i16 %b acq_rel1131  ret i16 %res1132}1133 1134define i16 @atomicrmw_nand_i16_seq_cst(ptr %a, i16 %b) nounwind {1135; CHECK-LABEL: define i16 @atomicrmw_nand_i16_seq_cst(1136; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1137; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_nand_2(ptr [[A]], i16 [[B]], i32 5)1138; CHECK-NEXT:    ret i16 [[TMP1]]1139;1140  %res = atomicrmw nand ptr %a, i16 %b seq_cst1141  ret i16 %res1142}1143 1144define i16 @atomicrmw_or_i16_monotonic(ptr %a, i16 %b) nounwind {1145; CHECK-LABEL: define i16 @atomicrmw_or_i16_monotonic(1146; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1147; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_or_2(ptr [[A]], i16 [[B]], i32 0)1148; CHECK-NEXT:    ret i16 [[TMP1]]1149;1150  %res = atomicrmw or ptr %a, i16 %b monotonic1151  ret i16 %res1152}1153 1154define i16 @atomicrmw_or_i16_acquire(ptr %a, i16 %b) nounwind {1155; CHECK-LABEL: define i16 @atomicrmw_or_i16_acquire(1156; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1157; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_or_2(ptr [[A]], i16 [[B]], i32 2)1158; CHECK-NEXT:    ret i16 [[TMP1]]1159;1160  %res = atomicrmw or ptr %a, i16 %b acquire1161  ret i16 %res1162}1163 1164define i16 @atomicrmw_or_i16_release(ptr %a, i16 %b) nounwind {1165; CHECK-LABEL: define i16 @atomicrmw_or_i16_release(1166; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1167; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_or_2(ptr [[A]], i16 [[B]], i32 3)1168; CHECK-NEXT:    ret i16 [[TMP1]]1169;1170  %res = atomicrmw or ptr %a, i16 %b release1171  ret i16 %res1172}1173 1174define i16 @atomicrmw_or_i16_acq_rel(ptr %a, i16 %b) nounwind {1175; CHECK-LABEL: define i16 @atomicrmw_or_i16_acq_rel(1176; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1177; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_or_2(ptr [[A]], i16 [[B]], i32 4)1178; CHECK-NEXT:    ret i16 [[TMP1]]1179;1180  %res = atomicrmw or ptr %a, i16 %b acq_rel1181  ret i16 %res1182}1183 1184define i16 @atomicrmw_or_i16_seq_cst(ptr %a, i16 %b) nounwind {1185; CHECK-LABEL: define i16 @atomicrmw_or_i16_seq_cst(1186; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1187; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_or_2(ptr [[A]], i16 [[B]], i32 5)1188; CHECK-NEXT:    ret i16 [[TMP1]]1189;1190  %res = atomicrmw or ptr %a, i16 %b seq_cst1191  ret i16 %res1192}1193 1194define i16 @atomicrmw_xor_i16_monotonic(ptr %a, i16 %b) nounwind {1195; CHECK-LABEL: define i16 @atomicrmw_xor_i16_monotonic(1196; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1197; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_xor_2(ptr [[A]], i16 [[B]], i32 0)1198; CHECK-NEXT:    ret i16 [[TMP1]]1199;1200  %res = atomicrmw xor ptr %a, i16 %b monotonic1201  ret i16 %res1202}1203 1204define i16 @atomicrmw_xor_i16_acquire(ptr %a, i16 %b) nounwind {1205; CHECK-LABEL: define i16 @atomicrmw_xor_i16_acquire(1206; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1207; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_xor_2(ptr [[A]], i16 [[B]], i32 2)1208; CHECK-NEXT:    ret i16 [[TMP1]]1209;1210  %res = atomicrmw xor ptr %a, i16 %b acquire1211  ret i16 %res1212}1213 1214define i16 @atomicrmw_xor_i16_release(ptr %a, i16 %b) nounwind {1215; CHECK-LABEL: define i16 @atomicrmw_xor_i16_release(1216; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1217; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_xor_2(ptr [[A]], i16 [[B]], i32 3)1218; CHECK-NEXT:    ret i16 [[TMP1]]1219;1220  %res = atomicrmw xor ptr %a, i16 %b release1221  ret i16 %res1222}1223 1224define i16 @atomicrmw_xor_i16_acq_rel(ptr %a, i16 %b) nounwind {1225; CHECK-LABEL: define i16 @atomicrmw_xor_i16_acq_rel(1226; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1227; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_xor_2(ptr [[A]], i16 [[B]], i32 4)1228; CHECK-NEXT:    ret i16 [[TMP1]]1229;1230  %res = atomicrmw xor ptr %a, i16 %b acq_rel1231  ret i16 %res1232}1233 1234define i16 @atomicrmw_xor_i16_seq_cst(ptr %a, i16 %b) nounwind {1235; CHECK-LABEL: define i16 @atomicrmw_xor_i16_seq_cst(1236; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1237; CHECK-NEXT:    [[TMP1:%.*]] = call i16 @__atomic_fetch_xor_2(ptr [[A]], i16 [[B]], i32 5)1238; CHECK-NEXT:    ret i16 [[TMP1]]1239;1240  %res = atomicrmw xor ptr %a, i16 %b seq_cst1241  ret i16 %res1242}1243 1244define i16 @atomicrmw_max_i16_monotonic(ptr %a, i16 %b) nounwind {1245; CHECK-LABEL: define i16 @atomicrmw_max_i16_monotonic(1246; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1247; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41248; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21249; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1250; CHECK:       [[ATOMICRMW_START]]:1251; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1252; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i16 [[LOADED]], [[B]]1253; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1254; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1255; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41256; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 0, i32 0)1257; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41258; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1259; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01260; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11261; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11262; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01263; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1264; CHECK:       [[ATOMICRMW_END]]:1265; CHECK-NEXT:    ret i16 [[NEWLOADED]]1266;1267  %res = atomicrmw max ptr %a, i16 %b monotonic1268  ret i16 %res1269}1270 1271define i16 @atomicrmw_max_i16_acquire(ptr %a, i16 %b) nounwind {1272; CHECK-LABEL: define i16 @atomicrmw_max_i16_acquire(1273; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1274; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41275; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21276; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1277; CHECK:       [[ATOMICRMW_START]]:1278; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1279; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i16 [[LOADED]], [[B]]1280; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1281; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1282; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41283; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 2, i32 2)1284; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41285; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1286; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01287; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11288; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11289; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01290; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1291; CHECK:       [[ATOMICRMW_END]]:1292; CHECK-NEXT:    ret i16 [[NEWLOADED]]1293;1294  %res = atomicrmw max ptr %a, i16 %b acquire1295  ret i16 %res1296}1297 1298define i16 @atomicrmw_max_i16_release(ptr %a, i16 %b) nounwind {1299; CHECK-LABEL: define i16 @atomicrmw_max_i16_release(1300; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1301; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41302; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21303; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1304; CHECK:       [[ATOMICRMW_START]]:1305; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1306; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i16 [[LOADED]], [[B]]1307; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1308; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1309; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41310; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 3, i32 0)1311; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41312; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1313; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01314; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11315; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11316; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01317; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1318; CHECK:       [[ATOMICRMW_END]]:1319; CHECK-NEXT:    ret i16 [[NEWLOADED]]1320;1321  %res = atomicrmw max ptr %a, i16 %b release1322  ret i16 %res1323}1324 1325define i16 @atomicrmw_max_i16_acq_rel(ptr %a, i16 %b) nounwind {1326; CHECK-LABEL: define i16 @atomicrmw_max_i16_acq_rel(1327; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1328; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41329; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21330; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1331; CHECK:       [[ATOMICRMW_START]]:1332; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1333; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i16 [[LOADED]], [[B]]1334; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1335; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1336; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41337; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 4, i32 2)1338; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41339; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1340; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01341; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11342; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11343; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01344; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1345; CHECK:       [[ATOMICRMW_END]]:1346; CHECK-NEXT:    ret i16 [[NEWLOADED]]1347;1348  %res = atomicrmw max ptr %a, i16 %b acq_rel1349  ret i16 %res1350}1351 1352define i16 @atomicrmw_max_i16_seq_cst(ptr %a, i16 %b) nounwind {1353; CHECK-LABEL: define i16 @atomicrmw_max_i16_seq_cst(1354; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1355; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41356; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21357; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1358; CHECK:       [[ATOMICRMW_START]]:1359; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1360; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i16 [[LOADED]], [[B]]1361; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1362; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1363; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41364; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 5, i32 5)1365; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41366; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1367; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01368; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11369; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11370; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01371; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1372; CHECK:       [[ATOMICRMW_END]]:1373; CHECK-NEXT:    ret i16 [[NEWLOADED]]1374;1375  %res = atomicrmw max ptr %a, i16 %b seq_cst1376  ret i16 %res1377}1378 1379define i16 @atomicrmw_min_i16_monotonic(ptr %a, i16 %b) nounwind {1380; CHECK-LABEL: define i16 @atomicrmw_min_i16_monotonic(1381; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1382; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41383; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21384; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1385; CHECK:       [[ATOMICRMW_START]]:1386; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1387; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i16 [[LOADED]], [[B]]1388; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1389; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1390; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41391; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 0, i32 0)1392; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41393; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1394; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01395; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11396; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11397; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01398; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1399; CHECK:       [[ATOMICRMW_END]]:1400; CHECK-NEXT:    ret i16 [[NEWLOADED]]1401;1402  %res = atomicrmw min ptr %a, i16 %b monotonic1403  ret i16 %res1404}1405 1406define i16 @atomicrmw_min_i16_acquire(ptr %a, i16 %b) nounwind {1407; CHECK-LABEL: define i16 @atomicrmw_min_i16_acquire(1408; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1409; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41410; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21411; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1412; CHECK:       [[ATOMICRMW_START]]:1413; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1414; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i16 [[LOADED]], [[B]]1415; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1416; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1417; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41418; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 2, i32 2)1419; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41420; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1421; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01422; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11423; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11424; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01425; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1426; CHECK:       [[ATOMICRMW_END]]:1427; CHECK-NEXT:    ret i16 [[NEWLOADED]]1428;1429  %res = atomicrmw min ptr %a, i16 %b acquire1430  ret i16 %res1431}1432 1433define i16 @atomicrmw_min_i16_release(ptr %a, i16 %b) nounwind {1434; CHECK-LABEL: define i16 @atomicrmw_min_i16_release(1435; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1436; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41437; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21438; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1439; CHECK:       [[ATOMICRMW_START]]:1440; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1441; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i16 [[LOADED]], [[B]]1442; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1443; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1444; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41445; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 3, i32 0)1446; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41447; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1448; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01449; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11450; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11451; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01452; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1453; CHECK:       [[ATOMICRMW_END]]:1454; CHECK-NEXT:    ret i16 [[NEWLOADED]]1455;1456  %res = atomicrmw min ptr %a, i16 %b release1457  ret i16 %res1458}1459 1460define i16 @atomicrmw_min_i16_acq_rel(ptr %a, i16 %b) nounwind {1461; CHECK-LABEL: define i16 @atomicrmw_min_i16_acq_rel(1462; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1463; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41464; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21465; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1466; CHECK:       [[ATOMICRMW_START]]:1467; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1468; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i16 [[LOADED]], [[B]]1469; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1470; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1471; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41472; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 4, i32 2)1473; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41474; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1475; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01476; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11477; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11478; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01479; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1480; CHECK:       [[ATOMICRMW_END]]:1481; CHECK-NEXT:    ret i16 [[NEWLOADED]]1482;1483  %res = atomicrmw min ptr %a, i16 %b acq_rel1484  ret i16 %res1485}1486 1487define i16 @atomicrmw_min_i16_seq_cst(ptr %a, i16 %b) nounwind {1488; CHECK-LABEL: define i16 @atomicrmw_min_i16_seq_cst(1489; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1490; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41491; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21492; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1493; CHECK:       [[ATOMICRMW_START]]:1494; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1495; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i16 [[LOADED]], [[B]]1496; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1497; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1498; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41499; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 5, i32 5)1500; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41501; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1502; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01503; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11504; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11505; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01506; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1507; CHECK:       [[ATOMICRMW_END]]:1508; CHECK-NEXT:    ret i16 [[NEWLOADED]]1509;1510  %res = atomicrmw min ptr %a, i16 %b seq_cst1511  ret i16 %res1512}1513 1514define i16 @atomicrmw_umax_i16_monotonic(ptr %a, i16 %b) nounwind {1515; CHECK-LABEL: define i16 @atomicrmw_umax_i16_monotonic(1516; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1517; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41518; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21519; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1520; CHECK:       [[ATOMICRMW_START]]:1521; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1522; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i16 [[LOADED]], [[B]]1523; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1524; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1525; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41526; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 0, i32 0)1527; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41528; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1529; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01530; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11531; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11532; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01533; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1534; CHECK:       [[ATOMICRMW_END]]:1535; CHECK-NEXT:    ret i16 [[NEWLOADED]]1536;1537  %res = atomicrmw umax ptr %a, i16 %b monotonic1538  ret i16 %res1539}1540 1541define i16 @atomicrmw_umax_i16_acquire(ptr %a, i16 %b) nounwind {1542; CHECK-LABEL: define i16 @atomicrmw_umax_i16_acquire(1543; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1544; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41545; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21546; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1547; CHECK:       [[ATOMICRMW_START]]:1548; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1549; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i16 [[LOADED]], [[B]]1550; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1551; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1552; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41553; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 2, i32 2)1554; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41555; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1556; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01557; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11558; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11559; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01560; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1561; CHECK:       [[ATOMICRMW_END]]:1562; CHECK-NEXT:    ret i16 [[NEWLOADED]]1563;1564  %res = atomicrmw umax ptr %a, i16 %b acquire1565  ret i16 %res1566}1567 1568define i16 @atomicrmw_umax_i16_release(ptr %a, i16 %b) nounwind {1569; CHECK-LABEL: define i16 @atomicrmw_umax_i16_release(1570; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1571; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41572; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21573; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1574; CHECK:       [[ATOMICRMW_START]]:1575; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1576; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i16 [[LOADED]], [[B]]1577; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1578; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1579; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41580; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 3, i32 0)1581; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41582; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1583; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01584; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11585; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11586; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01587; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1588; CHECK:       [[ATOMICRMW_END]]:1589; CHECK-NEXT:    ret i16 [[NEWLOADED]]1590;1591  %res = atomicrmw umax ptr %a, i16 %b release1592  ret i16 %res1593}1594 1595define i16 @atomicrmw_umax_i16_acq_rel(ptr %a, i16 %b) nounwind {1596; CHECK-LABEL: define i16 @atomicrmw_umax_i16_acq_rel(1597; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1598; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41599; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21600; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1601; CHECK:       [[ATOMICRMW_START]]:1602; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1603; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i16 [[LOADED]], [[B]]1604; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1605; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1606; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41607; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 4, i32 2)1608; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41609; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1610; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01611; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11612; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11613; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01614; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1615; CHECK:       [[ATOMICRMW_END]]:1616; CHECK-NEXT:    ret i16 [[NEWLOADED]]1617;1618  %res = atomicrmw umax ptr %a, i16 %b acq_rel1619  ret i16 %res1620}1621 1622define i16 @atomicrmw_umax_i16_seq_cst(ptr %a, i16 %b) nounwind {1623; CHECK-LABEL: define i16 @atomicrmw_umax_i16_seq_cst(1624; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1625; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41626; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21627; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1628; CHECK:       [[ATOMICRMW_START]]:1629; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1630; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i16 [[LOADED]], [[B]]1631; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1632; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1633; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41634; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 5, i32 5)1635; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41636; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1637; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01638; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11639; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11640; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01641; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1642; CHECK:       [[ATOMICRMW_END]]:1643; CHECK-NEXT:    ret i16 [[NEWLOADED]]1644;1645  %res = atomicrmw umax ptr %a, i16 %b seq_cst1646  ret i16 %res1647}1648 1649define i16 @atomicrmw_umin_i16_monotonic(ptr %a, i16 %b) nounwind {1650; CHECK-LABEL: define i16 @atomicrmw_umin_i16_monotonic(1651; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1652; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41653; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21654; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1655; CHECK:       [[ATOMICRMW_START]]:1656; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1657; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i16 [[LOADED]], [[B]]1658; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1659; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1660; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41661; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 0, i32 0)1662; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41663; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1664; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01665; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11666; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11667; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01668; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1669; CHECK:       [[ATOMICRMW_END]]:1670; CHECK-NEXT:    ret i16 [[NEWLOADED]]1671;1672  %res = atomicrmw umin ptr %a, i16 %b monotonic1673  ret i16 %res1674}1675 1676define i16 @atomicrmw_umin_i16_acquire(ptr %a, i16 %b) nounwind {1677; CHECK-LABEL: define i16 @atomicrmw_umin_i16_acquire(1678; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1679; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41680; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21681; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1682; CHECK:       [[ATOMICRMW_START]]:1683; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1684; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i16 [[LOADED]], [[B]]1685; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1686; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1687; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41688; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 2, i32 2)1689; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41690; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1691; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01692; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11693; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11694; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01695; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1696; CHECK:       [[ATOMICRMW_END]]:1697; CHECK-NEXT:    ret i16 [[NEWLOADED]]1698;1699  %res = atomicrmw umin ptr %a, i16 %b acquire1700  ret i16 %res1701}1702 1703define i16 @atomicrmw_umin_i16_release(ptr %a, i16 %b) nounwind {1704; CHECK-LABEL: define i16 @atomicrmw_umin_i16_release(1705; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1706; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41707; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21708; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1709; CHECK:       [[ATOMICRMW_START]]:1710; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1711; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i16 [[LOADED]], [[B]]1712; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1713; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1714; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41715; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 3, i32 0)1716; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41717; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1718; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01719; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11720; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11721; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01722; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1723; CHECK:       [[ATOMICRMW_END]]:1724; CHECK-NEXT:    ret i16 [[NEWLOADED]]1725;1726  %res = atomicrmw umin ptr %a, i16 %b release1727  ret i16 %res1728}1729 1730define i16 @atomicrmw_umin_i16_acq_rel(ptr %a, i16 %b) nounwind {1731; CHECK-LABEL: define i16 @atomicrmw_umin_i16_acq_rel(1732; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1733; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41734; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21735; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1736; CHECK:       [[ATOMICRMW_START]]:1737; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1738; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i16 [[LOADED]], [[B]]1739; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1740; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1741; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41742; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 4, i32 2)1743; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41744; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1745; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01746; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11747; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11748; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01749; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1750; CHECK:       [[ATOMICRMW_END]]:1751; CHECK-NEXT:    ret i16 [[NEWLOADED]]1752;1753  %res = atomicrmw umin ptr %a, i16 %b acq_rel1754  ret i16 %res1755}1756 1757define i16 @atomicrmw_umin_i16_seq_cst(ptr %a, i16 %b) nounwind {1758; CHECK-LABEL: define i16 @atomicrmw_umin_i16_seq_cst(1759; CHECK-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {1760; CHECK-NEXT:    [[TMP1:%.*]] = alloca i16, align 41761; CHECK-NEXT:    [[TMP2:%.*]] = load i16, ptr [[A]], align 21762; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]1763; CHECK:       [[ATOMICRMW_START]]:1764; CHECK-NEXT:    [[LOADED:%.*]] = phi i16 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]1765; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i16 [[LOADED]], [[B]]1766; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i16 [[LOADED]], i16 [[B]]1767; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])1768; CHECK-NEXT:    store i16 [[LOADED]], ptr [[TMP1]], align 41769; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[A]], ptr [[TMP1]], i16 [[NEW]], i32 5, i32 5)1770; CHECK-NEXT:    [[TMP5:%.*]] = load i16, ptr [[TMP1]], align 41771; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])1772; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP5]], 01773; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i16, i1 } [[TMP6]], i1 [[TMP4]], 11774; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP7]], 11775; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP7]], 01776; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]1777; CHECK:       [[ATOMICRMW_END]]:1778; CHECK-NEXT:    ret i16 [[NEWLOADED]]1779;1780  %res = atomicrmw umin ptr %a, i16 %b seq_cst1781  ret i16 %res1782}1783 1784define i32 @atomicrmw_xchg_i32_monotonic(ptr %a, i32 %b) nounwind {1785; CHECK-LABEL: define i32 @atomicrmw_xchg_i32_monotonic(1786; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1787; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_exchange_4(ptr [[A]], i32 [[B]], i32 0)1788; CHECK-NEXT:    ret i32 [[TMP1]]1789;1790  %res = atomicrmw xchg ptr %a, i32 %b monotonic1791  ret i32 %res1792}1793 1794define i32 @atomicrmw_xchg_i32_acquire(ptr %a, i32 %b) nounwind {1795; CHECK-LABEL: define i32 @atomicrmw_xchg_i32_acquire(1796; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1797; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_exchange_4(ptr [[A]], i32 [[B]], i32 2)1798; CHECK-NEXT:    ret i32 [[TMP1]]1799;1800  %res = atomicrmw xchg ptr %a, i32 %b acquire1801  ret i32 %res1802}1803 1804define i32 @atomicrmw_xchg_i32_release(ptr %a, i32 %b) nounwind {1805; CHECK-LABEL: define i32 @atomicrmw_xchg_i32_release(1806; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1807; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_exchange_4(ptr [[A]], i32 [[B]], i32 3)1808; CHECK-NEXT:    ret i32 [[TMP1]]1809;1810  %res = atomicrmw xchg ptr %a, i32 %b release1811  ret i32 %res1812}1813 1814define i32 @atomicrmw_xchg_i32_acq_rel(ptr %a, i32 %b) nounwind {1815; CHECK-LABEL: define i32 @atomicrmw_xchg_i32_acq_rel(1816; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1817; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_exchange_4(ptr [[A]], i32 [[B]], i32 4)1818; CHECK-NEXT:    ret i32 [[TMP1]]1819;1820  %res = atomicrmw xchg ptr %a, i32 %b acq_rel1821  ret i32 %res1822}1823 1824define i32 @atomicrmw_xchg_i32_seq_cst(ptr %a, i32 %b) nounwind {1825; CHECK-LABEL: define i32 @atomicrmw_xchg_i32_seq_cst(1826; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1827; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_exchange_4(ptr [[A]], i32 [[B]], i32 5)1828; CHECK-NEXT:    ret i32 [[TMP1]]1829;1830  %res = atomicrmw xchg ptr %a, i32 %b seq_cst1831  ret i32 %res1832}1833 1834define i32 @atomicrmw_add_i32_monotonic(ptr %a, i32 %b) nounwind {1835; CHECK-LABEL: define i32 @atomicrmw_add_i32_monotonic(1836; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1837; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_add_4(ptr [[A]], i32 [[B]], i32 0)1838; CHECK-NEXT:    ret i32 [[TMP1]]1839;1840  %res = atomicrmw add ptr %a, i32 %b monotonic1841  ret i32 %res1842}1843 1844define i32 @atomicrmw_add_i32_acquire(ptr %a, i32 %b) nounwind {1845; CHECK-LABEL: define i32 @atomicrmw_add_i32_acquire(1846; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1847; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_add_4(ptr [[A]], i32 [[B]], i32 2)1848; CHECK-NEXT:    ret i32 [[TMP1]]1849;1850  %res = atomicrmw add ptr %a, i32 %b acquire1851  ret i32 %res1852}1853 1854define i32 @atomicrmw_add_i32_release(ptr %a, i32 %b) nounwind {1855; CHECK-LABEL: define i32 @atomicrmw_add_i32_release(1856; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1857; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_add_4(ptr [[A]], i32 [[B]], i32 3)1858; CHECK-NEXT:    ret i32 [[TMP1]]1859;1860  %res = atomicrmw add ptr %a, i32 %b release1861  ret i32 %res1862}1863 1864define i32 @atomicrmw_add_i32_acq_rel(ptr %a, i32 %b) nounwind {1865; CHECK-LABEL: define i32 @atomicrmw_add_i32_acq_rel(1866; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1867; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_add_4(ptr [[A]], i32 [[B]], i32 4)1868; CHECK-NEXT:    ret i32 [[TMP1]]1869;1870  %res = atomicrmw add ptr %a, i32 %b acq_rel1871  ret i32 %res1872}1873 1874define i32 @atomicrmw_add_i32_seq_cst(ptr %a, i32 %b) nounwind {1875; CHECK-LABEL: define i32 @atomicrmw_add_i32_seq_cst(1876; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1877; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_add_4(ptr [[A]], i32 [[B]], i32 5)1878; CHECK-NEXT:    ret i32 [[TMP1]]1879;1880  %res = atomicrmw add ptr %a, i32 %b seq_cst1881  ret i32 %res1882}1883 1884define i32 @atomicrmw_sub_i32_monotonic(ptr %a, i32 %b) nounwind {1885; CHECK-LABEL: define i32 @atomicrmw_sub_i32_monotonic(1886; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1887; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_sub_4(ptr [[A]], i32 [[B]], i32 0)1888; CHECK-NEXT:    ret i32 [[TMP1]]1889;1890  %res = atomicrmw sub ptr %a, i32 %b monotonic1891  ret i32 %res1892}1893 1894define i32 @atomicrmw_sub_i32_acquire(ptr %a, i32 %b) nounwind {1895; CHECK-LABEL: define i32 @atomicrmw_sub_i32_acquire(1896; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1897; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_sub_4(ptr [[A]], i32 [[B]], i32 2)1898; CHECK-NEXT:    ret i32 [[TMP1]]1899;1900  %res = atomicrmw sub ptr %a, i32 %b acquire1901  ret i32 %res1902}1903 1904define i32 @atomicrmw_sub_i32_release(ptr %a, i32 %b) nounwind {1905; CHECK-LABEL: define i32 @atomicrmw_sub_i32_release(1906; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1907; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_sub_4(ptr [[A]], i32 [[B]], i32 3)1908; CHECK-NEXT:    ret i32 [[TMP1]]1909;1910  %res = atomicrmw sub ptr %a, i32 %b release1911  ret i32 %res1912}1913 1914define i32 @atomicrmw_sub_i32_acq_rel(ptr %a, i32 %b) nounwind {1915; CHECK-LABEL: define i32 @atomicrmw_sub_i32_acq_rel(1916; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1917; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_sub_4(ptr [[A]], i32 [[B]], i32 4)1918; CHECK-NEXT:    ret i32 [[TMP1]]1919;1920  %res = atomicrmw sub ptr %a, i32 %b acq_rel1921  ret i32 %res1922}1923 1924define i32 @atomicrmw_sub_i32_seq_cst(ptr %a, i32 %b) nounwind {1925; CHECK-LABEL: define i32 @atomicrmw_sub_i32_seq_cst(1926; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1927; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_sub_4(ptr [[A]], i32 [[B]], i32 5)1928; CHECK-NEXT:    ret i32 [[TMP1]]1929;1930  %res = atomicrmw sub ptr %a, i32 %b seq_cst1931  ret i32 %res1932}1933 1934define i32 @atomicrmw_and_i32_monotonic(ptr %a, i32 %b) nounwind {1935; CHECK-LABEL: define i32 @atomicrmw_and_i32_monotonic(1936; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1937; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_and_4(ptr [[A]], i32 [[B]], i32 0)1938; CHECK-NEXT:    ret i32 [[TMP1]]1939;1940  %res = atomicrmw and ptr %a, i32 %b monotonic1941  ret i32 %res1942}1943 1944define i32 @atomicrmw_and_i32_acquire(ptr %a, i32 %b) nounwind {1945; CHECK-LABEL: define i32 @atomicrmw_and_i32_acquire(1946; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1947; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_and_4(ptr [[A]], i32 [[B]], i32 2)1948; CHECK-NEXT:    ret i32 [[TMP1]]1949;1950  %res = atomicrmw and ptr %a, i32 %b acquire1951  ret i32 %res1952}1953 1954define i32 @atomicrmw_and_i32_release(ptr %a, i32 %b) nounwind {1955; CHECK-LABEL: define i32 @atomicrmw_and_i32_release(1956; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1957; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_and_4(ptr [[A]], i32 [[B]], i32 3)1958; CHECK-NEXT:    ret i32 [[TMP1]]1959;1960  %res = atomicrmw and ptr %a, i32 %b release1961  ret i32 %res1962}1963 1964define i32 @atomicrmw_and_i32_acq_rel(ptr %a, i32 %b) nounwind {1965; CHECK-LABEL: define i32 @atomicrmw_and_i32_acq_rel(1966; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1967; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_and_4(ptr [[A]], i32 [[B]], i32 4)1968; CHECK-NEXT:    ret i32 [[TMP1]]1969;1970  %res = atomicrmw and ptr %a, i32 %b acq_rel1971  ret i32 %res1972}1973 1974define i32 @atomicrmw_and_i32_seq_cst(ptr %a, i32 %b) nounwind {1975; CHECK-LABEL: define i32 @atomicrmw_and_i32_seq_cst(1976; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {1977; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_and_4(ptr [[A]], i32 [[B]], i32 5)1978; CHECK-NEXT:    ret i32 [[TMP1]]1979;1980  %res = atomicrmw and ptr %a, i32 %b seq_cst1981  ret i32 %res1982}1983 1984;define i32 @atomicrmw_nand_i32_monotonic(ptr %a, i32 %b) nounwind {1985;  %res = atomicrmw nand ptr %a, i32 %b monotonic1986;  ret i32 %res1987;}1988;define i32 @atomicrmw_nand_i32_acquire(ptr %a, i32 %b) nounwind {1989;  %res = atomicrmw nand ptr %a, i32 %b acquire1990;  ret i32 %res1991;}1992;define i32 @atomicrmw_nand_i32_release(ptr %a, i32 %b) nounwind {1993;  %res = atomicrmw nand ptr %a, i32 %b release1994;  ret i32 %res1995;}1996;define i32 @atomicrmw_nand_i32_acq_rel(ptr %a, i32 %b) nounwind {1997;  %res = atomicrmw nand ptr %a, i32 %b acq_rel1998;  ret i32 %res1999;}2000;define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {2001;  %res = atomicrmw nand ptr %a, i32 %b seq_cst2002;  ret i32 %res2003;}2004 2005define i32 @atomicrmw_or_i32_monotonic(ptr %a, i32 %b) nounwind {2006; CHECK-LABEL: define i32 @atomicrmw_or_i32_monotonic(2007; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2008; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_or_4(ptr [[A]], i32 [[B]], i32 0)2009; CHECK-NEXT:    ret i32 [[TMP1]]2010;2011  %res = atomicrmw or ptr %a, i32 %b monotonic2012  ret i32 %res2013}2014 2015define i32 @atomicrmw_or_i32_acquire(ptr %a, i32 %b) nounwind {2016; CHECK-LABEL: define i32 @atomicrmw_or_i32_acquire(2017; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2018; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_or_4(ptr [[A]], i32 [[B]], i32 2)2019; CHECK-NEXT:    ret i32 [[TMP1]]2020;2021  %res = atomicrmw or ptr %a, i32 %b acquire2022  ret i32 %res2023}2024 2025define i32 @atomicrmw_or_i32_release(ptr %a, i32 %b) nounwind {2026; CHECK-LABEL: define i32 @atomicrmw_or_i32_release(2027; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2028; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_or_4(ptr [[A]], i32 [[B]], i32 3)2029; CHECK-NEXT:    ret i32 [[TMP1]]2030;2031  %res = atomicrmw or ptr %a, i32 %b release2032  ret i32 %res2033}2034 2035define i32 @atomicrmw_or_i32_acq_rel(ptr %a, i32 %b) nounwind {2036; CHECK-LABEL: define i32 @atomicrmw_or_i32_acq_rel(2037; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2038; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_or_4(ptr [[A]], i32 [[B]], i32 4)2039; CHECK-NEXT:    ret i32 [[TMP1]]2040;2041  %res = atomicrmw or ptr %a, i32 %b acq_rel2042  ret i32 %res2043}2044 2045define i32 @atomicrmw_or_i32_seq_cst(ptr %a, i32 %b) nounwind {2046; CHECK-LABEL: define i32 @atomicrmw_or_i32_seq_cst(2047; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2048; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_or_4(ptr [[A]], i32 [[B]], i32 5)2049; CHECK-NEXT:    ret i32 [[TMP1]]2050;2051  %res = atomicrmw or ptr %a, i32 %b seq_cst2052  ret i32 %res2053}2054 2055define i32 @atomicrmw_xor_i32_monotonic(ptr %a, i32 %b) nounwind {2056; CHECK-LABEL: define i32 @atomicrmw_xor_i32_monotonic(2057; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2058; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_xor_4(ptr [[A]], i32 [[B]], i32 0)2059; CHECK-NEXT:    ret i32 [[TMP1]]2060;2061  %res = atomicrmw xor ptr %a, i32 %b monotonic2062  ret i32 %res2063}2064 2065define i32 @atomicrmw_xor_i32_acquire(ptr %a, i32 %b) nounwind {2066; CHECK-LABEL: define i32 @atomicrmw_xor_i32_acquire(2067; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2068; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_xor_4(ptr [[A]], i32 [[B]], i32 2)2069; CHECK-NEXT:    ret i32 [[TMP1]]2070;2071  %res = atomicrmw xor ptr %a, i32 %b acquire2072  ret i32 %res2073}2074 2075define i32 @atomicrmw_xor_i32_release(ptr %a, i32 %b) nounwind {2076; CHECK-LABEL: define i32 @atomicrmw_xor_i32_release(2077; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2078; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_xor_4(ptr [[A]], i32 [[B]], i32 3)2079; CHECK-NEXT:    ret i32 [[TMP1]]2080;2081  %res = atomicrmw xor ptr %a, i32 %b release2082  ret i32 %res2083}2084 2085define i32 @atomicrmw_xor_i32_acq_rel(ptr %a, i32 %b) nounwind {2086; CHECK-LABEL: define i32 @atomicrmw_xor_i32_acq_rel(2087; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2088; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_xor_4(ptr [[A]], i32 [[B]], i32 4)2089; CHECK-NEXT:    ret i32 [[TMP1]]2090;2091  %res = atomicrmw xor ptr %a, i32 %b acq_rel2092  ret i32 %res2093}2094 2095define i32 @atomicrmw_xor_i32_seq_cst(ptr %a, i32 %b) nounwind {2096; CHECK-LABEL: define i32 @atomicrmw_xor_i32_seq_cst(2097; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2098; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @__atomic_fetch_xor_4(ptr [[A]], i32 [[B]], i32 5)2099; CHECK-NEXT:    ret i32 [[TMP1]]2100;2101  %res = atomicrmw xor ptr %a, i32 %b seq_cst2102  ret i32 %res2103}2104 2105define i32 @atomicrmw_max_i32_monotonic(ptr %a, i32 %b) nounwind {2106; CHECK-LABEL: define i32 @atomicrmw_max_i32_monotonic(2107; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2108; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42109; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42110; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2111; CHECK:       [[ATOMICRMW_START]]:2112; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2113; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[LOADED]], [[B]]2114; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2115; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2116; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42117; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 0, i32 0)2118; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42119; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2120; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02121; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12122; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12123; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02124; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2125; CHECK:       [[ATOMICRMW_END]]:2126; CHECK-NEXT:    ret i32 [[NEWLOADED]]2127;2128  %res = atomicrmw max ptr %a, i32 %b monotonic2129  ret i32 %res2130}2131 2132define i32 @atomicrmw_max_i32_acquire(ptr %a, i32 %b) nounwind {2133; CHECK-LABEL: define i32 @atomicrmw_max_i32_acquire(2134; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2135; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42136; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42137; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2138; CHECK:       [[ATOMICRMW_START]]:2139; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2140; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[LOADED]], [[B]]2141; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2142; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2143; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42144; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 2, i32 2)2145; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42146; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2147; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02148; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12149; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12150; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02151; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2152; CHECK:       [[ATOMICRMW_END]]:2153; CHECK-NEXT:    ret i32 [[NEWLOADED]]2154;2155  %res = atomicrmw max ptr %a, i32 %b acquire2156  ret i32 %res2157}2158 2159define i32 @atomicrmw_max_i32_release(ptr %a, i32 %b) nounwind {2160; CHECK-LABEL: define i32 @atomicrmw_max_i32_release(2161; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2162; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42163; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42164; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2165; CHECK:       [[ATOMICRMW_START]]:2166; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2167; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[LOADED]], [[B]]2168; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2169; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2170; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42171; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 3, i32 0)2172; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42173; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2174; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02175; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12176; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12177; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02178; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2179; CHECK:       [[ATOMICRMW_END]]:2180; CHECK-NEXT:    ret i32 [[NEWLOADED]]2181;2182  %res = atomicrmw max ptr %a, i32 %b release2183  ret i32 %res2184}2185 2186define i32 @atomicrmw_max_i32_acq_rel(ptr %a, i32 %b) nounwind {2187; CHECK-LABEL: define i32 @atomicrmw_max_i32_acq_rel(2188; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2189; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42190; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42191; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2192; CHECK:       [[ATOMICRMW_START]]:2193; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2194; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[LOADED]], [[B]]2195; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2196; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2197; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42198; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 4, i32 2)2199; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42200; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2201; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02202; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12203; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12204; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02205; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2206; CHECK:       [[ATOMICRMW_END]]:2207; CHECK-NEXT:    ret i32 [[NEWLOADED]]2208;2209  %res = atomicrmw max ptr %a, i32 %b acq_rel2210  ret i32 %res2211}2212 2213define i32 @atomicrmw_max_i32_seq_cst(ptr %a, i32 %b) nounwind {2214; CHECK-LABEL: define i32 @atomicrmw_max_i32_seq_cst(2215; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2216; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42217; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42218; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2219; CHECK:       [[ATOMICRMW_START]]:2220; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2221; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[LOADED]], [[B]]2222; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2223; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2224; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42225; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 5, i32 5)2226; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42227; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2228; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02229; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12230; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12231; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02232; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2233; CHECK:       [[ATOMICRMW_END]]:2234; CHECK-NEXT:    ret i32 [[NEWLOADED]]2235;2236  %res = atomicrmw max ptr %a, i32 %b seq_cst2237  ret i32 %res2238}2239 2240define i32 @atomicrmw_min_i32_monotonic(ptr %a, i32 %b) nounwind {2241; CHECK-LABEL: define i32 @atomicrmw_min_i32_monotonic(2242; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2243; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42244; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42245; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2246; CHECK:       [[ATOMICRMW_START]]:2247; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2248; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i32 [[LOADED]], [[B]]2249; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2250; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2251; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42252; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 0, i32 0)2253; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42254; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2255; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02256; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12257; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12258; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02259; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2260; CHECK:       [[ATOMICRMW_END]]:2261; CHECK-NEXT:    ret i32 [[NEWLOADED]]2262;2263  %res = atomicrmw min ptr %a, i32 %b monotonic2264  ret i32 %res2265}2266 2267define i32 @atomicrmw_min_i32_acquire(ptr %a, i32 %b) nounwind {2268; CHECK-LABEL: define i32 @atomicrmw_min_i32_acquire(2269; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2270; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42271; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42272; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2273; CHECK:       [[ATOMICRMW_START]]:2274; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2275; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i32 [[LOADED]], [[B]]2276; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2277; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2278; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42279; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 2, i32 2)2280; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42281; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2282; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02283; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12284; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12285; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02286; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2287; CHECK:       [[ATOMICRMW_END]]:2288; CHECK-NEXT:    ret i32 [[NEWLOADED]]2289;2290  %res = atomicrmw min ptr %a, i32 %b acquire2291  ret i32 %res2292}2293 2294define i32 @atomicrmw_min_i32_release(ptr %a, i32 %b) nounwind {2295; CHECK-LABEL: define i32 @atomicrmw_min_i32_release(2296; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2297; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42298; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42299; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2300; CHECK:       [[ATOMICRMW_START]]:2301; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2302; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i32 [[LOADED]], [[B]]2303; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2304; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2305; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42306; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 3, i32 0)2307; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42308; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2309; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02310; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12311; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12312; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02313; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2314; CHECK:       [[ATOMICRMW_END]]:2315; CHECK-NEXT:    ret i32 [[NEWLOADED]]2316;2317  %res = atomicrmw min ptr %a, i32 %b release2318  ret i32 %res2319}2320 2321define i32 @atomicrmw_min_i32_acq_rel(ptr %a, i32 %b) nounwind {2322; CHECK-LABEL: define i32 @atomicrmw_min_i32_acq_rel(2323; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2324; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42325; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42326; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2327; CHECK:       [[ATOMICRMW_START]]:2328; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2329; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i32 [[LOADED]], [[B]]2330; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2331; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2332; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42333; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 4, i32 2)2334; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42335; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2336; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02337; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12338; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12339; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02340; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2341; CHECK:       [[ATOMICRMW_END]]:2342; CHECK-NEXT:    ret i32 [[NEWLOADED]]2343;2344  %res = atomicrmw min ptr %a, i32 %b acq_rel2345  ret i32 %res2346}2347 2348define i32 @atomicrmw_min_i32_seq_cst(ptr %a, i32 %b) nounwind {2349; CHECK-LABEL: define i32 @atomicrmw_min_i32_seq_cst(2350; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2351; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42352; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42353; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2354; CHECK:       [[ATOMICRMW_START]]:2355; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2356; CHECK-NEXT:    [[TMP3:%.*]] = icmp sle i32 [[LOADED]], [[B]]2357; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2358; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2359; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42360; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 5, i32 5)2361; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42362; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2363; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02364; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12365; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12366; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02367; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2368; CHECK:       [[ATOMICRMW_END]]:2369; CHECK-NEXT:    ret i32 [[NEWLOADED]]2370;2371  %res = atomicrmw min ptr %a, i32 %b seq_cst2372  ret i32 %res2373}2374 2375define i32 @atomicrmw_umax_i32_monotonic(ptr %a, i32 %b) nounwind {2376; CHECK-LABEL: define i32 @atomicrmw_umax_i32_monotonic(2377; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2378; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42379; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42380; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2381; CHECK:       [[ATOMICRMW_START]]:2382; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2383; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i32 [[LOADED]], [[B]]2384; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2385; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2386; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42387; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 0, i32 0)2388; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42389; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2390; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02391; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12392; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12393; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02394; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2395; CHECK:       [[ATOMICRMW_END]]:2396; CHECK-NEXT:    ret i32 [[NEWLOADED]]2397;2398  %res = atomicrmw umax ptr %a, i32 %b monotonic2399  ret i32 %res2400}2401 2402define i32 @atomicrmw_umax_i32_acquire(ptr %a, i32 %b) nounwind {2403; CHECK-LABEL: define i32 @atomicrmw_umax_i32_acquire(2404; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2405; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42406; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42407; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2408; CHECK:       [[ATOMICRMW_START]]:2409; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2410; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i32 [[LOADED]], [[B]]2411; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2412; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2413; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42414; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 2, i32 2)2415; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42416; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2417; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02418; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12419; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12420; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02421; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2422; CHECK:       [[ATOMICRMW_END]]:2423; CHECK-NEXT:    ret i32 [[NEWLOADED]]2424;2425  %res = atomicrmw umax ptr %a, i32 %b acquire2426  ret i32 %res2427}2428 2429define i32 @atomicrmw_umax_i32_release(ptr %a, i32 %b) nounwind {2430; CHECK-LABEL: define i32 @atomicrmw_umax_i32_release(2431; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2432; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42433; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42434; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2435; CHECK:       [[ATOMICRMW_START]]:2436; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2437; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i32 [[LOADED]], [[B]]2438; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2439; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2440; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42441; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 3, i32 0)2442; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42443; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2444; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02445; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12446; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12447; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02448; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2449; CHECK:       [[ATOMICRMW_END]]:2450; CHECK-NEXT:    ret i32 [[NEWLOADED]]2451;2452  %res = atomicrmw umax ptr %a, i32 %b release2453  ret i32 %res2454}2455 2456define i32 @atomicrmw_umax_i32_acq_rel(ptr %a, i32 %b) nounwind {2457; CHECK-LABEL: define i32 @atomicrmw_umax_i32_acq_rel(2458; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2459; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42460; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42461; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2462; CHECK:       [[ATOMICRMW_START]]:2463; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2464; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i32 [[LOADED]], [[B]]2465; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2466; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2467; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42468; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 4, i32 2)2469; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42470; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2471; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02472; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12473; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12474; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02475; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2476; CHECK:       [[ATOMICRMW_END]]:2477; CHECK-NEXT:    ret i32 [[NEWLOADED]]2478;2479  %res = atomicrmw umax ptr %a, i32 %b acq_rel2480  ret i32 %res2481}2482 2483define i32 @atomicrmw_umax_i32_seq_cst(ptr %a, i32 %b) nounwind {2484; CHECK-LABEL: define i32 @atomicrmw_umax_i32_seq_cst(2485; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2486; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42487; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42488; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2489; CHECK:       [[ATOMICRMW_START]]:2490; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2491; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i32 [[LOADED]], [[B]]2492; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2493; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2494; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42495; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 5, i32 5)2496; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42497; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2498; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02499; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12500; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12501; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02502; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2503; CHECK:       [[ATOMICRMW_END]]:2504; CHECK-NEXT:    ret i32 [[NEWLOADED]]2505;2506  %res = atomicrmw umax ptr %a, i32 %b seq_cst2507  ret i32 %res2508}2509 2510define i32 @atomicrmw_umin_i32_monotonic(ptr %a, i32 %b) nounwind {2511; CHECK-LABEL: define i32 @atomicrmw_umin_i32_monotonic(2512; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2513; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42514; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42515; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2516; CHECK:       [[ATOMICRMW_START]]:2517; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2518; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i32 [[LOADED]], [[B]]2519; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2520; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2521; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42522; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 0, i32 0)2523; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42524; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2525; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02526; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12527; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12528; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02529; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2530; CHECK:       [[ATOMICRMW_END]]:2531; CHECK-NEXT:    ret i32 [[NEWLOADED]]2532;2533  %res = atomicrmw umin ptr %a, i32 %b monotonic2534  ret i32 %res2535}2536 2537define i32 @atomicrmw_umin_i32_acquire(ptr %a, i32 %b) nounwind {2538; CHECK-LABEL: define i32 @atomicrmw_umin_i32_acquire(2539; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2540; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42541; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42542; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2543; CHECK:       [[ATOMICRMW_START]]:2544; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2545; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i32 [[LOADED]], [[B]]2546; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2547; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2548; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42549; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 2, i32 2)2550; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42551; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2552; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02553; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12554; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12555; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02556; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2557; CHECK:       [[ATOMICRMW_END]]:2558; CHECK-NEXT:    ret i32 [[NEWLOADED]]2559;2560  %res = atomicrmw umin ptr %a, i32 %b acquire2561  ret i32 %res2562}2563 2564define i32 @atomicrmw_umin_i32_release(ptr %a, i32 %b) nounwind {2565; CHECK-LABEL: define i32 @atomicrmw_umin_i32_release(2566; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2567; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42568; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42569; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2570; CHECK:       [[ATOMICRMW_START]]:2571; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2572; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i32 [[LOADED]], [[B]]2573; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2574; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2575; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42576; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 3, i32 0)2577; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42578; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2579; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02580; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12581; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12582; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02583; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2584; CHECK:       [[ATOMICRMW_END]]:2585; CHECK-NEXT:    ret i32 [[NEWLOADED]]2586;2587  %res = atomicrmw umin ptr %a, i32 %b release2588  ret i32 %res2589}2590 2591define i32 @atomicrmw_umin_i32_acq_rel(ptr %a, i32 %b) nounwind {2592; CHECK-LABEL: define i32 @atomicrmw_umin_i32_acq_rel(2593; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2594; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42595; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42596; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2597; CHECK:       [[ATOMICRMW_START]]:2598; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2599; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i32 [[LOADED]], [[B]]2600; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2601; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2602; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42603; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 4, i32 2)2604; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42605; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2606; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02607; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12608; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12609; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02610; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2611; CHECK:       [[ATOMICRMW_END]]:2612; CHECK-NEXT:    ret i32 [[NEWLOADED]]2613;2614  %res = atomicrmw umin ptr %a, i32 %b acq_rel2615  ret i32 %res2616}2617 2618define i32 @atomicrmw_umin_i32_seq_cst(ptr %a, i32 %b) nounwind {2619; CHECK-LABEL: define i32 @atomicrmw_umin_i32_seq_cst(2620; CHECK-SAME: ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR0]] {2621; CHECK-NEXT:    [[TMP1:%.*]] = alloca i32, align 42622; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[A]], align 42623; CHECK-NEXT:    br label %[[ATOMICRMW_START:.*]]2624; CHECK:       [[ATOMICRMW_START]]:2625; CHECK-NEXT:    [[LOADED:%.*]] = phi i32 [ [[TMP2]], [[TMP0:%.*]] ], [ [[NEWLOADED:%.*]], %[[ATOMICRMW_START]] ]2626; CHECK-NEXT:    [[TMP3:%.*]] = icmp ule i32 [[LOADED]], [[B]]2627; CHECK-NEXT:    [[NEW:%.*]] = select i1 [[TMP3]], i32 [[LOADED]], i32 [[B]]2628; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[TMP1]])2629; CHECK-NEXT:    store i32 [[LOADED]], ptr [[TMP1]], align 42630; CHECK-NEXT:    [[TMP4:%.*]] = call zeroext i1 @__atomic_compare_exchange_4(ptr [[A]], ptr [[TMP1]], i32 [[NEW]], i32 5, i32 5)2631; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP1]], align 42632; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[TMP1]])2633; CHECK-NEXT:    [[TMP6:%.*]] = insertvalue { i32, i1 } poison, i32 [[TMP5]], 02634; CHECK-NEXT:    [[TMP7:%.*]] = insertvalue { i32, i1 } [[TMP6]], i1 [[TMP4]], 12635; CHECK-NEXT:    [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP7]], 12636; CHECK-NEXT:    [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP7]], 02637; CHECK-NEXT:    br i1 [[SUCCESS]], label %[[ATOMICRMW_END:.*]], label %[[ATOMICRMW_START]]2638; CHECK:       [[ATOMICRMW_END]]:2639; CHECK-NEXT:    ret i32 [[NEWLOADED]]2640;2641  %res = atomicrmw umin ptr %a, i32 %b seq_cst2642  ret i32 %res2643}2644