4201 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -mtriple=aarch64-linux-gnu -passes=atomic-expand %s | FileCheck %s3 4define i8 @atomic8_load_unordered(ptr %a) nounwind uwtable {5; CHECK-LABEL: @atomic8_load_unordered(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[TMP0:%.*]] = load atomic i8, ptr [[A:%.*]] unordered, align 1, !pcsections [[META0:![0-9]+]]8; CHECK-NEXT: ret i8 [[TMP0]]9;10entry:11 %0 = load atomic i8, ptr %a unordered, align 1, !pcsections !012 ret i8 %013}14 15define i8 @atomic8_load_monotonic(ptr %a) nounwind uwtable {16; CHECK-LABEL: @atomic8_load_monotonic(17; CHECK-NEXT: entry:18; CHECK-NEXT: [[TMP0:%.*]] = load atomic i8, ptr [[A:%.*]] monotonic, align 1, !pcsections [[META0]]19; CHECK-NEXT: ret i8 [[TMP0]]20;21entry:22 %0 = load atomic i8, ptr %a monotonic, align 1, !pcsections !023 ret i8 %024}25 26define i8 @atomic8_load_acquire(ptr %a) nounwind uwtable {27; CHECK-LABEL: @atomic8_load_acquire(28; CHECK-NEXT: entry:29; CHECK-NEXT: [[TMP0:%.*]] = load atomic i8, ptr [[A:%.*]] acquire, align 1, !pcsections [[META0]]30; CHECK-NEXT: ret i8 [[TMP0]]31;32entry:33 %0 = load atomic i8, ptr %a acquire, align 1, !pcsections !034 ret i8 %035}36 37define i8 @atomic8_load_seq_cst(ptr %a) nounwind uwtable {38; CHECK-LABEL: @atomic8_load_seq_cst(39; CHECK-NEXT: entry:40; CHECK-NEXT: [[TMP0:%.*]] = load atomic i8, ptr [[A:%.*]] seq_cst, align 1, !pcsections [[META0]]41; CHECK-NEXT: ret i8 [[TMP0]]42;43entry:44 %0 = load atomic i8, ptr %a seq_cst, align 1, !pcsections !045 ret i8 %046}47 48define void @atomic8_store_unordered(ptr %a) nounwind uwtable {49; CHECK-LABEL: @atomic8_store_unordered(50; CHECK-NEXT: entry:51; CHECK-NEXT: store atomic i8 0, ptr [[A:%.*]] unordered, align 1, !pcsections [[META0]]52; CHECK-NEXT: ret void53;54entry:55 store atomic i8 0, ptr %a unordered, align 1, !pcsections !056 ret void57}58 59define void @atomic8_store_monotonic(ptr %a) nounwind uwtable {60; CHECK-LABEL: @atomic8_store_monotonic(61; CHECK-NEXT: entry:62; CHECK-NEXT: store atomic i8 0, ptr [[A:%.*]] monotonic, align 1, !pcsections [[META0]]63; CHECK-NEXT: ret void64;65entry:66 store atomic i8 0, ptr %a monotonic, align 1, !pcsections !067 ret void68}69 70define void @atomic8_store_release(ptr %a) nounwind uwtable {71; CHECK-LABEL: @atomic8_store_release(72; CHECK-NEXT: entry:73; CHECK-NEXT: store atomic i8 0, ptr [[A:%.*]] release, align 1, !pcsections [[META0]]74; CHECK-NEXT: ret void75;76entry:77 store atomic i8 0, ptr %a release, align 1, !pcsections !078 ret void79}80 81define void @atomic8_store_seq_cst(ptr %a) nounwind uwtable {82; CHECK-LABEL: @atomic8_store_seq_cst(83; CHECK-NEXT: entry:84; CHECK-NEXT: store atomic i8 0, ptr [[A:%.*]] seq_cst, align 1, !pcsections [[META0]]85; CHECK-NEXT: ret void86;87entry:88 store atomic i8 0, ptr %a seq_cst, align 1, !pcsections !089 ret void90}91 92define void @atomic8_xchg_monotonic(ptr %a) nounwind uwtable {93; CHECK-LABEL: @atomic8_xchg_monotonic(94; CHECK-NEXT: entry:95; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]96; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]97; CHECK: atomicrmw.start:98; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]99; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 monotonic monotonic, align 1, !pcsections [[META0]]100; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]101; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]102; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]103; CHECK: atomicrmw.end:104; CHECK-NEXT: ret void105;106entry:107 atomicrmw xchg ptr %a, i8 0 monotonic, !pcsections !0108 ret void109}110 111define void @atomic8_add_monotonic(ptr %a) nounwind uwtable {112; CHECK-LABEL: @atomic8_add_monotonic(113; CHECK-NEXT: entry:114; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]115; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]116; CHECK: atomicrmw.start:117; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]118; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] monotonic monotonic, align 1, !pcsections [[META0]]119; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]120; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]121; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]122; CHECK: atomicrmw.end:123; CHECK-NEXT: ret void124;125entry:126 atomicrmw add ptr %a, i8 0 monotonic, !pcsections !0127 ret void128}129 130define void @atomic8_sub_monotonic(ptr %a) nounwind uwtable {131; CHECK-LABEL: @atomic8_sub_monotonic(132; CHECK-NEXT: entry:133; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]134; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]135; CHECK: atomicrmw.start:136; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]137; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] monotonic monotonic, align 1, !pcsections [[META0]]138; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]139; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]140; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]141; CHECK: atomicrmw.end:142; CHECK-NEXT: ret void143;144entry:145 atomicrmw sub ptr %a, i8 0 monotonic, !pcsections !0146 ret void147}148 149define void @atomic8_and_monotonic(ptr %a) nounwind uwtable {150; CHECK-LABEL: @atomic8_and_monotonic(151; CHECK-NEXT: entry:152; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]153; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]154; CHECK: atomicrmw.start:155; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]156; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 monotonic monotonic, align 1, !pcsections [[META0]]157; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]158; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]159; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]160; CHECK: atomicrmw.end:161; CHECK-NEXT: ret void162;163entry:164 atomicrmw and ptr %a, i8 0 monotonic, !pcsections !0165 ret void166}167 168define void @atomic8_or_monotonic(ptr %a) nounwind uwtable {169; CHECK-LABEL: @atomic8_or_monotonic(170; CHECK-NEXT: entry:171; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]172; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]173; CHECK: atomicrmw.start:174; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]175; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] monotonic monotonic, align 1, !pcsections [[META0]]176; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]177; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]178; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]179; CHECK: atomicrmw.end:180; CHECK-NEXT: ret void181;182entry:183 atomicrmw or ptr %a, i8 0 monotonic, !pcsections !0184 ret void185}186 187define void @atomic8_xor_monotonic(ptr %a) nounwind uwtable {188; CHECK-LABEL: @atomic8_xor_monotonic(189; CHECK-NEXT: entry:190; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]191; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]192; CHECK: atomicrmw.start:193; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]194; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] monotonic monotonic, align 1, !pcsections [[META0]]195; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]196; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]197; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]198; CHECK: atomicrmw.end:199; CHECK-NEXT: ret void200;201entry:202 atomicrmw xor ptr %a, i8 0 monotonic, !pcsections !0203 ret void204}205 206define void @atomic8_nand_monotonic(ptr %a) nounwind uwtable {207; CHECK-LABEL: @atomic8_nand_monotonic(208; CHECK-NEXT: entry:209; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]210; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]211; CHECK: atomicrmw.start:212; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]213; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 -1 monotonic monotonic, align 1, !pcsections [[META0]]214; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]215; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]216; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]217; CHECK: atomicrmw.end:218; CHECK-NEXT: ret void219;220entry:221 atomicrmw nand ptr %a, i8 0 monotonic, !pcsections !0222 ret void223}224 225define void @atomic8_xchg_acquire(ptr %a) nounwind uwtable {226; CHECK-LABEL: @atomic8_xchg_acquire(227; CHECK-NEXT: entry:228; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]229; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]230; CHECK: atomicrmw.start:231; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]232; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 acquire acquire, align 1, !pcsections [[META0]]233; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]234; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]235; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]236; CHECK: atomicrmw.end:237; CHECK-NEXT: ret void238;239entry:240 atomicrmw xchg ptr %a, i8 0 acquire, !pcsections !0241 ret void242}243 244define void @atomic8_add_acquire(ptr %a) nounwind uwtable {245; CHECK-LABEL: @atomic8_add_acquire(246; CHECK-NEXT: entry:247; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]248; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]249; CHECK: atomicrmw.start:250; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]251; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acquire acquire, align 1, !pcsections [[META0]]252; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]253; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]254; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]255; CHECK: atomicrmw.end:256; CHECK-NEXT: ret void257;258entry:259 atomicrmw add ptr %a, i8 0 acquire, !pcsections !0260 ret void261}262 263define void @atomic8_sub_acquire(ptr %a) nounwind uwtable {264; CHECK-LABEL: @atomic8_sub_acquire(265; CHECK-NEXT: entry:266; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]267; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]268; CHECK: atomicrmw.start:269; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]270; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acquire acquire, align 1, !pcsections [[META0]]271; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]272; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]273; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]274; CHECK: atomicrmw.end:275; CHECK-NEXT: ret void276;277entry:278 atomicrmw sub ptr %a, i8 0 acquire, !pcsections !0279 ret void280}281 282define void @atomic8_and_acquire(ptr %a) nounwind uwtable {283; CHECK-LABEL: @atomic8_and_acquire(284; CHECK-NEXT: entry:285; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]286; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]287; CHECK: atomicrmw.start:288; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]289; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 acquire acquire, align 1, !pcsections [[META0]]290; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]291; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]292; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]293; CHECK: atomicrmw.end:294; CHECK-NEXT: ret void295;296entry:297 atomicrmw and ptr %a, i8 0 acquire, !pcsections !0298 ret void299}300 301define void @atomic8_or_acquire(ptr %a) nounwind uwtable {302; CHECK-LABEL: @atomic8_or_acquire(303; CHECK-NEXT: entry:304; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]305; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]306; CHECK: atomicrmw.start:307; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]308; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acquire acquire, align 1, !pcsections [[META0]]309; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]310; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]311; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]312; CHECK: atomicrmw.end:313; CHECK-NEXT: ret void314;315entry:316 atomicrmw or ptr %a, i8 0 acquire, !pcsections !0317 ret void318}319 320define void @atomic8_xor_acquire(ptr %a) nounwind uwtable {321; CHECK-LABEL: @atomic8_xor_acquire(322; CHECK-NEXT: entry:323; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]324; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]325; CHECK: atomicrmw.start:326; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]327; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acquire acquire, align 1, !pcsections [[META0]]328; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]329; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]330; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]331; CHECK: atomicrmw.end:332; CHECK-NEXT: ret void333;334entry:335 atomicrmw xor ptr %a, i8 0 acquire, !pcsections !0336 ret void337}338 339define void @atomic8_nand_acquire(ptr %a) nounwind uwtable {340; CHECK-LABEL: @atomic8_nand_acquire(341; CHECK-NEXT: entry:342; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]343; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]344; CHECK: atomicrmw.start:345; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]346; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 -1 acquire acquire, align 1, !pcsections [[META0]]347; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]348; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]349; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]350; CHECK: atomicrmw.end:351; CHECK-NEXT: ret void352;353entry:354 atomicrmw nand ptr %a, i8 0 acquire, !pcsections !0355 ret void356}357 358define void @atomic8_xchg_release(ptr %a) nounwind uwtable {359; CHECK-LABEL: @atomic8_xchg_release(360; CHECK-NEXT: entry:361; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]362; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]363; CHECK: atomicrmw.start:364; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]365; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 release monotonic, align 1, !pcsections [[META0]]366; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]367; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]368; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]369; CHECK: atomicrmw.end:370; CHECK-NEXT: ret void371;372entry:373 atomicrmw xchg ptr %a, i8 0 release, !pcsections !0374 ret void375}376 377define void @atomic8_add_release(ptr %a) nounwind uwtable {378; CHECK-LABEL: @atomic8_add_release(379; CHECK-NEXT: entry:380; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]381; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]382; CHECK: atomicrmw.start:383; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]384; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] release monotonic, align 1, !pcsections [[META0]]385; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]386; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]387; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]388; CHECK: atomicrmw.end:389; CHECK-NEXT: ret void390;391entry:392 atomicrmw add ptr %a, i8 0 release, !pcsections !0393 ret void394}395 396define void @atomic8_sub_release(ptr %a) nounwind uwtable {397; CHECK-LABEL: @atomic8_sub_release(398; CHECK-NEXT: entry:399; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]400; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]401; CHECK: atomicrmw.start:402; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]403; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] release monotonic, align 1, !pcsections [[META0]]404; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]405; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]406; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]407; CHECK: atomicrmw.end:408; CHECK-NEXT: ret void409;410entry:411 atomicrmw sub ptr %a, i8 0 release, !pcsections !0412 ret void413}414 415define void @atomic8_and_release(ptr %a) nounwind uwtable {416; CHECK-LABEL: @atomic8_and_release(417; CHECK-NEXT: entry:418; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]419; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]420; CHECK: atomicrmw.start:421; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]422; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 release monotonic, align 1, !pcsections [[META0]]423; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]424; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]425; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]426; CHECK: atomicrmw.end:427; CHECK-NEXT: ret void428;429entry:430 atomicrmw and ptr %a, i8 0 release, !pcsections !0431 ret void432}433 434define void @atomic8_or_release(ptr %a) nounwind uwtable {435; CHECK-LABEL: @atomic8_or_release(436; CHECK-NEXT: entry:437; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]438; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]439; CHECK: atomicrmw.start:440; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]441; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] release monotonic, align 1, !pcsections [[META0]]442; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]443; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]444; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]445; CHECK: atomicrmw.end:446; CHECK-NEXT: ret void447;448entry:449 atomicrmw or ptr %a, i8 0 release, !pcsections !0450 ret void451}452 453define void @atomic8_xor_release(ptr %a) nounwind uwtable {454; CHECK-LABEL: @atomic8_xor_release(455; CHECK-NEXT: entry:456; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]457; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]458; CHECK: atomicrmw.start:459; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]460; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] release monotonic, align 1, !pcsections [[META0]]461; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]462; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]463; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]464; CHECK: atomicrmw.end:465; CHECK-NEXT: ret void466;467entry:468 atomicrmw xor ptr %a, i8 0 release, !pcsections !0469 ret void470}471 472define void @atomic8_nand_release(ptr %a) nounwind uwtable {473; CHECK-LABEL: @atomic8_nand_release(474; CHECK-NEXT: entry:475; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]476; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]477; CHECK: atomicrmw.start:478; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]479; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 -1 release monotonic, align 1, !pcsections [[META0]]480; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]481; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]482; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]483; CHECK: atomicrmw.end:484; CHECK-NEXT: ret void485;486entry:487 atomicrmw nand ptr %a, i8 0 release, !pcsections !0488 ret void489}490 491define void @atomic8_xchg_acq_rel(ptr %a) nounwind uwtable {492; CHECK-LABEL: @atomic8_xchg_acq_rel(493; CHECK-NEXT: entry:494; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]495; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]496; CHECK: atomicrmw.start:497; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]498; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 acq_rel acquire, align 1, !pcsections [[META0]]499; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]500; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]501; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]502; CHECK: atomicrmw.end:503; CHECK-NEXT: ret void504;505entry:506 atomicrmw xchg ptr %a, i8 0 acq_rel, !pcsections !0507 ret void508}509 510define void @atomic8_add_acq_rel(ptr %a) nounwind uwtable {511; CHECK-LABEL: @atomic8_add_acq_rel(512; CHECK-NEXT: entry:513; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]514; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]515; CHECK: atomicrmw.start:516; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]517; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acq_rel acquire, align 1, !pcsections [[META0]]518; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]519; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]520; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]521; CHECK: atomicrmw.end:522; CHECK-NEXT: ret void523;524entry:525 atomicrmw add ptr %a, i8 0 acq_rel, !pcsections !0526 ret void527}528 529define void @atomic8_sub_acq_rel(ptr %a) nounwind uwtable {530; CHECK-LABEL: @atomic8_sub_acq_rel(531; CHECK-NEXT: entry:532; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]533; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]534; CHECK: atomicrmw.start:535; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]536; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acq_rel acquire, align 1, !pcsections [[META0]]537; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]538; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]539; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]540; CHECK: atomicrmw.end:541; CHECK-NEXT: ret void542;543entry:544 atomicrmw sub ptr %a, i8 0 acq_rel, !pcsections !0545 ret void546}547 548define void @atomic8_and_acq_rel(ptr %a) nounwind uwtable {549; CHECK-LABEL: @atomic8_and_acq_rel(550; CHECK-NEXT: entry:551; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]552; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]553; CHECK: atomicrmw.start:554; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]555; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 acq_rel acquire, align 1, !pcsections [[META0]]556; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]557; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]558; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]559; CHECK: atomicrmw.end:560; CHECK-NEXT: ret void561;562entry:563 atomicrmw and ptr %a, i8 0 acq_rel, !pcsections !0564 ret void565}566 567define void @atomic8_or_acq_rel(ptr %a) nounwind uwtable {568; CHECK-LABEL: @atomic8_or_acq_rel(569; CHECK-NEXT: entry:570; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]571; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]572; CHECK: atomicrmw.start:573; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]574; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acq_rel acquire, align 1, !pcsections [[META0]]575; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]576; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]577; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]578; CHECK: atomicrmw.end:579; CHECK-NEXT: ret void580;581entry:582 atomicrmw or ptr %a, i8 0 acq_rel, !pcsections !0583 ret void584}585 586define void @atomic8_xor_acq_rel(ptr %a) nounwind uwtable {587; CHECK-LABEL: @atomic8_xor_acq_rel(588; CHECK-NEXT: entry:589; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]590; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]591; CHECK: atomicrmw.start:592; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]593; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] acq_rel acquire, align 1, !pcsections [[META0]]594; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]595; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]596; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]597; CHECK: atomicrmw.end:598; CHECK-NEXT: ret void599;600entry:601 atomicrmw xor ptr %a, i8 0 acq_rel, !pcsections !0602 ret void603}604 605define void @atomic8_nand_acq_rel(ptr %a) nounwind uwtable {606; CHECK-LABEL: @atomic8_nand_acq_rel(607; CHECK-NEXT: entry:608; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]609; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]610; CHECK: atomicrmw.start:611; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]612; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 -1 acq_rel acquire, align 1, !pcsections [[META0]]613; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]614; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]615; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]616; CHECK: atomicrmw.end:617; CHECK-NEXT: ret void618;619entry:620 atomicrmw nand ptr %a, i8 0 acq_rel, !pcsections !0621 ret void622}623 624define void @atomic8_xchg_seq_cst(ptr %a) nounwind uwtable {625; CHECK-LABEL: @atomic8_xchg_seq_cst(626; CHECK-NEXT: entry:627; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]628; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]629; CHECK: atomicrmw.start:630; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]631; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 seq_cst seq_cst, align 1, !pcsections [[META0]]632; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]633; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]634; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]635; CHECK: atomicrmw.end:636; CHECK-NEXT: ret void637;638entry:639 atomicrmw xchg ptr %a, i8 0 seq_cst, !pcsections !0640 ret void641}642 643define void @atomic8_add_seq_cst(ptr %a) nounwind uwtable {644; CHECK-LABEL: @atomic8_add_seq_cst(645; CHECK-NEXT: entry:646; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]647; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]648; CHECK: atomicrmw.start:649; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]650; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] seq_cst seq_cst, align 1, !pcsections [[META0]]651; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]652; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]653; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]654; CHECK: atomicrmw.end:655; CHECK-NEXT: ret void656;657entry:658 atomicrmw add ptr %a, i8 0 seq_cst, !pcsections !0659 ret void660}661 662define void @atomic8_sub_seq_cst(ptr %a) nounwind uwtable {663; CHECK-LABEL: @atomic8_sub_seq_cst(664; CHECK-NEXT: entry:665; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]666; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]667; CHECK: atomicrmw.start:668; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]669; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] seq_cst seq_cst, align 1, !pcsections [[META0]]670; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]671; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]672; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]673; CHECK: atomicrmw.end:674; CHECK-NEXT: ret void675;676entry:677 atomicrmw sub ptr %a, i8 0 seq_cst, !pcsections !0678 ret void679}680 681define void @atomic8_and_seq_cst(ptr %a) nounwind uwtable {682; CHECK-LABEL: @atomic8_and_seq_cst(683; CHECK-NEXT: entry:684; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]685; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]686; CHECK: atomicrmw.start:687; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]688; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 0 seq_cst seq_cst, align 1, !pcsections [[META0]]689; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]690; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]691; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]692; CHECK: atomicrmw.end:693; CHECK-NEXT: ret void694;695entry:696 atomicrmw and ptr %a, i8 0 seq_cst, !pcsections !0697 ret void698}699 700define void @atomic8_or_seq_cst(ptr %a) nounwind uwtable {701; CHECK-LABEL: @atomic8_or_seq_cst(702; CHECK-NEXT: entry:703; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]704; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]705; CHECK: atomicrmw.start:706; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]707; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] seq_cst seq_cst, align 1, !pcsections [[META0]]708; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]709; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]710; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]711; CHECK: atomicrmw.end:712; CHECK-NEXT: ret void713;714entry:715 atomicrmw or ptr %a, i8 0 seq_cst, !pcsections !0716 ret void717}718 719define void @atomic8_xor_seq_cst(ptr %a) nounwind uwtable {720; CHECK-LABEL: @atomic8_xor_seq_cst(721; CHECK-NEXT: entry:722; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]723; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]724; CHECK: atomicrmw.start:725; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]726; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 [[LOADED]] seq_cst seq_cst, align 1, !pcsections [[META0]]727; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]728; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]729; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]730; CHECK: atomicrmw.end:731; CHECK-NEXT: ret void732;733entry:734 atomicrmw xor ptr %a, i8 0 seq_cst, !pcsections !0735 ret void736}737 738define void @atomic8_nand_seq_cst(ptr %a) nounwind uwtable {739; CHECK-LABEL: @atomic8_nand_seq_cst(740; CHECK-NEXT: entry:741; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[A:%.*]], align 1, !pcsections [[META0]]742; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]743; CHECK: atomicrmw.start:744; CHECK-NEXT: [[LOADED:%.*]] = phi i8 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]745; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 [[LOADED]], i8 -1 seq_cst seq_cst, align 1, !pcsections [[META0]]746; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1, !pcsections [[META0]]747; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i8, i1 } [[TMP1]], 0, !pcsections [[META0]]748; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]749; CHECK: atomicrmw.end:750; CHECK-NEXT: ret void751;752entry:753 atomicrmw nand ptr %a, i8 0 seq_cst, !pcsections !0754 ret void755}756 757define void @atomic8_cas_monotonic(ptr %a) nounwind uwtable {758; CHECK-LABEL: @atomic8_cas_monotonic(759; CHECK-NEXT: entry:760; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i8 0, i8 1 monotonic monotonic, align 1, !pcsections [[META0]]761; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 monotonic acquire, align 1, !pcsections [[META0]]762; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 monotonic seq_cst, align 1, !pcsections [[META0]]763; CHECK-NEXT: ret void764;765entry:766 cmpxchg ptr %a, i8 0, i8 1 monotonic monotonic, !pcsections !0767 cmpxchg ptr %a, i8 0, i8 1 monotonic acquire, !pcsections !0768 cmpxchg ptr %a, i8 0, i8 1 monotonic seq_cst, !pcsections !0769 ret void770}771 772define void @atomic8_cas_acquire(ptr %a) nounwind uwtable {773; CHECK-LABEL: @atomic8_cas_acquire(774; CHECK-NEXT: entry:775; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i8 0, i8 1 acquire monotonic, align 1, !pcsections [[META0]]776; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 acquire acquire, align 1, !pcsections [[META0]]777; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 acquire seq_cst, align 1, !pcsections [[META0]]778; CHECK-NEXT: ret void779;780entry:781 cmpxchg ptr %a, i8 0, i8 1 acquire monotonic, !pcsections !0782 cmpxchg ptr %a, i8 0, i8 1 acquire acquire, !pcsections !0783 cmpxchg ptr %a, i8 0, i8 1 acquire seq_cst, !pcsections !0784 ret void785}786 787define void @atomic8_cas_release(ptr %a) nounwind uwtable {788; CHECK-LABEL: @atomic8_cas_release(789; CHECK-NEXT: entry:790; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i8 0, i8 1 release monotonic, align 1, !pcsections [[META0]]791; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 release acquire, align 1, !pcsections [[META0]]792; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 release seq_cst, align 1, !pcsections [[META0]]793; CHECK-NEXT: ret void794;795entry:796 cmpxchg ptr %a, i8 0, i8 1 release monotonic, !pcsections !0797 cmpxchg ptr %a, i8 0, i8 1 release acquire, !pcsections !0798 cmpxchg ptr %a, i8 0, i8 1 release seq_cst, !pcsections !0799 ret void800}801 802define void @atomic8_cas_acq_rel(ptr %a) nounwind uwtable {803; CHECK-LABEL: @atomic8_cas_acq_rel(804; CHECK-NEXT: entry:805; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i8 0, i8 1 acq_rel monotonic, align 1, !pcsections [[META0]]806; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 acq_rel acquire, align 1, !pcsections [[META0]]807; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 acq_rel seq_cst, align 1, !pcsections [[META0]]808; CHECK-NEXT: ret void809;810entry:811 cmpxchg ptr %a, i8 0, i8 1 acq_rel monotonic, !pcsections !0812 cmpxchg ptr %a, i8 0, i8 1 acq_rel acquire, !pcsections !0813 cmpxchg ptr %a, i8 0, i8 1 acq_rel seq_cst, !pcsections !0814 ret void815}816 817define void @atomic8_cas_seq_cst(ptr %a) nounwind uwtable {818; CHECK-LABEL: @atomic8_cas_seq_cst(819; CHECK-NEXT: entry:820; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i8 0, i8 1 seq_cst monotonic, align 1, !pcsections [[META0]]821; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 seq_cst acquire, align 1, !pcsections [[META0]]822; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i8 0, i8 1 seq_cst seq_cst, align 1, !pcsections [[META0]]823; CHECK-NEXT: ret void824;825entry:826 cmpxchg ptr %a, i8 0, i8 1 seq_cst monotonic, !pcsections !0827 cmpxchg ptr %a, i8 0, i8 1 seq_cst acquire, !pcsections !0828 cmpxchg ptr %a, i8 0, i8 1 seq_cst seq_cst, !pcsections !0829 ret void830}831 832define i16 @atomic16_load_unordered(ptr %a) nounwind uwtable {833; CHECK-LABEL: @atomic16_load_unordered(834; CHECK-NEXT: entry:835; CHECK-NEXT: [[TMP0:%.*]] = load atomic i16, ptr [[A:%.*]] unordered, align 2, !pcsections [[META0]]836; CHECK-NEXT: ret i16 [[TMP0]]837;838entry:839 %0 = load atomic i16, ptr %a unordered, align 2, !pcsections !0840 ret i16 %0841}842 843define i16 @atomic16_load_monotonic(ptr %a) nounwind uwtable {844; CHECK-LABEL: @atomic16_load_monotonic(845; CHECK-NEXT: entry:846; CHECK-NEXT: [[TMP0:%.*]] = load atomic i16, ptr [[A:%.*]] monotonic, align 2, !pcsections [[META0]]847; CHECK-NEXT: ret i16 [[TMP0]]848;849entry:850 %0 = load atomic i16, ptr %a monotonic, align 2, !pcsections !0851 ret i16 %0852}853 854define i16 @atomic16_load_acquire(ptr %a) nounwind uwtable {855; CHECK-LABEL: @atomic16_load_acquire(856; CHECK-NEXT: entry:857; CHECK-NEXT: [[TMP0:%.*]] = load atomic i16, ptr [[A:%.*]] acquire, align 2, !pcsections [[META0]]858; CHECK-NEXT: ret i16 [[TMP0]]859;860entry:861 %0 = load atomic i16, ptr %a acquire, align 2, !pcsections !0862 ret i16 %0863}864 865define i16 @atomic16_load_seq_cst(ptr %a) nounwind uwtable {866; CHECK-LABEL: @atomic16_load_seq_cst(867; CHECK-NEXT: entry:868; CHECK-NEXT: [[TMP0:%.*]] = load atomic i16, ptr [[A:%.*]] seq_cst, align 2, !pcsections [[META0]]869; CHECK-NEXT: ret i16 [[TMP0]]870;871entry:872 %0 = load atomic i16, ptr %a seq_cst, align 2, !pcsections !0873 ret i16 %0874}875 876define void @atomic16_store_unordered(ptr %a) nounwind uwtable {877; CHECK-LABEL: @atomic16_store_unordered(878; CHECK-NEXT: entry:879; CHECK-NEXT: store atomic i16 0, ptr [[A:%.*]] unordered, align 2, !pcsections [[META0]]880; CHECK-NEXT: ret void881;882entry:883 store atomic i16 0, ptr %a unordered, align 2, !pcsections !0884 ret void885}886 887define void @atomic16_store_monotonic(ptr %a) nounwind uwtable {888; CHECK-LABEL: @atomic16_store_monotonic(889; CHECK-NEXT: entry:890; CHECK-NEXT: store atomic i16 0, ptr [[A:%.*]] monotonic, align 2, !pcsections [[META0]]891; CHECK-NEXT: ret void892;893entry:894 store atomic i16 0, ptr %a monotonic, align 2, !pcsections !0895 ret void896}897 898define void @atomic16_store_release(ptr %a) nounwind uwtable {899; CHECK-LABEL: @atomic16_store_release(900; CHECK-NEXT: entry:901; CHECK-NEXT: store atomic i16 0, ptr [[A:%.*]] release, align 2, !pcsections [[META0]]902; CHECK-NEXT: ret void903;904entry:905 store atomic i16 0, ptr %a release, align 2, !pcsections !0906 ret void907}908 909define void @atomic16_store_seq_cst(ptr %a) nounwind uwtable {910; CHECK-LABEL: @atomic16_store_seq_cst(911; CHECK-NEXT: entry:912; CHECK-NEXT: store atomic i16 0, ptr [[A:%.*]] seq_cst, align 2, !pcsections [[META0]]913; CHECK-NEXT: ret void914;915entry:916 store atomic i16 0, ptr %a seq_cst, align 2, !pcsections !0917 ret void918}919 920define void @atomic16_xchg_monotonic(ptr %a) nounwind uwtable {921; CHECK-LABEL: @atomic16_xchg_monotonic(922; CHECK-NEXT: entry:923; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]924; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]925; CHECK: atomicrmw.start:926; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]927; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 monotonic monotonic, align 2, !pcsections [[META0]]928; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]929; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]930; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]931; CHECK: atomicrmw.end:932; CHECK-NEXT: ret void933;934entry:935 atomicrmw xchg ptr %a, i16 0 monotonic, !pcsections !0936 ret void937}938 939define void @atomic16_add_monotonic(ptr %a) nounwind uwtable {940; CHECK-LABEL: @atomic16_add_monotonic(941; CHECK-NEXT: entry:942; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]943; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]944; CHECK: atomicrmw.start:945; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]946; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] monotonic monotonic, align 2, !pcsections [[META0]]947; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]948; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]949; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]950; CHECK: atomicrmw.end:951; CHECK-NEXT: ret void952;953entry:954 atomicrmw add ptr %a, i16 0 monotonic, !pcsections !0955 ret void956}957 958define void @atomic16_sub_monotonic(ptr %a) nounwind uwtable {959; CHECK-LABEL: @atomic16_sub_monotonic(960; CHECK-NEXT: entry:961; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]962; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]963; CHECK: atomicrmw.start:964; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]965; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] monotonic monotonic, align 2, !pcsections [[META0]]966; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]967; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]968; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]969; CHECK: atomicrmw.end:970; CHECK-NEXT: ret void971;972entry:973 atomicrmw sub ptr %a, i16 0 monotonic, !pcsections !0974 ret void975}976 977define void @atomic16_and_monotonic(ptr %a) nounwind uwtable {978; CHECK-LABEL: @atomic16_and_monotonic(979; CHECK-NEXT: entry:980; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]981; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]982; CHECK: atomicrmw.start:983; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]984; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 monotonic monotonic, align 2, !pcsections [[META0]]985; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]986; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]987; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]988; CHECK: atomicrmw.end:989; CHECK-NEXT: ret void990;991entry:992 atomicrmw and ptr %a, i16 0 monotonic, !pcsections !0993 ret void994}995 996define void @atomic16_or_monotonic(ptr %a) nounwind uwtable {997; CHECK-LABEL: @atomic16_or_monotonic(998; CHECK-NEXT: entry:999; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1000; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1001; CHECK: atomicrmw.start:1002; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1003; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] monotonic monotonic, align 2, !pcsections [[META0]]1004; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1005; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1006; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1007; CHECK: atomicrmw.end:1008; CHECK-NEXT: ret void1009;1010entry:1011 atomicrmw or ptr %a, i16 0 monotonic, !pcsections !01012 ret void1013}1014 1015define void @atomic16_xor_monotonic(ptr %a) nounwind uwtable {1016; CHECK-LABEL: @atomic16_xor_monotonic(1017; CHECK-NEXT: entry:1018; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1019; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1020; CHECK: atomicrmw.start:1021; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1022; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] monotonic monotonic, align 2, !pcsections [[META0]]1023; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1024; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1025; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1026; CHECK: atomicrmw.end:1027; CHECK-NEXT: ret void1028;1029entry:1030 atomicrmw xor ptr %a, i16 0 monotonic, !pcsections !01031 ret void1032}1033 1034define void @atomic16_nand_monotonic(ptr %a) nounwind uwtable {1035; CHECK-LABEL: @atomic16_nand_monotonic(1036; CHECK-NEXT: entry:1037; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1038; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1039; CHECK: atomicrmw.start:1040; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1041; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 -1 monotonic monotonic, align 2, !pcsections [[META0]]1042; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1043; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1044; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1045; CHECK: atomicrmw.end:1046; CHECK-NEXT: ret void1047;1048entry:1049 atomicrmw nand ptr %a, i16 0 monotonic, !pcsections !01050 ret void1051}1052 1053define void @atomic16_xchg_acquire(ptr %a) nounwind uwtable {1054; CHECK-LABEL: @atomic16_xchg_acquire(1055; CHECK-NEXT: entry:1056; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1057; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1058; CHECK: atomicrmw.start:1059; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1060; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 acquire acquire, align 2, !pcsections [[META0]]1061; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1062; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1063; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1064; CHECK: atomicrmw.end:1065; CHECK-NEXT: ret void1066;1067entry:1068 atomicrmw xchg ptr %a, i16 0 acquire, !pcsections !01069 ret void1070}1071 1072define void @atomic16_add_acquire(ptr %a) nounwind uwtable {1073; CHECK-LABEL: @atomic16_add_acquire(1074; CHECK-NEXT: entry:1075; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1076; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1077; CHECK: atomicrmw.start:1078; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1079; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acquire acquire, align 2, !pcsections [[META0]]1080; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1081; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1082; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1083; CHECK: atomicrmw.end:1084; CHECK-NEXT: ret void1085;1086entry:1087 atomicrmw add ptr %a, i16 0 acquire, !pcsections !01088 ret void1089}1090 1091define void @atomic16_sub_acquire(ptr %a) nounwind uwtable {1092; CHECK-LABEL: @atomic16_sub_acquire(1093; CHECK-NEXT: entry:1094; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1095; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1096; CHECK: atomicrmw.start:1097; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1098; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acquire acquire, align 2, !pcsections [[META0]]1099; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1100; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1101; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1102; CHECK: atomicrmw.end:1103; CHECK-NEXT: ret void1104;1105entry:1106 atomicrmw sub ptr %a, i16 0 acquire, !pcsections !01107 ret void1108}1109 1110define void @atomic16_and_acquire(ptr %a) nounwind uwtable {1111; CHECK-LABEL: @atomic16_and_acquire(1112; CHECK-NEXT: entry:1113; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1114; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1115; CHECK: atomicrmw.start:1116; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1117; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 acquire acquire, align 2, !pcsections [[META0]]1118; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1119; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1120; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1121; CHECK: atomicrmw.end:1122; CHECK-NEXT: ret void1123;1124entry:1125 atomicrmw and ptr %a, i16 0 acquire, !pcsections !01126 ret void1127}1128 1129define void @atomic16_or_acquire(ptr %a) nounwind uwtable {1130; CHECK-LABEL: @atomic16_or_acquire(1131; CHECK-NEXT: entry:1132; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1133; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1134; CHECK: atomicrmw.start:1135; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1136; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acquire acquire, align 2, !pcsections [[META0]]1137; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1138; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1139; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1140; CHECK: atomicrmw.end:1141; CHECK-NEXT: ret void1142;1143entry:1144 atomicrmw or ptr %a, i16 0 acquire, !pcsections !01145 ret void1146}1147 1148define void @atomic16_xor_acquire(ptr %a) nounwind uwtable {1149; CHECK-LABEL: @atomic16_xor_acquire(1150; CHECK-NEXT: entry:1151; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1152; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1153; CHECK: atomicrmw.start:1154; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1155; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acquire acquire, align 2, !pcsections [[META0]]1156; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1157; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1158; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1159; CHECK: atomicrmw.end:1160; CHECK-NEXT: ret void1161;1162entry:1163 atomicrmw xor ptr %a, i16 0 acquire, !pcsections !01164 ret void1165}1166 1167define void @atomic16_nand_acquire(ptr %a) nounwind uwtable {1168; CHECK-LABEL: @atomic16_nand_acquire(1169; CHECK-NEXT: entry:1170; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1171; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1172; CHECK: atomicrmw.start:1173; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1174; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 -1 acquire acquire, align 2, !pcsections [[META0]]1175; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1176; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1177; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1178; CHECK: atomicrmw.end:1179; CHECK-NEXT: ret void1180;1181entry:1182 atomicrmw nand ptr %a, i16 0 acquire, !pcsections !01183 ret void1184}1185 1186define void @atomic16_xchg_release(ptr %a) nounwind uwtable {1187; CHECK-LABEL: @atomic16_xchg_release(1188; CHECK-NEXT: entry:1189; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1190; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1191; CHECK: atomicrmw.start:1192; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1193; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 release monotonic, align 2, !pcsections [[META0]]1194; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1195; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1196; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1197; CHECK: atomicrmw.end:1198; CHECK-NEXT: ret void1199;1200entry:1201 atomicrmw xchg ptr %a, i16 0 release, !pcsections !01202 ret void1203}1204 1205define void @atomic16_add_release(ptr %a) nounwind uwtable {1206; CHECK-LABEL: @atomic16_add_release(1207; CHECK-NEXT: entry:1208; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1209; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1210; CHECK: atomicrmw.start:1211; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1212; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] release monotonic, align 2, !pcsections [[META0]]1213; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1214; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1215; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1216; CHECK: atomicrmw.end:1217; CHECK-NEXT: ret void1218;1219entry:1220 atomicrmw add ptr %a, i16 0 release, !pcsections !01221 ret void1222}1223 1224define void @atomic16_sub_release(ptr %a) nounwind uwtable {1225; CHECK-LABEL: @atomic16_sub_release(1226; CHECK-NEXT: entry:1227; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1228; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1229; CHECK: atomicrmw.start:1230; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1231; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] release monotonic, align 2, !pcsections [[META0]]1232; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1233; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1234; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1235; CHECK: atomicrmw.end:1236; CHECK-NEXT: ret void1237;1238entry:1239 atomicrmw sub ptr %a, i16 0 release, !pcsections !01240 ret void1241}1242 1243define void @atomic16_and_release(ptr %a) nounwind uwtable {1244; CHECK-LABEL: @atomic16_and_release(1245; CHECK-NEXT: entry:1246; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1247; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1248; CHECK: atomicrmw.start:1249; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1250; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 release monotonic, align 2, !pcsections [[META0]]1251; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1252; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1253; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1254; CHECK: atomicrmw.end:1255; CHECK-NEXT: ret void1256;1257entry:1258 atomicrmw and ptr %a, i16 0 release, !pcsections !01259 ret void1260}1261 1262define void @atomic16_or_release(ptr %a) nounwind uwtable {1263; CHECK-LABEL: @atomic16_or_release(1264; CHECK-NEXT: entry:1265; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1266; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1267; CHECK: atomicrmw.start:1268; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1269; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] release monotonic, align 2, !pcsections [[META0]]1270; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1271; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1272; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1273; CHECK: atomicrmw.end:1274; CHECK-NEXT: ret void1275;1276entry:1277 atomicrmw or ptr %a, i16 0 release, !pcsections !01278 ret void1279}1280 1281define void @atomic16_xor_release(ptr %a) nounwind uwtable {1282; CHECK-LABEL: @atomic16_xor_release(1283; CHECK-NEXT: entry:1284; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1285; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1286; CHECK: atomicrmw.start:1287; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1288; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] release monotonic, align 2, !pcsections [[META0]]1289; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1290; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1291; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1292; CHECK: atomicrmw.end:1293; CHECK-NEXT: ret void1294;1295entry:1296 atomicrmw xor ptr %a, i16 0 release, !pcsections !01297 ret void1298}1299 1300define void @atomic16_nand_release(ptr %a) nounwind uwtable {1301; CHECK-LABEL: @atomic16_nand_release(1302; CHECK-NEXT: entry:1303; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1304; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1305; CHECK: atomicrmw.start:1306; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1307; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 -1 release monotonic, align 2, !pcsections [[META0]]1308; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1309; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1310; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1311; CHECK: atomicrmw.end:1312; CHECK-NEXT: ret void1313;1314entry:1315 atomicrmw nand ptr %a, i16 0 release, !pcsections !01316 ret void1317}1318 1319define void @atomic16_xchg_acq_rel(ptr %a) nounwind uwtable {1320; CHECK-LABEL: @atomic16_xchg_acq_rel(1321; CHECK-NEXT: entry:1322; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1323; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1324; CHECK: atomicrmw.start:1325; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1326; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 acq_rel acquire, align 2, !pcsections [[META0]]1327; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1328; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1329; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1330; CHECK: atomicrmw.end:1331; CHECK-NEXT: ret void1332;1333entry:1334 atomicrmw xchg ptr %a, i16 0 acq_rel, !pcsections !01335 ret void1336}1337 1338define void @atomic16_add_acq_rel(ptr %a) nounwind uwtable {1339; CHECK-LABEL: @atomic16_add_acq_rel(1340; CHECK-NEXT: entry:1341; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1342; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1343; CHECK: atomicrmw.start:1344; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1345; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acq_rel acquire, align 2, !pcsections [[META0]]1346; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1347; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1348; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1349; CHECK: atomicrmw.end:1350; CHECK-NEXT: ret void1351;1352entry:1353 atomicrmw add ptr %a, i16 0 acq_rel, !pcsections !01354 ret void1355}1356 1357define void @atomic16_sub_acq_rel(ptr %a) nounwind uwtable {1358; CHECK-LABEL: @atomic16_sub_acq_rel(1359; CHECK-NEXT: entry:1360; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1361; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1362; CHECK: atomicrmw.start:1363; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1364; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acq_rel acquire, align 2, !pcsections [[META0]]1365; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1366; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1367; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1368; CHECK: atomicrmw.end:1369; CHECK-NEXT: ret void1370;1371entry:1372 atomicrmw sub ptr %a, i16 0 acq_rel, !pcsections !01373 ret void1374}1375 1376define void @atomic16_and_acq_rel(ptr %a) nounwind uwtable {1377; CHECK-LABEL: @atomic16_and_acq_rel(1378; CHECK-NEXT: entry:1379; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1380; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1381; CHECK: atomicrmw.start:1382; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1383; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 acq_rel acquire, align 2, !pcsections [[META0]]1384; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1385; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1386; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1387; CHECK: atomicrmw.end:1388; CHECK-NEXT: ret void1389;1390entry:1391 atomicrmw and ptr %a, i16 0 acq_rel, !pcsections !01392 ret void1393}1394 1395define void @atomic16_or_acq_rel(ptr %a) nounwind uwtable {1396; CHECK-LABEL: @atomic16_or_acq_rel(1397; CHECK-NEXT: entry:1398; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1399; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1400; CHECK: atomicrmw.start:1401; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1402; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acq_rel acquire, align 2, !pcsections [[META0]]1403; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1404; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1405; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1406; CHECK: atomicrmw.end:1407; CHECK-NEXT: ret void1408;1409entry:1410 atomicrmw or ptr %a, i16 0 acq_rel, !pcsections !01411 ret void1412}1413 1414define void @atomic16_xor_acq_rel(ptr %a) nounwind uwtable {1415; CHECK-LABEL: @atomic16_xor_acq_rel(1416; CHECK-NEXT: entry:1417; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1418; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1419; CHECK: atomicrmw.start:1420; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1421; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] acq_rel acquire, align 2, !pcsections [[META0]]1422; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1423; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1424; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1425; CHECK: atomicrmw.end:1426; CHECK-NEXT: ret void1427;1428entry:1429 atomicrmw xor ptr %a, i16 0 acq_rel, !pcsections !01430 ret void1431}1432 1433define void @atomic16_nand_acq_rel(ptr %a) nounwind uwtable {1434; CHECK-LABEL: @atomic16_nand_acq_rel(1435; CHECK-NEXT: entry:1436; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1437; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1438; CHECK: atomicrmw.start:1439; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1440; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 -1 acq_rel acquire, align 2, !pcsections [[META0]]1441; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1442; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1443; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1444; CHECK: atomicrmw.end:1445; CHECK-NEXT: ret void1446;1447entry:1448 atomicrmw nand ptr %a, i16 0 acq_rel, !pcsections !01449 ret void1450}1451 1452define void @atomic16_xchg_seq_cst(ptr %a) nounwind uwtable {1453; CHECK-LABEL: @atomic16_xchg_seq_cst(1454; CHECK-NEXT: entry:1455; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1456; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1457; CHECK: atomicrmw.start:1458; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1459; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 seq_cst seq_cst, align 2, !pcsections [[META0]]1460; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1461; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1462; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1463; CHECK: atomicrmw.end:1464; CHECK-NEXT: ret void1465;1466entry:1467 atomicrmw xchg ptr %a, i16 0 seq_cst, !pcsections !01468 ret void1469}1470 1471define void @atomic16_add_seq_cst(ptr %a) nounwind uwtable {1472; CHECK-LABEL: @atomic16_add_seq_cst(1473; CHECK-NEXT: entry:1474; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1475; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1476; CHECK: atomicrmw.start:1477; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1478; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] seq_cst seq_cst, align 2, !pcsections [[META0]]1479; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1480; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1481; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1482; CHECK: atomicrmw.end:1483; CHECK-NEXT: ret void1484;1485entry:1486 atomicrmw add ptr %a, i16 0 seq_cst, !pcsections !01487 ret void1488}1489 1490define void @atomic16_sub_seq_cst(ptr %a) nounwind uwtable {1491; CHECK-LABEL: @atomic16_sub_seq_cst(1492; CHECK-NEXT: entry:1493; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1494; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1495; CHECK: atomicrmw.start:1496; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1497; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] seq_cst seq_cst, align 2, !pcsections [[META0]]1498; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1499; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1500; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1501; CHECK: atomicrmw.end:1502; CHECK-NEXT: ret void1503;1504entry:1505 atomicrmw sub ptr %a, i16 0 seq_cst, !pcsections !01506 ret void1507}1508 1509define void @atomic16_and_seq_cst(ptr %a) nounwind uwtable {1510; CHECK-LABEL: @atomic16_and_seq_cst(1511; CHECK-NEXT: entry:1512; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1513; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1514; CHECK: atomicrmw.start:1515; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1516; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 0 seq_cst seq_cst, align 2, !pcsections [[META0]]1517; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1518; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1519; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1520; CHECK: atomicrmw.end:1521; CHECK-NEXT: ret void1522;1523entry:1524 atomicrmw and ptr %a, i16 0 seq_cst, !pcsections !01525 ret void1526}1527 1528define void @atomic16_or_seq_cst(ptr %a) nounwind uwtable {1529; CHECK-LABEL: @atomic16_or_seq_cst(1530; CHECK-NEXT: entry:1531; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1532; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1533; CHECK: atomicrmw.start:1534; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1535; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] seq_cst seq_cst, align 2, !pcsections [[META0]]1536; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1537; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1538; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1539; CHECK: atomicrmw.end:1540; CHECK-NEXT: ret void1541;1542entry:1543 atomicrmw or ptr %a, i16 0 seq_cst, !pcsections !01544 ret void1545}1546 1547define void @atomic16_xor_seq_cst(ptr %a) nounwind uwtable {1548; CHECK-LABEL: @atomic16_xor_seq_cst(1549; CHECK-NEXT: entry:1550; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1551; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1552; CHECK: atomicrmw.start:1553; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1554; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 [[LOADED]] seq_cst seq_cst, align 2, !pcsections [[META0]]1555; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1556; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1557; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1558; CHECK: atomicrmw.end:1559; CHECK-NEXT: ret void1560;1561entry:1562 atomicrmw xor ptr %a, i16 0 seq_cst, !pcsections !01563 ret void1564}1565 1566define void @atomic16_nand_seq_cst(ptr %a) nounwind uwtable {1567; CHECK-LABEL: @atomic16_nand_seq_cst(1568; CHECK-NEXT: entry:1569; CHECK-NEXT: [[TMP0:%.*]] = load i16, ptr [[A:%.*]], align 2, !pcsections [[META0]]1570; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1571; CHECK: atomicrmw.start:1572; CHECK-NEXT: [[LOADED:%.*]] = phi i16 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1573; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 [[LOADED]], i16 -1 seq_cst seq_cst, align 2, !pcsections [[META0]]1574; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1, !pcsections [[META0]]1575; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i16, i1 } [[TMP1]], 0, !pcsections [[META0]]1576; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1577; CHECK: atomicrmw.end:1578; CHECK-NEXT: ret void1579;1580entry:1581 atomicrmw nand ptr %a, i16 0 seq_cst, !pcsections !01582 ret void1583}1584 1585define void @atomic16_cas_monotonic(ptr %a) nounwind uwtable {1586; CHECK-LABEL: @atomic16_cas_monotonic(1587; CHECK-NEXT: entry:1588; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i16 0, i16 1 monotonic monotonic, align 2, !pcsections [[META0]]1589; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 monotonic acquire, align 2, !pcsections [[META0]]1590; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 monotonic seq_cst, align 2, !pcsections [[META0]]1591; CHECK-NEXT: ret void1592;1593entry:1594 cmpxchg ptr %a, i16 0, i16 1 monotonic monotonic, !pcsections !01595 cmpxchg ptr %a, i16 0, i16 1 monotonic acquire, !pcsections !01596 cmpxchg ptr %a, i16 0, i16 1 monotonic seq_cst, !pcsections !01597 ret void1598}1599 1600define void @atomic16_cas_acquire(ptr %a) nounwind uwtable {1601; CHECK-LABEL: @atomic16_cas_acquire(1602; CHECK-NEXT: entry:1603; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i16 0, i16 1 acquire monotonic, align 2, !pcsections [[META0]]1604; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 acquire acquire, align 2, !pcsections [[META0]]1605; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 acquire seq_cst, align 2, !pcsections [[META0]]1606; CHECK-NEXT: ret void1607;1608entry:1609 cmpxchg ptr %a, i16 0, i16 1 acquire monotonic, !pcsections !01610 cmpxchg ptr %a, i16 0, i16 1 acquire acquire, !pcsections !01611 cmpxchg ptr %a, i16 0, i16 1 acquire seq_cst, !pcsections !01612 ret void1613}1614 1615define void @atomic16_cas_release(ptr %a) nounwind uwtable {1616; CHECK-LABEL: @atomic16_cas_release(1617; CHECK-NEXT: entry:1618; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i16 0, i16 1 release monotonic, align 2, !pcsections [[META0]]1619; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 release acquire, align 2, !pcsections [[META0]]1620; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 release seq_cst, align 2, !pcsections [[META0]]1621; CHECK-NEXT: ret void1622;1623entry:1624 cmpxchg ptr %a, i16 0, i16 1 release monotonic, !pcsections !01625 cmpxchg ptr %a, i16 0, i16 1 release acquire, !pcsections !01626 cmpxchg ptr %a, i16 0, i16 1 release seq_cst, !pcsections !01627 ret void1628}1629 1630define void @atomic16_cas_acq_rel(ptr %a) nounwind uwtable {1631; CHECK-LABEL: @atomic16_cas_acq_rel(1632; CHECK-NEXT: entry:1633; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i16 0, i16 1 acq_rel monotonic, align 2, !pcsections [[META0]]1634; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 acq_rel acquire, align 2, !pcsections [[META0]]1635; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 acq_rel seq_cst, align 2, !pcsections [[META0]]1636; CHECK-NEXT: ret void1637;1638entry:1639 cmpxchg ptr %a, i16 0, i16 1 acq_rel monotonic, !pcsections !01640 cmpxchg ptr %a, i16 0, i16 1 acq_rel acquire, !pcsections !01641 cmpxchg ptr %a, i16 0, i16 1 acq_rel seq_cst, !pcsections !01642 ret void1643}1644 1645define void @atomic16_cas_seq_cst(ptr %a) nounwind uwtable {1646; CHECK-LABEL: @atomic16_cas_seq_cst(1647; CHECK-NEXT: entry:1648; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i16 0, i16 1 seq_cst monotonic, align 2, !pcsections [[META0]]1649; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 seq_cst acquire, align 2, !pcsections [[META0]]1650; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i16 0, i16 1 seq_cst seq_cst, align 2, !pcsections [[META0]]1651; CHECK-NEXT: ret void1652;1653entry:1654 cmpxchg ptr %a, i16 0, i16 1 seq_cst monotonic, !pcsections !01655 cmpxchg ptr %a, i16 0, i16 1 seq_cst acquire, !pcsections !01656 cmpxchg ptr %a, i16 0, i16 1 seq_cst seq_cst, !pcsections !01657 ret void1658}1659 1660define i32 @atomic32_load_unordered(ptr %a) nounwind uwtable {1661; CHECK-LABEL: @atomic32_load_unordered(1662; CHECK-NEXT: entry:1663; CHECK-NEXT: [[TMP0:%.*]] = load atomic i32, ptr [[A:%.*]] unordered, align 4, !pcsections [[META0]]1664; CHECK-NEXT: ret i32 [[TMP0]]1665;1666entry:1667 %0 = load atomic i32, ptr %a unordered, align 4, !pcsections !01668 ret i32 %01669}1670 1671define i32 @atomic32_load_monotonic(ptr %a) nounwind uwtable {1672; CHECK-LABEL: @atomic32_load_monotonic(1673; CHECK-NEXT: entry:1674; CHECK-NEXT: [[TMP0:%.*]] = load atomic i32, ptr [[A:%.*]] monotonic, align 4, !pcsections [[META0]]1675; CHECK-NEXT: ret i32 [[TMP0]]1676;1677entry:1678 %0 = load atomic i32, ptr %a monotonic, align 4, !pcsections !01679 ret i32 %01680}1681 1682define i32 @atomic32_load_acquire(ptr %a) nounwind uwtable {1683; CHECK-LABEL: @atomic32_load_acquire(1684; CHECK-NEXT: entry:1685; CHECK-NEXT: [[TMP0:%.*]] = load atomic i32, ptr [[A:%.*]] acquire, align 4, !pcsections [[META0]]1686; CHECK-NEXT: ret i32 [[TMP0]]1687;1688entry:1689 %0 = load atomic i32, ptr %a acquire, align 4, !pcsections !01690 ret i32 %01691}1692 1693define i32 @atomic32_load_seq_cst(ptr %a) nounwind uwtable {1694; CHECK-LABEL: @atomic32_load_seq_cst(1695; CHECK-NEXT: entry:1696; CHECK-NEXT: [[TMP0:%.*]] = load atomic i32, ptr [[A:%.*]] seq_cst, align 4, !pcsections [[META0]]1697; CHECK-NEXT: ret i32 [[TMP0]]1698;1699entry:1700 %0 = load atomic i32, ptr %a seq_cst, align 4, !pcsections !01701 ret i32 %01702}1703 1704define void @atomic32_store_unordered(ptr %a) nounwind uwtable {1705; CHECK-LABEL: @atomic32_store_unordered(1706; CHECK-NEXT: entry:1707; CHECK-NEXT: store atomic i32 0, ptr [[A:%.*]] unordered, align 4, !pcsections [[META0]]1708; CHECK-NEXT: ret void1709;1710entry:1711 store atomic i32 0, ptr %a unordered, align 4, !pcsections !01712 ret void1713}1714 1715define void @atomic32_store_monotonic(ptr %a) nounwind uwtable {1716; CHECK-LABEL: @atomic32_store_monotonic(1717; CHECK-NEXT: entry:1718; CHECK-NEXT: store atomic i32 0, ptr [[A:%.*]] monotonic, align 4, !pcsections [[META0]]1719; CHECK-NEXT: ret void1720;1721entry:1722 store atomic i32 0, ptr %a monotonic, align 4, !pcsections !01723 ret void1724}1725 1726define void @atomic32_store_release(ptr %a) nounwind uwtable {1727; CHECK-LABEL: @atomic32_store_release(1728; CHECK-NEXT: entry:1729; CHECK-NEXT: store atomic i32 0, ptr [[A:%.*]] release, align 4, !pcsections [[META0]]1730; CHECK-NEXT: ret void1731;1732entry:1733 store atomic i32 0, ptr %a release, align 4, !pcsections !01734 ret void1735}1736 1737define void @atomic32_store_seq_cst(ptr %a) nounwind uwtable {1738; CHECK-LABEL: @atomic32_store_seq_cst(1739; CHECK-NEXT: entry:1740; CHECK-NEXT: store atomic i32 0, ptr [[A:%.*]] seq_cst, align 4, !pcsections [[META0]]1741; CHECK-NEXT: ret void1742;1743entry:1744 store atomic i32 0, ptr %a seq_cst, align 4, !pcsections !01745 ret void1746}1747 1748define void @atomic32_xchg_monotonic(ptr %a) nounwind uwtable {1749; CHECK-LABEL: @atomic32_xchg_monotonic(1750; CHECK-NEXT: entry:1751; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1752; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1753; CHECK: atomicrmw.start:1754; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1755; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 monotonic monotonic, align 4, !pcsections [[META0]]1756; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1757; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1758; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1759; CHECK: atomicrmw.end:1760; CHECK-NEXT: ret void1761;1762entry:1763 atomicrmw xchg ptr %a, i32 0 monotonic, !pcsections !01764 ret void1765}1766 1767define void @atomic32_add_monotonic(ptr %a) nounwind uwtable {1768; CHECK-LABEL: @atomic32_add_monotonic(1769; CHECK-NEXT: entry:1770; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1771; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1772; CHECK: atomicrmw.start:1773; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1774; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] monotonic monotonic, align 4, !pcsections [[META0]]1775; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1776; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1777; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1778; CHECK: atomicrmw.end:1779; CHECK-NEXT: ret void1780;1781entry:1782 atomicrmw add ptr %a, i32 0 monotonic, !pcsections !01783 ret void1784}1785 1786define void @atomic32_sub_monotonic(ptr %a) nounwind uwtable {1787; CHECK-LABEL: @atomic32_sub_monotonic(1788; CHECK-NEXT: entry:1789; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1790; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1791; CHECK: atomicrmw.start:1792; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1793; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] monotonic monotonic, align 4, !pcsections [[META0]]1794; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1795; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1796; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1797; CHECK: atomicrmw.end:1798; CHECK-NEXT: ret void1799;1800entry:1801 atomicrmw sub ptr %a, i32 0 monotonic, !pcsections !01802 ret void1803}1804 1805define void @atomic32_and_monotonic(ptr %a) nounwind uwtable {1806; CHECK-LABEL: @atomic32_and_monotonic(1807; CHECK-NEXT: entry:1808; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1809; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1810; CHECK: atomicrmw.start:1811; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1812; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 monotonic monotonic, align 4, !pcsections [[META0]]1813; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1814; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1815; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1816; CHECK: atomicrmw.end:1817; CHECK-NEXT: ret void1818;1819entry:1820 atomicrmw and ptr %a, i32 0 monotonic, !pcsections !01821 ret void1822}1823 1824define void @atomic32_or_monotonic(ptr %a) nounwind uwtable {1825; CHECK-LABEL: @atomic32_or_monotonic(1826; CHECK-NEXT: entry:1827; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1828; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1829; CHECK: atomicrmw.start:1830; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1831; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] monotonic monotonic, align 4, !pcsections [[META0]]1832; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1833; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1834; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1835; CHECK: atomicrmw.end:1836; CHECK-NEXT: ret void1837;1838entry:1839 atomicrmw or ptr %a, i32 0 monotonic, !pcsections !01840 ret void1841}1842 1843define void @atomic32_xor_monotonic(ptr %a) nounwind uwtable {1844; CHECK-LABEL: @atomic32_xor_monotonic(1845; CHECK-NEXT: entry:1846; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1847; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1848; CHECK: atomicrmw.start:1849; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1850; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] monotonic monotonic, align 4, !pcsections [[META0]]1851; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1852; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1853; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1854; CHECK: atomicrmw.end:1855; CHECK-NEXT: ret void1856;1857entry:1858 atomicrmw xor ptr %a, i32 0 monotonic, !pcsections !01859 ret void1860}1861 1862define void @atomic32_nand_monotonic(ptr %a) nounwind uwtable {1863; CHECK-LABEL: @atomic32_nand_monotonic(1864; CHECK-NEXT: entry:1865; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1866; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1867; CHECK: atomicrmw.start:1868; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1869; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 -1 monotonic monotonic, align 4, !pcsections [[META0]]1870; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1871; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1872; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1873; CHECK: atomicrmw.end:1874; CHECK-NEXT: ret void1875;1876entry:1877 atomicrmw nand ptr %a, i32 0 monotonic, !pcsections !01878 ret void1879}1880 1881define void @atomic32_xchg_acquire(ptr %a) nounwind uwtable {1882; CHECK-LABEL: @atomic32_xchg_acquire(1883; CHECK-NEXT: entry:1884; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1885; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1886; CHECK: atomicrmw.start:1887; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1888; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 acquire acquire, align 4, !pcsections [[META0]]1889; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1890; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1891; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1892; CHECK: atomicrmw.end:1893; CHECK-NEXT: ret void1894;1895entry:1896 atomicrmw xchg ptr %a, i32 0 acquire, !pcsections !01897 ret void1898}1899 1900define void @atomic32_add_acquire(ptr %a) nounwind uwtable {1901; CHECK-LABEL: @atomic32_add_acquire(1902; CHECK-NEXT: entry:1903; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1904; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1905; CHECK: atomicrmw.start:1906; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1907; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acquire acquire, align 4, !pcsections [[META0]]1908; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1909; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1910; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1911; CHECK: atomicrmw.end:1912; CHECK-NEXT: ret void1913;1914entry:1915 atomicrmw add ptr %a, i32 0 acquire, !pcsections !01916 ret void1917}1918 1919define void @atomic32_sub_acquire(ptr %a) nounwind uwtable {1920; CHECK-LABEL: @atomic32_sub_acquire(1921; CHECK-NEXT: entry:1922; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1923; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1924; CHECK: atomicrmw.start:1925; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1926; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acquire acquire, align 4, !pcsections [[META0]]1927; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1928; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1929; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1930; CHECK: atomicrmw.end:1931; CHECK-NEXT: ret void1932;1933entry:1934 atomicrmw sub ptr %a, i32 0 acquire, !pcsections !01935 ret void1936}1937 1938define void @atomic32_and_acquire(ptr %a) nounwind uwtable {1939; CHECK-LABEL: @atomic32_and_acquire(1940; CHECK-NEXT: entry:1941; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1942; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1943; CHECK: atomicrmw.start:1944; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1945; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 acquire acquire, align 4, !pcsections [[META0]]1946; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1947; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1948; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1949; CHECK: atomicrmw.end:1950; CHECK-NEXT: ret void1951;1952entry:1953 atomicrmw and ptr %a, i32 0 acquire, !pcsections !01954 ret void1955}1956 1957define void @atomic32_or_acquire(ptr %a) nounwind uwtable {1958; CHECK-LABEL: @atomic32_or_acquire(1959; CHECK-NEXT: entry:1960; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1961; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1962; CHECK: atomicrmw.start:1963; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1964; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acquire acquire, align 4, !pcsections [[META0]]1965; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1966; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1967; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1968; CHECK: atomicrmw.end:1969; CHECK-NEXT: ret void1970;1971entry:1972 atomicrmw or ptr %a, i32 0 acquire, !pcsections !01973 ret void1974}1975 1976define void @atomic32_xor_acquire(ptr %a) nounwind uwtable {1977; CHECK-LABEL: @atomic32_xor_acquire(1978; CHECK-NEXT: entry:1979; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1980; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]1981; CHECK: atomicrmw.start:1982; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]1983; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acquire acquire, align 4, !pcsections [[META0]]1984; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]1985; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]1986; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]1987; CHECK: atomicrmw.end:1988; CHECK-NEXT: ret void1989;1990entry:1991 atomicrmw xor ptr %a, i32 0 acquire, !pcsections !01992 ret void1993}1994 1995define void @atomic32_nand_acquire(ptr %a) nounwind uwtable {1996; CHECK-LABEL: @atomic32_nand_acquire(1997; CHECK-NEXT: entry:1998; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]1999; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2000; CHECK: atomicrmw.start:2001; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2002; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 -1 acquire acquire, align 4, !pcsections [[META0]]2003; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2004; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2005; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2006; CHECK: atomicrmw.end:2007; CHECK-NEXT: ret void2008;2009entry:2010 atomicrmw nand ptr %a, i32 0 acquire, !pcsections !02011 ret void2012}2013 2014define void @atomic32_xchg_release(ptr %a) nounwind uwtable {2015; CHECK-LABEL: @atomic32_xchg_release(2016; CHECK-NEXT: entry:2017; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2018; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2019; CHECK: atomicrmw.start:2020; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2021; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 release monotonic, align 4, !pcsections [[META0]]2022; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2023; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2024; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2025; CHECK: atomicrmw.end:2026; CHECK-NEXT: ret void2027;2028entry:2029 atomicrmw xchg ptr %a, i32 0 release, !pcsections !02030 ret void2031}2032 2033define void @atomic32_add_release(ptr %a) nounwind uwtable {2034; CHECK-LABEL: @atomic32_add_release(2035; CHECK-NEXT: entry:2036; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2037; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2038; CHECK: atomicrmw.start:2039; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2040; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] release monotonic, align 4, !pcsections [[META0]]2041; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2042; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2043; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2044; CHECK: atomicrmw.end:2045; CHECK-NEXT: ret void2046;2047entry:2048 atomicrmw add ptr %a, i32 0 release, !pcsections !02049 ret void2050}2051 2052define void @atomic32_sub_release(ptr %a) nounwind uwtable {2053; CHECK-LABEL: @atomic32_sub_release(2054; CHECK-NEXT: entry:2055; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2056; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2057; CHECK: atomicrmw.start:2058; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2059; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] release monotonic, align 4, !pcsections [[META0]]2060; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2061; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2062; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2063; CHECK: atomicrmw.end:2064; CHECK-NEXT: ret void2065;2066entry:2067 atomicrmw sub ptr %a, i32 0 release, !pcsections !02068 ret void2069}2070 2071define void @atomic32_and_release(ptr %a) nounwind uwtable {2072; CHECK-LABEL: @atomic32_and_release(2073; CHECK-NEXT: entry:2074; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2075; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2076; CHECK: atomicrmw.start:2077; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2078; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 release monotonic, align 4, !pcsections [[META0]]2079; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2080; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2081; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2082; CHECK: atomicrmw.end:2083; CHECK-NEXT: ret void2084;2085entry:2086 atomicrmw and ptr %a, i32 0 release, !pcsections !02087 ret void2088}2089 2090define void @atomic32_or_release(ptr %a) nounwind uwtable {2091; CHECK-LABEL: @atomic32_or_release(2092; CHECK-NEXT: entry:2093; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2094; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2095; CHECK: atomicrmw.start:2096; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2097; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] release monotonic, align 4, !pcsections [[META0]]2098; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2099; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2100; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2101; CHECK: atomicrmw.end:2102; CHECK-NEXT: ret void2103;2104entry:2105 atomicrmw or ptr %a, i32 0 release, !pcsections !02106 ret void2107}2108 2109define void @atomic32_xor_release(ptr %a) nounwind uwtable {2110; CHECK-LABEL: @atomic32_xor_release(2111; CHECK-NEXT: entry:2112; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2113; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2114; CHECK: atomicrmw.start:2115; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2116; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] release monotonic, align 4, !pcsections [[META0]]2117; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2118; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2119; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2120; CHECK: atomicrmw.end:2121; CHECK-NEXT: ret void2122;2123entry:2124 atomicrmw xor ptr %a, i32 0 release, !pcsections !02125 ret void2126}2127 2128define void @atomic32_nand_release(ptr %a) nounwind uwtable {2129; CHECK-LABEL: @atomic32_nand_release(2130; CHECK-NEXT: entry:2131; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2132; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2133; CHECK: atomicrmw.start:2134; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2135; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 -1 release monotonic, align 4, !pcsections [[META0]]2136; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2137; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2138; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2139; CHECK: atomicrmw.end:2140; CHECK-NEXT: ret void2141;2142entry:2143 atomicrmw nand ptr %a, i32 0 release, !pcsections !02144 ret void2145}2146 2147define void @atomic32_xchg_acq_rel(ptr %a) nounwind uwtable {2148; CHECK-LABEL: @atomic32_xchg_acq_rel(2149; CHECK-NEXT: entry:2150; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2151; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2152; CHECK: atomicrmw.start:2153; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2154; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 acq_rel acquire, align 4, !pcsections [[META0]]2155; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2156; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2157; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2158; CHECK: atomicrmw.end:2159; CHECK-NEXT: ret void2160;2161entry:2162 atomicrmw xchg ptr %a, i32 0 acq_rel, !pcsections !02163 ret void2164}2165 2166define void @atomic32_add_acq_rel(ptr %a) nounwind uwtable {2167; CHECK-LABEL: @atomic32_add_acq_rel(2168; CHECK-NEXT: entry:2169; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2170; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2171; CHECK: atomicrmw.start:2172; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2173; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acq_rel acquire, align 4, !pcsections [[META0]]2174; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2175; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2176; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2177; CHECK: atomicrmw.end:2178; CHECK-NEXT: ret void2179;2180entry:2181 atomicrmw add ptr %a, i32 0 acq_rel, !pcsections !02182 ret void2183}2184 2185define void @atomic32_sub_acq_rel(ptr %a) nounwind uwtable {2186; CHECK-LABEL: @atomic32_sub_acq_rel(2187; CHECK-NEXT: entry:2188; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2189; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2190; CHECK: atomicrmw.start:2191; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2192; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acq_rel acquire, align 4, !pcsections [[META0]]2193; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2194; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2195; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2196; CHECK: atomicrmw.end:2197; CHECK-NEXT: ret void2198;2199entry:2200 atomicrmw sub ptr %a, i32 0 acq_rel, !pcsections !02201 ret void2202}2203 2204define void @atomic32_and_acq_rel(ptr %a) nounwind uwtable {2205; CHECK-LABEL: @atomic32_and_acq_rel(2206; CHECK-NEXT: entry:2207; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2208; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2209; CHECK: atomicrmw.start:2210; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2211; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 acq_rel acquire, align 4, !pcsections [[META0]]2212; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2213; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2214; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2215; CHECK: atomicrmw.end:2216; CHECK-NEXT: ret void2217;2218entry:2219 atomicrmw and ptr %a, i32 0 acq_rel, !pcsections !02220 ret void2221}2222 2223define void @atomic32_or_acq_rel(ptr %a) nounwind uwtable {2224; CHECK-LABEL: @atomic32_or_acq_rel(2225; CHECK-NEXT: entry:2226; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2227; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2228; CHECK: atomicrmw.start:2229; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2230; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acq_rel acquire, align 4, !pcsections [[META0]]2231; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2232; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2233; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2234; CHECK: atomicrmw.end:2235; CHECK-NEXT: ret void2236;2237entry:2238 atomicrmw or ptr %a, i32 0 acq_rel, !pcsections !02239 ret void2240}2241 2242define void @atomic32_xor_acq_rel(ptr %a) nounwind uwtable {2243; CHECK-LABEL: @atomic32_xor_acq_rel(2244; CHECK-NEXT: entry:2245; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2246; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2247; CHECK: atomicrmw.start:2248; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2249; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] acq_rel acquire, align 4, !pcsections [[META0]]2250; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2251; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2252; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2253; CHECK: atomicrmw.end:2254; CHECK-NEXT: ret void2255;2256entry:2257 atomicrmw xor ptr %a, i32 0 acq_rel, !pcsections !02258 ret void2259}2260 2261define void @atomic32_nand_acq_rel(ptr %a) nounwind uwtable {2262; CHECK-LABEL: @atomic32_nand_acq_rel(2263; CHECK-NEXT: entry:2264; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2265; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2266; CHECK: atomicrmw.start:2267; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2268; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 -1 acq_rel acquire, align 4, !pcsections [[META0]]2269; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2270; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2271; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2272; CHECK: atomicrmw.end:2273; CHECK-NEXT: ret void2274;2275entry:2276 atomicrmw nand ptr %a, i32 0 acq_rel, !pcsections !02277 ret void2278}2279 2280define void @atomic32_xchg_seq_cst(ptr %a) nounwind uwtable {2281; CHECK-LABEL: @atomic32_xchg_seq_cst(2282; CHECK-NEXT: entry:2283; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2284; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2285; CHECK: atomicrmw.start:2286; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2287; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 seq_cst seq_cst, align 4, !pcsections [[META0]]2288; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2289; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2290; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2291; CHECK: atomicrmw.end:2292; CHECK-NEXT: ret void2293;2294entry:2295 atomicrmw xchg ptr %a, i32 0 seq_cst, !pcsections !02296 ret void2297}2298 2299define void @atomic32_add_seq_cst(ptr %a) nounwind uwtable {2300; CHECK-LABEL: @atomic32_add_seq_cst(2301; CHECK-NEXT: entry:2302; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2303; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2304; CHECK: atomicrmw.start:2305; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2306; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] seq_cst seq_cst, align 4, !pcsections [[META0]]2307; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2308; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2309; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2310; CHECK: atomicrmw.end:2311; CHECK-NEXT: ret void2312;2313entry:2314 atomicrmw add ptr %a, i32 0 seq_cst, !pcsections !02315 ret void2316}2317 2318define void @atomic32_sub_seq_cst(ptr %a) nounwind uwtable {2319; CHECK-LABEL: @atomic32_sub_seq_cst(2320; CHECK-NEXT: entry:2321; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2322; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2323; CHECK: atomicrmw.start:2324; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2325; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] seq_cst seq_cst, align 4, !pcsections [[META0]]2326; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2327; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2328; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2329; CHECK: atomicrmw.end:2330; CHECK-NEXT: ret void2331;2332entry:2333 atomicrmw sub ptr %a, i32 0 seq_cst, !pcsections !02334 ret void2335}2336 2337define void @atomic32_and_seq_cst(ptr %a) nounwind uwtable {2338; CHECK-LABEL: @atomic32_and_seq_cst(2339; CHECK-NEXT: entry:2340; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2341; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2342; CHECK: atomicrmw.start:2343; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2344; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 0 seq_cst seq_cst, align 4, !pcsections [[META0]]2345; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2346; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2347; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2348; CHECK: atomicrmw.end:2349; CHECK-NEXT: ret void2350;2351entry:2352 atomicrmw and ptr %a, i32 0 seq_cst, !pcsections !02353 ret void2354}2355 2356define void @atomic32_or_seq_cst(ptr %a) nounwind uwtable {2357; CHECK-LABEL: @atomic32_or_seq_cst(2358; CHECK-NEXT: entry:2359; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2360; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2361; CHECK: atomicrmw.start:2362; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2363; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] seq_cst seq_cst, align 4, !pcsections [[META0]]2364; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2365; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2366; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2367; CHECK: atomicrmw.end:2368; CHECK-NEXT: ret void2369;2370entry:2371 atomicrmw or ptr %a, i32 0 seq_cst, !pcsections !02372 ret void2373}2374 2375define void @atomic32_xor_seq_cst(ptr %a) nounwind uwtable {2376; CHECK-LABEL: @atomic32_xor_seq_cst(2377; CHECK-NEXT: entry:2378; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2379; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2380; CHECK: atomicrmw.start:2381; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2382; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 [[LOADED]] seq_cst seq_cst, align 4, !pcsections [[META0]]2383; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2384; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2385; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2386; CHECK: atomicrmw.end:2387; CHECK-NEXT: ret void2388;2389entry:2390 atomicrmw xor ptr %a, i32 0 seq_cst, !pcsections !02391 ret void2392}2393 2394define void @atomic32_nand_seq_cst(ptr %a) nounwind uwtable {2395; CHECK-LABEL: @atomic32_nand_seq_cst(2396; CHECK-NEXT: entry:2397; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A:%.*]], align 4, !pcsections [[META0]]2398; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2399; CHECK: atomicrmw.start:2400; CHECK-NEXT: [[LOADED:%.*]] = phi i32 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2401; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 [[LOADED]], i32 -1 seq_cst seq_cst, align 4, !pcsections [[META0]]2402; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1, !pcsections [[META0]]2403; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i32, i1 } [[TMP1]], 0, !pcsections [[META0]]2404; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2405; CHECK: atomicrmw.end:2406; CHECK-NEXT: ret void2407;2408entry:2409 atomicrmw nand ptr %a, i32 0 seq_cst, !pcsections !02410 ret void2411}2412 2413define void @atomic32_cas_monotonic(ptr %a) nounwind uwtable {2414; CHECK-LABEL: @atomic32_cas_monotonic(2415; CHECK-NEXT: entry:2416; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i32 0, i32 1 monotonic monotonic, align 4, !pcsections [[META0]]2417; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 monotonic acquire, align 4, !pcsections [[META0]]2418; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 monotonic seq_cst, align 4, !pcsections [[META0]]2419; CHECK-NEXT: ret void2420;2421entry:2422 cmpxchg ptr %a, i32 0, i32 1 monotonic monotonic, !pcsections !02423 cmpxchg ptr %a, i32 0, i32 1 monotonic acquire, !pcsections !02424 cmpxchg ptr %a, i32 0, i32 1 monotonic seq_cst, !pcsections !02425 ret void2426}2427 2428define void @atomic32_cas_acquire(ptr %a) nounwind uwtable {2429; CHECK-LABEL: @atomic32_cas_acquire(2430; CHECK-NEXT: entry:2431; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i32 0, i32 1 acquire monotonic, align 4, !pcsections [[META0]]2432; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 acquire acquire, align 4, !pcsections [[META0]]2433; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 acquire seq_cst, align 4, !pcsections [[META0]]2434; CHECK-NEXT: ret void2435;2436entry:2437 cmpxchg ptr %a, i32 0, i32 1 acquire monotonic, !pcsections !02438 cmpxchg ptr %a, i32 0, i32 1 acquire acquire, !pcsections !02439 cmpxchg ptr %a, i32 0, i32 1 acquire seq_cst, !pcsections !02440 ret void2441}2442 2443define void @atomic32_cas_release(ptr %a) nounwind uwtable {2444; CHECK-LABEL: @atomic32_cas_release(2445; CHECK-NEXT: entry:2446; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i32 0, i32 1 release monotonic, align 4, !pcsections [[META0]]2447; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 release acquire, align 4, !pcsections [[META0]]2448; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 release seq_cst, align 4, !pcsections [[META0]]2449; CHECK-NEXT: ret void2450;2451entry:2452 cmpxchg ptr %a, i32 0, i32 1 release monotonic, !pcsections !02453 cmpxchg ptr %a, i32 0, i32 1 release acquire, !pcsections !02454 cmpxchg ptr %a, i32 0, i32 1 release seq_cst, !pcsections !02455 ret void2456}2457 2458define void @atomic32_cas_acq_rel(ptr %a) nounwind uwtable {2459; CHECK-LABEL: @atomic32_cas_acq_rel(2460; CHECK-NEXT: entry:2461; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i32 0, i32 1 acq_rel monotonic, align 4, !pcsections [[META0]]2462; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 acq_rel acquire, align 4, !pcsections [[META0]]2463; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 acq_rel seq_cst, align 4, !pcsections [[META0]]2464; CHECK-NEXT: ret void2465;2466entry:2467 cmpxchg ptr %a, i32 0, i32 1 acq_rel monotonic, !pcsections !02468 cmpxchg ptr %a, i32 0, i32 1 acq_rel acquire, !pcsections !02469 cmpxchg ptr %a, i32 0, i32 1 acq_rel seq_cst, !pcsections !02470 ret void2471}2472 2473define void @atomic32_cas_seq_cst(ptr %a) nounwind uwtable {2474; CHECK-LABEL: @atomic32_cas_seq_cst(2475; CHECK-NEXT: entry:2476; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i32 0, i32 1 seq_cst monotonic, align 4, !pcsections [[META0]]2477; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 seq_cst acquire, align 4, !pcsections [[META0]]2478; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i32 0, i32 1 seq_cst seq_cst, align 4, !pcsections [[META0]]2479; CHECK-NEXT: ret void2480;2481entry:2482 cmpxchg ptr %a, i32 0, i32 1 seq_cst monotonic, !pcsections !02483 cmpxchg ptr %a, i32 0, i32 1 seq_cst acquire, !pcsections !02484 cmpxchg ptr %a, i32 0, i32 1 seq_cst seq_cst, !pcsections !02485 ret void2486}2487 2488define i64 @atomic64_load_unordered(ptr %a) nounwind uwtable {2489; CHECK-LABEL: @atomic64_load_unordered(2490; CHECK-NEXT: entry:2491; CHECK-NEXT: [[TMP0:%.*]] = load atomic i64, ptr [[A:%.*]] unordered, align 8, !pcsections [[META0]]2492; CHECK-NEXT: ret i64 [[TMP0]]2493;2494entry:2495 %0 = load atomic i64, ptr %a unordered, align 8, !pcsections !02496 ret i64 %02497}2498 2499define i64 @atomic64_load_monotonic(ptr %a) nounwind uwtable {2500; CHECK-LABEL: @atomic64_load_monotonic(2501; CHECK-NEXT: entry:2502; CHECK-NEXT: [[TMP0:%.*]] = load atomic i64, ptr [[A:%.*]] monotonic, align 8, !pcsections [[META0]]2503; CHECK-NEXT: ret i64 [[TMP0]]2504;2505entry:2506 %0 = load atomic i64, ptr %a monotonic, align 8, !pcsections !02507 ret i64 %02508}2509 2510define i64 @atomic64_load_acquire(ptr %a) nounwind uwtable {2511; CHECK-LABEL: @atomic64_load_acquire(2512; CHECK-NEXT: entry:2513; CHECK-NEXT: [[TMP0:%.*]] = load atomic i64, ptr [[A:%.*]] acquire, align 8, !pcsections [[META0]]2514; CHECK-NEXT: ret i64 [[TMP0]]2515;2516entry:2517 %0 = load atomic i64, ptr %a acquire, align 8, !pcsections !02518 ret i64 %02519}2520 2521define i64 @atomic64_load_seq_cst(ptr %a) nounwind uwtable {2522; CHECK-LABEL: @atomic64_load_seq_cst(2523; CHECK-NEXT: entry:2524; CHECK-NEXT: [[TMP0:%.*]] = load atomic i64, ptr [[A:%.*]] seq_cst, align 8, !pcsections [[META0]]2525; CHECK-NEXT: ret i64 [[TMP0]]2526;2527entry:2528 %0 = load atomic i64, ptr %a seq_cst, align 8, !pcsections !02529 ret i64 %02530}2531 2532define ptr @atomic64_load_seq_cst_ptr_ty(ptr %a) nounwind uwtable {2533; CHECK-LABEL: @atomic64_load_seq_cst_ptr_ty(2534; CHECK-NEXT: entry:2535; CHECK-NEXT: [[TMP0:%.*]] = load atomic ptr, ptr [[A:%.*]] seq_cst, align 8, !pcsections [[META0]]2536; CHECK-NEXT: ret ptr [[TMP0]]2537;2538entry:2539 %0 = load atomic ptr, ptr %a seq_cst, align 8, !pcsections !02540 ret ptr %02541}2542 2543define void @atomic64_store_unordered(ptr %a) nounwind uwtable {2544; CHECK-LABEL: @atomic64_store_unordered(2545; CHECK-NEXT: entry:2546; CHECK-NEXT: store atomic i64 0, ptr [[A:%.*]] unordered, align 8, !pcsections [[META0]]2547; CHECK-NEXT: ret void2548;2549entry:2550 store atomic i64 0, ptr %a unordered, align 8, !pcsections !02551 ret void2552}2553 2554define void @atomic64_store_monotonic(ptr %a) nounwind uwtable {2555; CHECK-LABEL: @atomic64_store_monotonic(2556; CHECK-NEXT: entry:2557; CHECK-NEXT: store atomic i64 0, ptr [[A:%.*]] monotonic, align 8, !pcsections [[META0]]2558; CHECK-NEXT: ret void2559;2560entry:2561 store atomic i64 0, ptr %a monotonic, align 8, !pcsections !02562 ret void2563}2564 2565define void @atomic64_store_release(ptr %a) nounwind uwtable {2566; CHECK-LABEL: @atomic64_store_release(2567; CHECK-NEXT: entry:2568; CHECK-NEXT: store atomic i64 0, ptr [[A:%.*]] release, align 8, !pcsections [[META0]]2569; CHECK-NEXT: ret void2570;2571entry:2572 store atomic i64 0, ptr %a release, align 8, !pcsections !02573 ret void2574}2575 2576define void @atomic64_store_seq_cst(ptr %a) nounwind uwtable {2577; CHECK-LABEL: @atomic64_store_seq_cst(2578; CHECK-NEXT: entry:2579; CHECK-NEXT: store atomic i64 0, ptr [[A:%.*]] seq_cst, align 8, !pcsections [[META0]]2580; CHECK-NEXT: ret void2581;2582entry:2583 store atomic i64 0, ptr %a seq_cst, align 8, !pcsections !02584 ret void2585}2586 2587define void @atomic64_store_seq_cst_ptr_ty(ptr %a, ptr %v) nounwind uwtable {2588; CHECK-LABEL: @atomic64_store_seq_cst_ptr_ty(2589; CHECK-NEXT: entry:2590; CHECK-NEXT: store atomic ptr [[V:%.*]], ptr [[A:%.*]] seq_cst, align 8, !pcsections [[META0]]2591; CHECK-NEXT: ret void2592;2593entry:2594 store atomic ptr %v, ptr %a seq_cst, align 8, !pcsections !02595 ret void2596}2597 2598define void @atomic64_xchg_monotonic(ptr %a) nounwind uwtable {2599; CHECK-LABEL: @atomic64_xchg_monotonic(2600; CHECK-NEXT: entry:2601; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2602; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2603; CHECK: atomicrmw.start:2604; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2605; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 monotonic monotonic, align 8, !pcsections [[META0]]2606; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2607; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2608; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2609; CHECK: atomicrmw.end:2610; CHECK-NEXT: ret void2611;2612entry:2613 atomicrmw xchg ptr %a, i64 0 monotonic, !pcsections !02614 ret void2615}2616 2617define void @atomic64_add_monotonic(ptr %a) nounwind uwtable {2618; CHECK-LABEL: @atomic64_add_monotonic(2619; CHECK-NEXT: entry:2620; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2621; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2622; CHECK: atomicrmw.start:2623; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2624; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] monotonic monotonic, align 8, !pcsections [[META0]]2625; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2626; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2627; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2628; CHECK: atomicrmw.end:2629; CHECK-NEXT: ret void2630;2631entry:2632 atomicrmw add ptr %a, i64 0 monotonic, !pcsections !02633 ret void2634}2635 2636define void @atomic64_sub_monotonic(ptr %a) nounwind uwtable {2637; CHECK-LABEL: @atomic64_sub_monotonic(2638; CHECK-NEXT: entry:2639; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2640; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2641; CHECK: atomicrmw.start:2642; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2643; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] monotonic monotonic, align 8, !pcsections [[META0]]2644; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2645; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2646; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2647; CHECK: atomicrmw.end:2648; CHECK-NEXT: ret void2649;2650entry:2651 atomicrmw sub ptr %a, i64 0 monotonic, !pcsections !02652 ret void2653}2654 2655define void @atomic64_and_monotonic(ptr %a) nounwind uwtable {2656; CHECK-LABEL: @atomic64_and_monotonic(2657; CHECK-NEXT: entry:2658; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2659; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2660; CHECK: atomicrmw.start:2661; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2662; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 monotonic monotonic, align 8, !pcsections [[META0]]2663; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2664; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2665; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2666; CHECK: atomicrmw.end:2667; CHECK-NEXT: ret void2668;2669entry:2670 atomicrmw and ptr %a, i64 0 monotonic, !pcsections !02671 ret void2672}2673 2674define void @atomic64_or_monotonic(ptr %a) nounwind uwtable {2675; CHECK-LABEL: @atomic64_or_monotonic(2676; CHECK-NEXT: entry:2677; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2678; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2679; CHECK: atomicrmw.start:2680; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2681; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] monotonic monotonic, align 8, !pcsections [[META0]]2682; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2683; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2684; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2685; CHECK: atomicrmw.end:2686; CHECK-NEXT: ret void2687;2688entry:2689 atomicrmw or ptr %a, i64 0 monotonic, !pcsections !02690 ret void2691}2692 2693define void @atomic64_xor_monotonic(ptr %a) nounwind uwtable {2694; CHECK-LABEL: @atomic64_xor_monotonic(2695; CHECK-NEXT: entry:2696; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2697; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2698; CHECK: atomicrmw.start:2699; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2700; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] monotonic monotonic, align 8, !pcsections [[META0]]2701; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2702; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2703; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2704; CHECK: atomicrmw.end:2705; CHECK-NEXT: ret void2706;2707entry:2708 atomicrmw xor ptr %a, i64 0 monotonic, !pcsections !02709 ret void2710}2711 2712define void @atomic64_nand_monotonic(ptr %a) nounwind uwtable {2713; CHECK-LABEL: @atomic64_nand_monotonic(2714; CHECK-NEXT: entry:2715; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2716; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2717; CHECK: atomicrmw.start:2718; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2719; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 -1 monotonic monotonic, align 8, !pcsections [[META0]]2720; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2721; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2722; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2723; CHECK: atomicrmw.end:2724; CHECK-NEXT: ret void2725;2726entry:2727 atomicrmw nand ptr %a, i64 0 monotonic, !pcsections !02728 ret void2729}2730 2731define void @atomic64_xchg_acquire(ptr %a) nounwind uwtable {2732; CHECK-LABEL: @atomic64_xchg_acquire(2733; CHECK-NEXT: entry:2734; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2735; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2736; CHECK: atomicrmw.start:2737; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2738; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 acquire acquire, align 8, !pcsections [[META0]]2739; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2740; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2741; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2742; CHECK: atomicrmw.end:2743; CHECK-NEXT: ret void2744;2745entry:2746 atomicrmw xchg ptr %a, i64 0 acquire, !pcsections !02747 ret void2748}2749 2750define void @atomic64_add_acquire(ptr %a) nounwind uwtable {2751; CHECK-LABEL: @atomic64_add_acquire(2752; CHECK-NEXT: entry:2753; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2754; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2755; CHECK: atomicrmw.start:2756; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2757; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acquire acquire, align 8, !pcsections [[META0]]2758; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2759; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2760; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2761; CHECK: atomicrmw.end:2762; CHECK-NEXT: ret void2763;2764entry:2765 atomicrmw add ptr %a, i64 0 acquire, !pcsections !02766 ret void2767}2768 2769define void @atomic64_sub_acquire(ptr %a) nounwind uwtable {2770; CHECK-LABEL: @atomic64_sub_acquire(2771; CHECK-NEXT: entry:2772; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2773; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2774; CHECK: atomicrmw.start:2775; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2776; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acquire acquire, align 8, !pcsections [[META0]]2777; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2778; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2779; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2780; CHECK: atomicrmw.end:2781; CHECK-NEXT: ret void2782;2783entry:2784 atomicrmw sub ptr %a, i64 0 acquire, !pcsections !02785 ret void2786}2787 2788define void @atomic64_and_acquire(ptr %a) nounwind uwtable {2789; CHECK-LABEL: @atomic64_and_acquire(2790; CHECK-NEXT: entry:2791; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2792; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2793; CHECK: atomicrmw.start:2794; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2795; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 acquire acquire, align 8, !pcsections [[META0]]2796; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2797; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2798; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2799; CHECK: atomicrmw.end:2800; CHECK-NEXT: ret void2801;2802entry:2803 atomicrmw and ptr %a, i64 0 acquire, !pcsections !02804 ret void2805}2806 2807define void @atomic64_or_acquire(ptr %a) nounwind uwtable {2808; CHECK-LABEL: @atomic64_or_acquire(2809; CHECK-NEXT: entry:2810; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2811; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2812; CHECK: atomicrmw.start:2813; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2814; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acquire acquire, align 8, !pcsections [[META0]]2815; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2816; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2817; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2818; CHECK: atomicrmw.end:2819; CHECK-NEXT: ret void2820;2821entry:2822 atomicrmw or ptr %a, i64 0 acquire, !pcsections !02823 ret void2824}2825 2826define void @atomic64_xor_acquire(ptr %a) nounwind uwtable {2827; CHECK-LABEL: @atomic64_xor_acquire(2828; CHECK-NEXT: entry:2829; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2830; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2831; CHECK: atomicrmw.start:2832; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2833; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acquire acquire, align 8, !pcsections [[META0]]2834; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2835; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2836; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2837; CHECK: atomicrmw.end:2838; CHECK-NEXT: ret void2839;2840entry:2841 atomicrmw xor ptr %a, i64 0 acquire, !pcsections !02842 ret void2843}2844 2845define void @atomic64_nand_acquire(ptr %a) nounwind uwtable {2846; CHECK-LABEL: @atomic64_nand_acquire(2847; CHECK-NEXT: entry:2848; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2849; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2850; CHECK: atomicrmw.start:2851; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2852; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 -1 acquire acquire, align 8, !pcsections [[META0]]2853; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2854; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2855; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2856; CHECK: atomicrmw.end:2857; CHECK-NEXT: ret void2858;2859entry:2860 atomicrmw nand ptr %a, i64 0 acquire, !pcsections !02861 ret void2862}2863 2864define void @atomic64_xchg_release(ptr %a) nounwind uwtable {2865; CHECK-LABEL: @atomic64_xchg_release(2866; CHECK-NEXT: entry:2867; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2868; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2869; CHECK: atomicrmw.start:2870; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2871; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 release monotonic, align 8, !pcsections [[META0]]2872; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2873; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2874; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2875; CHECK: atomicrmw.end:2876; CHECK-NEXT: ret void2877;2878entry:2879 atomicrmw xchg ptr %a, i64 0 release, !pcsections !02880 ret void2881}2882 2883define void @atomic64_add_release(ptr %a) nounwind uwtable {2884; CHECK-LABEL: @atomic64_add_release(2885; CHECK-NEXT: entry:2886; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2887; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2888; CHECK: atomicrmw.start:2889; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2890; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] release monotonic, align 8, !pcsections [[META0]]2891; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2892; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2893; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2894; CHECK: atomicrmw.end:2895; CHECK-NEXT: ret void2896;2897entry:2898 atomicrmw add ptr %a, i64 0 release, !pcsections !02899 ret void2900}2901 2902define void @atomic64_sub_release(ptr %a) nounwind uwtable {2903; CHECK-LABEL: @atomic64_sub_release(2904; CHECK-NEXT: entry:2905; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2906; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2907; CHECK: atomicrmw.start:2908; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2909; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] release monotonic, align 8, !pcsections [[META0]]2910; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2911; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2912; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2913; CHECK: atomicrmw.end:2914; CHECK-NEXT: ret void2915;2916entry:2917 atomicrmw sub ptr %a, i64 0 release, !pcsections !02918 ret void2919}2920 2921define void @atomic64_and_release(ptr %a) nounwind uwtable {2922; CHECK-LABEL: @atomic64_and_release(2923; CHECK-NEXT: entry:2924; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2925; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2926; CHECK: atomicrmw.start:2927; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2928; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 release monotonic, align 8, !pcsections [[META0]]2929; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2930; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2931; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2932; CHECK: atomicrmw.end:2933; CHECK-NEXT: ret void2934;2935entry:2936 atomicrmw and ptr %a, i64 0 release, !pcsections !02937 ret void2938}2939 2940define void @atomic64_or_release(ptr %a) nounwind uwtable {2941; CHECK-LABEL: @atomic64_or_release(2942; CHECK-NEXT: entry:2943; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2944; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2945; CHECK: atomicrmw.start:2946; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2947; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] release monotonic, align 8, !pcsections [[META0]]2948; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2949; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2950; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2951; CHECK: atomicrmw.end:2952; CHECK-NEXT: ret void2953;2954entry:2955 atomicrmw or ptr %a, i64 0 release, !pcsections !02956 ret void2957}2958 2959define void @atomic64_xor_release(ptr %a) nounwind uwtable {2960; CHECK-LABEL: @atomic64_xor_release(2961; CHECK-NEXT: entry:2962; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2963; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2964; CHECK: atomicrmw.start:2965; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2966; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] release monotonic, align 8, !pcsections [[META0]]2967; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2968; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2969; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2970; CHECK: atomicrmw.end:2971; CHECK-NEXT: ret void2972;2973entry:2974 atomicrmw xor ptr %a, i64 0 release, !pcsections !02975 ret void2976}2977 2978define void @atomic64_nand_release(ptr %a) nounwind uwtable {2979; CHECK-LABEL: @atomic64_nand_release(2980; CHECK-NEXT: entry:2981; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]2982; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]2983; CHECK: atomicrmw.start:2984; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]2985; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 -1 release monotonic, align 8, !pcsections [[META0]]2986; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]2987; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]2988; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]2989; CHECK: atomicrmw.end:2990; CHECK-NEXT: ret void2991;2992entry:2993 atomicrmw nand ptr %a, i64 0 release, !pcsections !02994 ret void2995}2996 2997define void @atomic64_xchg_acq_rel(ptr %a) nounwind uwtable {2998; CHECK-LABEL: @atomic64_xchg_acq_rel(2999; CHECK-NEXT: entry:3000; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3001; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3002; CHECK: atomicrmw.start:3003; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3004; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 acq_rel acquire, align 8, !pcsections [[META0]]3005; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3006; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3007; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3008; CHECK: atomicrmw.end:3009; CHECK-NEXT: ret void3010;3011entry:3012 atomicrmw xchg ptr %a, i64 0 acq_rel, !pcsections !03013 ret void3014}3015 3016define void @atomic64_add_acq_rel(ptr %a) nounwind uwtable {3017; CHECK-LABEL: @atomic64_add_acq_rel(3018; CHECK-NEXT: entry:3019; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3020; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3021; CHECK: atomicrmw.start:3022; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3023; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acq_rel acquire, align 8, !pcsections [[META0]]3024; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3025; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3026; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3027; CHECK: atomicrmw.end:3028; CHECK-NEXT: ret void3029;3030entry:3031 atomicrmw add ptr %a, i64 0 acq_rel, !pcsections !03032 ret void3033}3034 3035define void @atomic64_sub_acq_rel(ptr %a) nounwind uwtable {3036; CHECK-LABEL: @atomic64_sub_acq_rel(3037; CHECK-NEXT: entry:3038; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3039; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3040; CHECK: atomicrmw.start:3041; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3042; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acq_rel acquire, align 8, !pcsections [[META0]]3043; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3044; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3045; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3046; CHECK: atomicrmw.end:3047; CHECK-NEXT: ret void3048;3049entry:3050 atomicrmw sub ptr %a, i64 0 acq_rel, !pcsections !03051 ret void3052}3053 3054define void @atomic64_and_acq_rel(ptr %a) nounwind uwtable {3055; CHECK-LABEL: @atomic64_and_acq_rel(3056; CHECK-NEXT: entry:3057; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3058; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3059; CHECK: atomicrmw.start:3060; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3061; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 acq_rel acquire, align 8, !pcsections [[META0]]3062; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3063; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3064; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3065; CHECK: atomicrmw.end:3066; CHECK-NEXT: ret void3067;3068entry:3069 atomicrmw and ptr %a, i64 0 acq_rel, !pcsections !03070 ret void3071}3072 3073define void @atomic64_or_acq_rel(ptr %a) nounwind uwtable {3074; CHECK-LABEL: @atomic64_or_acq_rel(3075; CHECK-NEXT: entry:3076; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3077; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3078; CHECK: atomicrmw.start:3079; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3080; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acq_rel acquire, align 8, !pcsections [[META0]]3081; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3082; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3083; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3084; CHECK: atomicrmw.end:3085; CHECK-NEXT: ret void3086;3087entry:3088 atomicrmw or ptr %a, i64 0 acq_rel, !pcsections !03089 ret void3090}3091 3092define void @atomic64_xor_acq_rel(ptr %a) nounwind uwtable {3093; CHECK-LABEL: @atomic64_xor_acq_rel(3094; CHECK-NEXT: entry:3095; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3096; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3097; CHECK: atomicrmw.start:3098; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3099; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] acq_rel acquire, align 8, !pcsections [[META0]]3100; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3101; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3102; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3103; CHECK: atomicrmw.end:3104; CHECK-NEXT: ret void3105;3106entry:3107 atomicrmw xor ptr %a, i64 0 acq_rel, !pcsections !03108 ret void3109}3110 3111define void @atomic64_nand_acq_rel(ptr %a) nounwind uwtable {3112; CHECK-LABEL: @atomic64_nand_acq_rel(3113; CHECK-NEXT: entry:3114; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3115; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3116; CHECK: atomicrmw.start:3117; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3118; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 -1 acq_rel acquire, align 8, !pcsections [[META0]]3119; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3120; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3121; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3122; CHECK: atomicrmw.end:3123; CHECK-NEXT: ret void3124;3125entry:3126 atomicrmw nand ptr %a, i64 0 acq_rel, !pcsections !03127 ret void3128}3129 3130define void @atomic64_xchg_seq_cst(ptr %a) nounwind uwtable {3131; CHECK-LABEL: @atomic64_xchg_seq_cst(3132; CHECK-NEXT: entry:3133; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3134; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3135; CHECK: atomicrmw.start:3136; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3137; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 seq_cst seq_cst, align 8, !pcsections [[META0]]3138; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3139; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3140; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3141; CHECK: atomicrmw.end:3142; CHECK-NEXT: ret void3143;3144entry:3145 atomicrmw xchg ptr %a, i64 0 seq_cst, !pcsections !03146 ret void3147}3148 3149define void @atomic64_add_seq_cst(ptr %a) nounwind uwtable {3150; CHECK-LABEL: @atomic64_add_seq_cst(3151; CHECK-NEXT: entry:3152; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3153; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3154; CHECK: atomicrmw.start:3155; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3156; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] seq_cst seq_cst, align 8, !pcsections [[META0]]3157; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3158; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3159; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3160; CHECK: atomicrmw.end:3161; CHECK-NEXT: ret void3162;3163entry:3164 atomicrmw add ptr %a, i64 0 seq_cst, !pcsections !03165 ret void3166}3167 3168define void @atomic64_sub_seq_cst(ptr %a) nounwind uwtable {3169; CHECK-LABEL: @atomic64_sub_seq_cst(3170; CHECK-NEXT: entry:3171; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3172; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3173; CHECK: atomicrmw.start:3174; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3175; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] seq_cst seq_cst, align 8, !pcsections [[META0]]3176; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3177; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3178; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3179; CHECK: atomicrmw.end:3180; CHECK-NEXT: ret void3181;3182entry:3183 atomicrmw sub ptr %a, i64 0 seq_cst, !pcsections !03184 ret void3185}3186 3187define void @atomic64_and_seq_cst(ptr %a) nounwind uwtable {3188; CHECK-LABEL: @atomic64_and_seq_cst(3189; CHECK-NEXT: entry:3190; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3191; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3192; CHECK: atomicrmw.start:3193; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3194; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 0 seq_cst seq_cst, align 8, !pcsections [[META0]]3195; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3196; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3197; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3198; CHECK: atomicrmw.end:3199; CHECK-NEXT: ret void3200;3201entry:3202 atomicrmw and ptr %a, i64 0 seq_cst, !pcsections !03203 ret void3204}3205 3206define void @atomic64_or_seq_cst(ptr %a) nounwind uwtable {3207; CHECK-LABEL: @atomic64_or_seq_cst(3208; CHECK-NEXT: entry:3209; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3210; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3211; CHECK: atomicrmw.start:3212; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3213; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] seq_cst seq_cst, align 8, !pcsections [[META0]]3214; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3215; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3216; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3217; CHECK: atomicrmw.end:3218; CHECK-NEXT: ret void3219;3220entry:3221 atomicrmw or ptr %a, i64 0 seq_cst, !pcsections !03222 ret void3223}3224 3225define void @atomic64_xor_seq_cst(ptr %a) nounwind uwtable {3226; CHECK-LABEL: @atomic64_xor_seq_cst(3227; CHECK-NEXT: entry:3228; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3229; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3230; CHECK: atomicrmw.start:3231; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3232; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 [[LOADED]] seq_cst seq_cst, align 8, !pcsections [[META0]]3233; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3234; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3235; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3236; CHECK: atomicrmw.end:3237; CHECK-NEXT: ret void3238;3239entry:3240 atomicrmw xor ptr %a, i64 0 seq_cst, !pcsections !03241 ret void3242}3243 3244define void @atomic64_nand_seq_cst(ptr %a) nounwind uwtable {3245; CHECK-LABEL: @atomic64_nand_seq_cst(3246; CHECK-NEXT: entry:3247; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr [[A:%.*]], align 8, !pcsections [[META0]]3248; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3249; CHECK: atomicrmw.start:3250; CHECK-NEXT: [[LOADED:%.*]] = phi i64 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3251; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 [[LOADED]], i64 -1 seq_cst seq_cst, align 8, !pcsections [[META0]]3252; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1, !pcsections [[META0]]3253; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i64, i1 } [[TMP1]], 0, !pcsections [[META0]]3254; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3255; CHECK: atomicrmw.end:3256; CHECK-NEXT: ret void3257;3258entry:3259 atomicrmw nand ptr %a, i64 0 seq_cst, !pcsections !03260 ret void3261}3262 3263define void @atomic64_cas_monotonic(ptr %a) nounwind uwtable {3264; CHECK-LABEL: @atomic64_cas_monotonic(3265; CHECK-NEXT: entry:3266; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i64 0, i64 1 monotonic monotonic, align 8, !pcsections [[META0]]3267; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 monotonic acquire, align 8, !pcsections [[META0]]3268; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 monotonic seq_cst, align 8, !pcsections [[META0]]3269; CHECK-NEXT: ret void3270;3271entry:3272 cmpxchg ptr %a, i64 0, i64 1 monotonic monotonic, !pcsections !03273 cmpxchg ptr %a, i64 0, i64 1 monotonic acquire, !pcsections !03274 cmpxchg ptr %a, i64 0, i64 1 monotonic seq_cst, !pcsections !03275 ret void3276}3277 3278define void @atomic64_cas_acquire(ptr %a) nounwind uwtable {3279; CHECK-LABEL: @atomic64_cas_acquire(3280; CHECK-NEXT: entry:3281; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i64 0, i64 1 acquire monotonic, align 8, !pcsections [[META0]]3282; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 acquire acquire, align 8, !pcsections [[META0]]3283; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 acquire seq_cst, align 8, !pcsections [[META0]]3284; CHECK-NEXT: ret void3285;3286entry:3287 cmpxchg ptr %a, i64 0, i64 1 acquire monotonic, !pcsections !03288 cmpxchg ptr %a, i64 0, i64 1 acquire acquire, !pcsections !03289 cmpxchg ptr %a, i64 0, i64 1 acquire seq_cst, !pcsections !03290 ret void3291}3292 3293define void @atomic64_cas_release(ptr %a) nounwind uwtable {3294; CHECK-LABEL: @atomic64_cas_release(3295; CHECK-NEXT: entry:3296; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i64 0, i64 1 release monotonic, align 8, !pcsections [[META0]]3297; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 release acquire, align 8, !pcsections [[META0]]3298; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 release seq_cst, align 8, !pcsections [[META0]]3299; CHECK-NEXT: ret void3300;3301entry:3302 cmpxchg ptr %a, i64 0, i64 1 release monotonic, !pcsections !03303 cmpxchg ptr %a, i64 0, i64 1 release acquire, !pcsections !03304 cmpxchg ptr %a, i64 0, i64 1 release seq_cst, !pcsections !03305 ret void3306}3307 3308define void @atomic64_cas_acq_rel(ptr %a) nounwind uwtable {3309; CHECK-LABEL: @atomic64_cas_acq_rel(3310; CHECK-NEXT: entry:3311; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i64 0, i64 1 acq_rel monotonic, align 8, !pcsections [[META0]]3312; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 acq_rel acquire, align 8, !pcsections [[META0]]3313; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 acq_rel seq_cst, align 8, !pcsections [[META0]]3314; CHECK-NEXT: ret void3315;3316entry:3317 cmpxchg ptr %a, i64 0, i64 1 acq_rel monotonic, !pcsections !03318 cmpxchg ptr %a, i64 0, i64 1 acq_rel acquire, !pcsections !03319 cmpxchg ptr %a, i64 0, i64 1 acq_rel seq_cst, !pcsections !03320 ret void3321}3322 3323define void @atomic64_cas_seq_cst(ptr %a) nounwind uwtable {3324; CHECK-LABEL: @atomic64_cas_seq_cst(3325; CHECK-NEXT: entry:3326; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i64 0, i64 1 seq_cst monotonic, align 8, !pcsections [[META0]]3327; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 seq_cst acquire, align 8, !pcsections [[META0]]3328; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A]], i64 0, i64 1 seq_cst seq_cst, align 8, !pcsections [[META0]]3329; CHECK-NEXT: ret void3330;3331entry:3332 cmpxchg ptr %a, i64 0, i64 1 seq_cst monotonic, !pcsections !03333 cmpxchg ptr %a, i64 0, i64 1 seq_cst acquire, !pcsections !03334 cmpxchg ptr %a, i64 0, i64 1 seq_cst seq_cst, !pcsections !03335 ret void3336}3337 3338define void @atomic64_cas_seq_cst_ptr_ty(ptr %a, ptr %v1, ptr %v2) nounwind uwtable {3339; CHECK-LABEL: @atomic64_cas_seq_cst_ptr_ty(3340; CHECK-NEXT: entry:3341; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[V1:%.*]] to i64, !pcsections [[META0]]3342; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[V2:%.*]] to i64, !pcsections [[META0]]3343; CHECK-NEXT: [[TMP2:%.*]] = cmpxchg ptr [[A:%.*]], i64 [[TMP0]], i64 [[TMP1]] seq_cst seq_cst, align 8, !pcsections [[META0]]3344; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i64, i1 } [[TMP2]], 0, !pcsections [[META0]]3345; CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i64, i1 } [[TMP2]], 1, !pcsections [[META0]]3346; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP3]] to ptr, !pcsections [[META0]]3347; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { ptr, i1 } poison, ptr [[TMP5]], 0, !pcsections [[META0]]3348; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { ptr, i1 } [[TMP6]], i1 [[TMP4]], 1, !pcsections [[META0]]3349; CHECK-NEXT: ret void3350;3351entry:3352 cmpxchg ptr %a, ptr %v1, ptr %v2 seq_cst seq_cst, !pcsections !03353 ret void3354}3355 3356define i128 @atomic128_load_unordered(ptr %a) nounwind uwtable {3357; CHECK-LABEL: @atomic128_load_unordered(3358; CHECK-NEXT: entry:3359; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 0 monotonic monotonic, align 16, !pcsections [[META0]]3360; CHECK-NEXT: [[LOADED:%.*]] = extractvalue { i128, i1 } [[TMP0]], 0, !pcsections [[META0]]3361; CHECK-NEXT: ret i128 [[LOADED]]3362;3363entry:3364 %0 = load atomic i128, ptr %a unordered, align 16, !pcsections !03365 ret i128 %03366}3367 3368define i128 @atomic128_load_monotonic(ptr %a) nounwind uwtable {3369; CHECK-LABEL: @atomic128_load_monotonic(3370; CHECK-NEXT: entry:3371; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 0 monotonic monotonic, align 16, !pcsections [[META0]]3372; CHECK-NEXT: [[LOADED:%.*]] = extractvalue { i128, i1 } [[TMP0]], 0, !pcsections [[META0]]3373; CHECK-NEXT: ret i128 [[LOADED]]3374;3375entry:3376 %0 = load atomic i128, ptr %a monotonic, align 16, !pcsections !03377 ret i128 %03378}3379 3380define i128 @atomic128_load_acquire(ptr %a) nounwind uwtable {3381; CHECK-LABEL: @atomic128_load_acquire(3382; CHECK-NEXT: entry:3383; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 0 acquire acquire, align 16, !pcsections [[META0]]3384; CHECK-NEXT: [[LOADED:%.*]] = extractvalue { i128, i1 } [[TMP0]], 0, !pcsections [[META0]]3385; CHECK-NEXT: ret i128 [[LOADED]]3386;3387entry:3388 %0 = load atomic i128, ptr %a acquire, align 16, !pcsections !03389 ret i128 %03390}3391 3392define i128 @atomic128_load_seq_cst(ptr %a) nounwind uwtable {3393; CHECK-LABEL: @atomic128_load_seq_cst(3394; CHECK-NEXT: entry:3395; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 0 seq_cst seq_cst, align 16, !pcsections [[META0]]3396; CHECK-NEXT: [[LOADED:%.*]] = extractvalue { i128, i1 } [[TMP0]], 0, !pcsections [[META0]]3397; CHECK-NEXT: ret i128 [[LOADED]]3398;3399entry:3400 %0 = load atomic i128, ptr %a seq_cst, align 16, !pcsections !03401 ret i128 %03402}3403 3404define void @atomic128_store_unordered(ptr %a) nounwind uwtable {3405; CHECK-LABEL: @atomic128_store_unordered(3406; CHECK-NEXT: entry:3407; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3408; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3409; CHECK: atomicrmw.start:3410; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3411; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 monotonic monotonic, align 16, !pcsections [[META0]]3412; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3413; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3414; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3415; CHECK: atomicrmw.end:3416; CHECK-NEXT: ret void3417;3418entry:3419 store atomic i128 0, ptr %a unordered, align 16, !pcsections !03420 ret void3421}3422 3423define void @atomic128_store_monotonic(ptr %a) nounwind uwtable {3424; CHECK-LABEL: @atomic128_store_monotonic(3425; CHECK-NEXT: entry:3426; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3427; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3428; CHECK: atomicrmw.start:3429; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3430; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 monotonic monotonic, align 16, !pcsections [[META0]]3431; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3432; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3433; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3434; CHECK: atomicrmw.end:3435; CHECK-NEXT: ret void3436;3437entry:3438 store atomic i128 0, ptr %a monotonic, align 16, !pcsections !03439 ret void3440}3441 3442define void @atomic128_store_release(ptr %a) nounwind uwtable {3443; CHECK-LABEL: @atomic128_store_release(3444; CHECK-NEXT: entry:3445; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3446; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3447; CHECK: atomicrmw.start:3448; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3449; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 release monotonic, align 16, !pcsections [[META0]]3450; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3451; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3452; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3453; CHECK: atomicrmw.end:3454; CHECK-NEXT: ret void3455;3456entry:3457 store atomic i128 0, ptr %a release, align 16, !pcsections !03458 ret void3459}3460 3461define void @atomic128_store_seq_cst(ptr %a) nounwind uwtable {3462; CHECK-LABEL: @atomic128_store_seq_cst(3463; CHECK-NEXT: entry:3464; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3465; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3466; CHECK: atomicrmw.start:3467; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3468; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 seq_cst seq_cst, align 16, !pcsections [[META0]]3469; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3470; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3471; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3472; CHECK: atomicrmw.end:3473; CHECK-NEXT: ret void3474;3475entry:3476 store atomic i128 0, ptr %a seq_cst, align 16, !pcsections !03477 ret void3478}3479 3480define void @atomic128_xchg_monotonic(ptr %a) nounwind uwtable {3481; CHECK-LABEL: @atomic128_xchg_monotonic(3482; CHECK-NEXT: entry:3483; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3484; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3485; CHECK: atomicrmw.start:3486; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3487; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 monotonic monotonic, align 16, !pcsections [[META0]]3488; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3489; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3490; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3491; CHECK: atomicrmw.end:3492; CHECK-NEXT: ret void3493;3494entry:3495 atomicrmw xchg ptr %a, i128 0 monotonic, !pcsections !03496 ret void3497}3498 3499define void @atomic128_add_monotonic(ptr %a) nounwind uwtable {3500; CHECK-LABEL: @atomic128_add_monotonic(3501; CHECK-NEXT: entry:3502; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3503; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3504; CHECK: atomicrmw.start:3505; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3506; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] monotonic monotonic, align 16, !pcsections [[META0]]3507; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3508; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3509; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3510; CHECK: atomicrmw.end:3511; CHECK-NEXT: ret void3512;3513entry:3514 atomicrmw add ptr %a, i128 0 monotonic, !pcsections !03515 ret void3516}3517 3518define void @atomic128_sub_monotonic(ptr %a) nounwind uwtable {3519; CHECK-LABEL: @atomic128_sub_monotonic(3520; CHECK-NEXT: entry:3521; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3522; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3523; CHECK: atomicrmw.start:3524; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3525; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] monotonic monotonic, align 16, !pcsections [[META0]]3526; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3527; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3528; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3529; CHECK: atomicrmw.end:3530; CHECK-NEXT: ret void3531;3532entry:3533 atomicrmw sub ptr %a, i128 0 monotonic, !pcsections !03534 ret void3535}3536 3537define void @atomic128_and_monotonic(ptr %a) nounwind uwtable {3538; CHECK-LABEL: @atomic128_and_monotonic(3539; CHECK-NEXT: entry:3540; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3541; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3542; CHECK: atomicrmw.start:3543; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3544; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 monotonic monotonic, align 16, !pcsections [[META0]]3545; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3546; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3547; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3548; CHECK: atomicrmw.end:3549; CHECK-NEXT: ret void3550;3551entry:3552 atomicrmw and ptr %a, i128 0 monotonic, !pcsections !03553 ret void3554}3555 3556define void @atomic128_or_monotonic(ptr %a) nounwind uwtable {3557; CHECK-LABEL: @atomic128_or_monotonic(3558; CHECK-NEXT: entry:3559; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3560; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3561; CHECK: atomicrmw.start:3562; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3563; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] monotonic monotonic, align 16, !pcsections [[META0]]3564; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3565; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3566; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3567; CHECK: atomicrmw.end:3568; CHECK-NEXT: ret void3569;3570entry:3571 atomicrmw or ptr %a, i128 0 monotonic, !pcsections !03572 ret void3573}3574 3575define void @atomic128_xor_monotonic(ptr %a) nounwind uwtable {3576; CHECK-LABEL: @atomic128_xor_monotonic(3577; CHECK-NEXT: entry:3578; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3579; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3580; CHECK: atomicrmw.start:3581; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3582; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] monotonic monotonic, align 16, !pcsections [[META0]]3583; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3584; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3585; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3586; CHECK: atomicrmw.end:3587; CHECK-NEXT: ret void3588;3589entry:3590 atomicrmw xor ptr %a, i128 0 monotonic, !pcsections !03591 ret void3592}3593 3594define void @atomic128_nand_monotonic(ptr %a) nounwind uwtable {3595; CHECK-LABEL: @atomic128_nand_monotonic(3596; CHECK-NEXT: entry:3597; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3598; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3599; CHECK: atomicrmw.start:3600; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3601; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 -1 monotonic monotonic, align 16, !pcsections [[META0]]3602; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3603; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3604; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3605; CHECK: atomicrmw.end:3606; CHECK-NEXT: ret void3607;3608entry:3609 atomicrmw nand ptr %a, i128 0 monotonic, !pcsections !03610 ret void3611}3612 3613define void @atomic128_xchg_acquire(ptr %a) nounwind uwtable {3614; CHECK-LABEL: @atomic128_xchg_acquire(3615; CHECK-NEXT: entry:3616; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3617; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3618; CHECK: atomicrmw.start:3619; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3620; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 acquire acquire, align 16, !pcsections [[META0]]3621; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3622; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3623; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3624; CHECK: atomicrmw.end:3625; CHECK-NEXT: ret void3626;3627entry:3628 atomicrmw xchg ptr %a, i128 0 acquire, !pcsections !03629 ret void3630}3631 3632define void @atomic128_add_acquire(ptr %a) nounwind uwtable {3633; CHECK-LABEL: @atomic128_add_acquire(3634; CHECK-NEXT: entry:3635; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3636; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3637; CHECK: atomicrmw.start:3638; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3639; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acquire acquire, align 16, !pcsections [[META0]]3640; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3641; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3642; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3643; CHECK: atomicrmw.end:3644; CHECK-NEXT: ret void3645;3646entry:3647 atomicrmw add ptr %a, i128 0 acquire, !pcsections !03648 ret void3649}3650 3651define void @atomic128_sub_acquire(ptr %a) nounwind uwtable {3652; CHECK-LABEL: @atomic128_sub_acquire(3653; CHECK-NEXT: entry:3654; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3655; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3656; CHECK: atomicrmw.start:3657; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3658; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acquire acquire, align 16, !pcsections [[META0]]3659; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3660; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3661; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3662; CHECK: atomicrmw.end:3663; CHECK-NEXT: ret void3664;3665entry:3666 atomicrmw sub ptr %a, i128 0 acquire, !pcsections !03667 ret void3668}3669 3670define void @atomic128_and_acquire(ptr %a) nounwind uwtable {3671; CHECK-LABEL: @atomic128_and_acquire(3672; CHECK-NEXT: entry:3673; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3674; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3675; CHECK: atomicrmw.start:3676; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3677; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 acquire acquire, align 16, !pcsections [[META0]]3678; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3679; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3680; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3681; CHECK: atomicrmw.end:3682; CHECK-NEXT: ret void3683;3684entry:3685 atomicrmw and ptr %a, i128 0 acquire, !pcsections !03686 ret void3687}3688 3689define void @atomic128_or_acquire(ptr %a) nounwind uwtable {3690; CHECK-LABEL: @atomic128_or_acquire(3691; CHECK-NEXT: entry:3692; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3693; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3694; CHECK: atomicrmw.start:3695; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3696; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acquire acquire, align 16, !pcsections [[META0]]3697; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3698; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3699; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3700; CHECK: atomicrmw.end:3701; CHECK-NEXT: ret void3702;3703entry:3704 atomicrmw or ptr %a, i128 0 acquire, !pcsections !03705 ret void3706}3707 3708define void @atomic128_xor_acquire(ptr %a) nounwind uwtable {3709; CHECK-LABEL: @atomic128_xor_acquire(3710; CHECK-NEXT: entry:3711; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3712; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3713; CHECK: atomicrmw.start:3714; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3715; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acquire acquire, align 16, !pcsections [[META0]]3716; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3717; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3718; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3719; CHECK: atomicrmw.end:3720; CHECK-NEXT: ret void3721;3722entry:3723 atomicrmw xor ptr %a, i128 0 acquire, !pcsections !03724 ret void3725}3726 3727define void @atomic128_nand_acquire(ptr %a) nounwind uwtable {3728; CHECK-LABEL: @atomic128_nand_acquire(3729; CHECK-NEXT: entry:3730; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3731; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3732; CHECK: atomicrmw.start:3733; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3734; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 -1 acquire acquire, align 16, !pcsections [[META0]]3735; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3736; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3737; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3738; CHECK: atomicrmw.end:3739; CHECK-NEXT: ret void3740;3741entry:3742 atomicrmw nand ptr %a, i128 0 acquire, !pcsections !03743 ret void3744}3745 3746define void @atomic128_xchg_release(ptr %a) nounwind uwtable {3747; CHECK-LABEL: @atomic128_xchg_release(3748; CHECK-NEXT: entry:3749; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3750; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3751; CHECK: atomicrmw.start:3752; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3753; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 release monotonic, align 16, !pcsections [[META0]]3754; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3755; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3756; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3757; CHECK: atomicrmw.end:3758; CHECK-NEXT: ret void3759;3760entry:3761 atomicrmw xchg ptr %a, i128 0 release, !pcsections !03762 ret void3763}3764 3765define void @atomic128_add_release(ptr %a) nounwind uwtable {3766; CHECK-LABEL: @atomic128_add_release(3767; CHECK-NEXT: entry:3768; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3769; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3770; CHECK: atomicrmw.start:3771; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3772; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] release monotonic, align 16, !pcsections [[META0]]3773; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3774; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3775; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3776; CHECK: atomicrmw.end:3777; CHECK-NEXT: ret void3778;3779entry:3780 atomicrmw add ptr %a, i128 0 release, !pcsections !03781 ret void3782}3783 3784define void @atomic128_sub_release(ptr %a) nounwind uwtable {3785; CHECK-LABEL: @atomic128_sub_release(3786; CHECK-NEXT: entry:3787; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3788; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3789; CHECK: atomicrmw.start:3790; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3791; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] release monotonic, align 16, !pcsections [[META0]]3792; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3793; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3794; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3795; CHECK: atomicrmw.end:3796; CHECK-NEXT: ret void3797;3798entry:3799 atomicrmw sub ptr %a, i128 0 release, !pcsections !03800 ret void3801}3802 3803define void @atomic128_and_release(ptr %a) nounwind uwtable {3804; CHECK-LABEL: @atomic128_and_release(3805; CHECK-NEXT: entry:3806; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3807; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3808; CHECK: atomicrmw.start:3809; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3810; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 release monotonic, align 16, !pcsections [[META0]]3811; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3812; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3813; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3814; CHECK: atomicrmw.end:3815; CHECK-NEXT: ret void3816;3817entry:3818 atomicrmw and ptr %a, i128 0 release, !pcsections !03819 ret void3820}3821 3822define void @atomic128_or_release(ptr %a) nounwind uwtable {3823; CHECK-LABEL: @atomic128_or_release(3824; CHECK-NEXT: entry:3825; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3826; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3827; CHECK: atomicrmw.start:3828; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3829; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] release monotonic, align 16, !pcsections [[META0]]3830; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3831; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3832; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3833; CHECK: atomicrmw.end:3834; CHECK-NEXT: ret void3835;3836entry:3837 atomicrmw or ptr %a, i128 0 release, !pcsections !03838 ret void3839}3840 3841define void @atomic128_xor_release(ptr %a) nounwind uwtable {3842; CHECK-LABEL: @atomic128_xor_release(3843; CHECK-NEXT: entry:3844; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3845; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3846; CHECK: atomicrmw.start:3847; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3848; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] release monotonic, align 16, !pcsections [[META0]]3849; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3850; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3851; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3852; CHECK: atomicrmw.end:3853; CHECK-NEXT: ret void3854;3855entry:3856 atomicrmw xor ptr %a, i128 0 release, !pcsections !03857 ret void3858}3859 3860define void @atomic128_nand_release(ptr %a) nounwind uwtable {3861; CHECK-LABEL: @atomic128_nand_release(3862; CHECK-NEXT: entry:3863; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3864; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3865; CHECK: atomicrmw.start:3866; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3867; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 -1 release monotonic, align 16, !pcsections [[META0]]3868; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3869; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3870; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3871; CHECK: atomicrmw.end:3872; CHECK-NEXT: ret void3873;3874entry:3875 atomicrmw nand ptr %a, i128 0 release, !pcsections !03876 ret void3877}3878 3879define void @atomic128_xchg_acq_rel(ptr %a) nounwind uwtable {3880; CHECK-LABEL: @atomic128_xchg_acq_rel(3881; CHECK-NEXT: entry:3882; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3883; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3884; CHECK: atomicrmw.start:3885; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3886; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 acq_rel acquire, align 16, !pcsections [[META0]]3887; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3888; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3889; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3890; CHECK: atomicrmw.end:3891; CHECK-NEXT: ret void3892;3893entry:3894 atomicrmw xchg ptr %a, i128 0 acq_rel, !pcsections !03895 ret void3896}3897 3898define void @atomic128_add_acq_rel(ptr %a) nounwind uwtable {3899; CHECK-LABEL: @atomic128_add_acq_rel(3900; CHECK-NEXT: entry:3901; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3902; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3903; CHECK: atomicrmw.start:3904; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3905; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acq_rel acquire, align 16, !pcsections [[META0]]3906; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3907; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3908; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3909; CHECK: atomicrmw.end:3910; CHECK-NEXT: ret void3911;3912entry:3913 atomicrmw add ptr %a, i128 0 acq_rel, !pcsections !03914 ret void3915}3916 3917define void @atomic128_sub_acq_rel(ptr %a) nounwind uwtable {3918; CHECK-LABEL: @atomic128_sub_acq_rel(3919; CHECK-NEXT: entry:3920; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3921; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3922; CHECK: atomicrmw.start:3923; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3924; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acq_rel acquire, align 16, !pcsections [[META0]]3925; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3926; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3927; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3928; CHECK: atomicrmw.end:3929; CHECK-NEXT: ret void3930;3931entry:3932 atomicrmw sub ptr %a, i128 0 acq_rel, !pcsections !03933 ret void3934}3935 3936define void @atomic128_and_acq_rel(ptr %a) nounwind uwtable {3937; CHECK-LABEL: @atomic128_and_acq_rel(3938; CHECK-NEXT: entry:3939; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3940; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3941; CHECK: atomicrmw.start:3942; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3943; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 acq_rel acquire, align 16, !pcsections [[META0]]3944; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3945; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3946; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3947; CHECK: atomicrmw.end:3948; CHECK-NEXT: ret void3949;3950entry:3951 atomicrmw and ptr %a, i128 0 acq_rel, !pcsections !03952 ret void3953}3954 3955define void @atomic128_or_acq_rel(ptr %a) nounwind uwtable {3956; CHECK-LABEL: @atomic128_or_acq_rel(3957; CHECK-NEXT: entry:3958; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3959; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3960; CHECK: atomicrmw.start:3961; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3962; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acq_rel acquire, align 16, !pcsections [[META0]]3963; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3964; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3965; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3966; CHECK: atomicrmw.end:3967; CHECK-NEXT: ret void3968;3969entry:3970 atomicrmw or ptr %a, i128 0 acq_rel, !pcsections !03971 ret void3972}3973 3974define void @atomic128_xor_acq_rel(ptr %a) nounwind uwtable {3975; CHECK-LABEL: @atomic128_xor_acq_rel(3976; CHECK-NEXT: entry:3977; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3978; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3979; CHECK: atomicrmw.start:3980; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]3981; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] acq_rel acquire, align 16, !pcsections [[META0]]3982; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]3983; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]3984; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]3985; CHECK: atomicrmw.end:3986; CHECK-NEXT: ret void3987;3988entry:3989 atomicrmw xor ptr %a, i128 0 acq_rel, !pcsections !03990 ret void3991}3992 3993define void @atomic128_nand_acq_rel(ptr %a) nounwind uwtable {3994; CHECK-LABEL: @atomic128_nand_acq_rel(3995; CHECK-NEXT: entry:3996; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]3997; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]3998; CHECK: atomicrmw.start:3999; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4000; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 -1 acq_rel acquire, align 16, !pcsections [[META0]]4001; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4002; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4003; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4004; CHECK: atomicrmw.end:4005; CHECK-NEXT: ret void4006;4007entry:4008 atomicrmw nand ptr %a, i128 0 acq_rel, !pcsections !04009 ret void4010}4011 4012define void @atomic128_xchg_seq_cst(ptr %a) nounwind uwtable {4013; CHECK-LABEL: @atomic128_xchg_seq_cst(4014; CHECK-NEXT: entry:4015; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]4016; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]4017; CHECK: atomicrmw.start:4018; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4019; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 seq_cst seq_cst, align 16, !pcsections [[META0]]4020; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4021; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4022; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4023; CHECK: atomicrmw.end:4024; CHECK-NEXT: ret void4025;4026entry:4027 atomicrmw xchg ptr %a, i128 0 seq_cst, !pcsections !04028 ret void4029}4030 4031define void @atomic128_add_seq_cst(ptr %a) nounwind uwtable {4032; CHECK-LABEL: @atomic128_add_seq_cst(4033; CHECK-NEXT: entry:4034; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]4035; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]4036; CHECK: atomicrmw.start:4037; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4038; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] seq_cst seq_cst, align 16, !pcsections [[META0]]4039; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4040; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4041; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4042; CHECK: atomicrmw.end:4043; CHECK-NEXT: ret void4044;4045entry:4046 atomicrmw add ptr %a, i128 0 seq_cst, !pcsections !04047 ret void4048}4049 4050define void @atomic128_sub_seq_cst(ptr %a) nounwind uwtable {4051; CHECK-LABEL: @atomic128_sub_seq_cst(4052; CHECK-NEXT: entry:4053; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]4054; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]4055; CHECK: atomicrmw.start:4056; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4057; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] seq_cst seq_cst, align 16, !pcsections [[META0]]4058; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4059; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4060; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4061; CHECK: atomicrmw.end:4062; CHECK-NEXT: ret void4063;4064entry:4065 atomicrmw sub ptr %a, i128 0 seq_cst, !pcsections !04066 ret void4067}4068 4069define void @atomic128_and_seq_cst(ptr %a) nounwind uwtable {4070; CHECK-LABEL: @atomic128_and_seq_cst(4071; CHECK-NEXT: entry:4072; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]4073; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]4074; CHECK: atomicrmw.start:4075; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4076; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 0 seq_cst seq_cst, align 16, !pcsections [[META0]]4077; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4078; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4079; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4080; CHECK: atomicrmw.end:4081; CHECK-NEXT: ret void4082;4083entry:4084 atomicrmw and ptr %a, i128 0 seq_cst, !pcsections !04085 ret void4086}4087 4088define void @atomic128_or_seq_cst(ptr %a) nounwind uwtable {4089; CHECK-LABEL: @atomic128_or_seq_cst(4090; CHECK-NEXT: entry:4091; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]4092; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]4093; CHECK: atomicrmw.start:4094; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4095; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] seq_cst seq_cst, align 16, !pcsections [[META0]]4096; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4097; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4098; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4099; CHECK: atomicrmw.end:4100; CHECK-NEXT: ret void4101;4102entry:4103 atomicrmw or ptr %a, i128 0 seq_cst, !pcsections !04104 ret void4105}4106 4107define void @atomic128_xor_seq_cst(ptr %a) nounwind uwtable {4108; CHECK-LABEL: @atomic128_xor_seq_cst(4109; CHECK-NEXT: entry:4110; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]4111; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]4112; CHECK: atomicrmw.start:4113; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4114; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 [[LOADED]] seq_cst seq_cst, align 16, !pcsections [[META0]]4115; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4116; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4117; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4118; CHECK: atomicrmw.end:4119; CHECK-NEXT: ret void4120;4121entry:4122 atomicrmw xor ptr %a, i128 0 seq_cst, !pcsections !04123 ret void4124}4125 4126define void @atomic128_nand_seq_cst(ptr %a) nounwind uwtable {4127; CHECK-LABEL: @atomic128_nand_seq_cst(4128; CHECK-NEXT: entry:4129; CHECK-NEXT: [[TMP0:%.*]] = load i128, ptr [[A:%.*]], align 16, !pcsections [[META0]]4130; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]], !pcsections [[META0]]4131; CHECK: atomicrmw.start:4132; CHECK-NEXT: [[LOADED:%.*]] = phi i128 [ [[TMP0]], [[ENTRY:%.*]] ], [ [[NEWLOADED:%.*]], [[ATOMICRMW_START]] ], !pcsections [[META0]]4133; CHECK-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[A]], i128 [[LOADED]], i128 -1 seq_cst seq_cst, align 16, !pcsections [[META0]]4134; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i128, i1 } [[TMP1]], 1, !pcsections [[META0]]4135; CHECK-NEXT: [[NEWLOADED]] = extractvalue { i128, i1 } [[TMP1]], 0, !pcsections [[META0]]4136; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]], !pcsections [[META0]]4137; CHECK: atomicrmw.end:4138; CHECK-NEXT: ret void4139;4140entry:4141 atomicrmw nand ptr %a, i128 0 seq_cst, !pcsections !04142 ret void4143}4144 4145define void @atomic128_cas_monotonic(ptr %a) nounwind uwtable {4146; CHECK-LABEL: @atomic128_cas_monotonic(4147; CHECK-NEXT: entry:4148; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 1 monotonic monotonic, align 16, !pcsections [[META0]]4149; CHECK-NEXT: ret void4150;4151entry:4152 cmpxchg ptr %a, i128 0, i128 1 monotonic monotonic, !pcsections !04153 ret void4154}4155 4156define void @atomic128_cas_acquire(ptr %a) nounwind uwtable {4157; CHECK-LABEL: @atomic128_cas_acquire(4158; CHECK-NEXT: entry:4159; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 1 acquire acquire, align 16, !pcsections [[META0]]4160; CHECK-NEXT: ret void4161;4162entry:4163 cmpxchg ptr %a, i128 0, i128 1 acquire acquire, !pcsections !04164 ret void4165}4166 4167define void @atomic128_cas_release(ptr %a) nounwind uwtable {4168; CHECK-LABEL: @atomic128_cas_release(4169; CHECK-NEXT: entry:4170; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 1 release monotonic, align 16, !pcsections [[META0]]4171; CHECK-NEXT: ret void4172;4173entry:4174 cmpxchg ptr %a, i128 0, i128 1 release monotonic, !pcsections !04175 ret void4176}4177 4178define void @atomic128_cas_acq_rel(ptr %a) nounwind uwtable {4179; CHECK-LABEL: @atomic128_cas_acq_rel(4180; CHECK-NEXT: entry:4181; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 1 acq_rel acquire, align 16, !pcsections [[META0]]4182; CHECK-NEXT: ret void4183;4184entry:4185 cmpxchg ptr %a, i128 0, i128 1 acq_rel acquire, !pcsections !04186 ret void4187}4188 4189define void @atomic128_cas_seq_cst(ptr %a) nounwind uwtable {4190; CHECK-LABEL: @atomic128_cas_seq_cst(4191; CHECK-NEXT: entry:4192; CHECK-NEXT: [[TMP0:%.*]] = cmpxchg ptr [[A:%.*]], i128 0, i128 1 seq_cst seq_cst, align 16, !pcsections [[META0]]4193; CHECK-NEXT: ret void4194;4195entry:4196 cmpxchg ptr %a, i128 0, i128 1 seq_cst seq_cst, !pcsections !04197 ret void4198}4199 4200!0 = !{!"foo"}4201