782 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=bpfel -mcpu=v3 -filetype=asm < %s | FileCheck %s3;4; Source:5; $ cat atomics_mem_order_v3.c6; #include <stdatomic.h>7;8; void test_fetch_add_32_noret(int _Atomic *i) {9; (void)__c11_atomic_fetch_add(i, 10, memory_order_relaxed);10; (void)__c11_atomic_fetch_add(i, 10, memory_order_acquire);11; (void)__c11_atomic_fetch_add(i, 10, memory_order_release);12; (void)__c11_atomic_fetch_add(i, 10, memory_order_acq_rel);13; (void)__c11_atomic_fetch_add(i, 10, memory_order_seq_cst);14; }15;16; int test_fetch_add_32_ret(int _Atomic *i) {17; return __c11_atomic_fetch_add(i, 10, memory_order_relaxed) +18; __c11_atomic_fetch_add(i, 10, memory_order_acquire) +19; __c11_atomic_fetch_add(i, 10, memory_order_release) +20; __c11_atomic_fetch_add(i, 10, memory_order_acq_rel) +21; __c11_atomic_fetch_add(i, 10, memory_order_seq_cst);22; }23;24; void test_fetch_add_64_noret(long _Atomic *i) {25; (void)__c11_atomic_fetch_add(i, 10, memory_order_relaxed);26; (void)__c11_atomic_fetch_add(i, 10, memory_order_acquire);27; (void)__c11_atomic_fetch_add(i, 10, memory_order_release);28; (void)__c11_atomic_fetch_add(i, 10, memory_order_acq_rel);29; (void)__c11_atomic_fetch_add(i, 10, memory_order_seq_cst);30; }31;32; long test_fetch_add_64_ret(long _Atomic *i) {33; return __c11_atomic_fetch_add(i, 10, memory_order_relaxed) +34; __c11_atomic_fetch_add(i, 10, memory_order_acquire) +35; __c11_atomic_fetch_add(i, 10, memory_order_release) +36; __c11_atomic_fetch_add(i, 10, memory_order_acq_rel) +37; __c11_atomic_fetch_add(i, 10, memory_order_seq_cst);38; }39;40; void test_fetch_sub_32_noret(int _Atomic *i) {41; (void)__c11_atomic_fetch_sub(i, 10, memory_order_relaxed);42; (void)__c11_atomic_fetch_sub(i, 10, memory_order_acquire);43; (void)__c11_atomic_fetch_sub(i, 10, memory_order_release);44; (void)__c11_atomic_fetch_sub(i, 10, memory_order_acq_rel);45; (void)__c11_atomic_fetch_sub(i, 10, memory_order_seq_cst);46; }47;48; int test_fetch_sub_32_ret(int _Atomic *i) {49; return __c11_atomic_fetch_sub(i, 10, memory_order_relaxed) +50; __c11_atomic_fetch_sub(i, 10, memory_order_acquire) +51; __c11_atomic_fetch_sub(i, 10, memory_order_release) +52; __c11_atomic_fetch_sub(i, 10, memory_order_acq_rel) +53; __c11_atomic_fetch_sub(i, 10, memory_order_seq_cst);54; }55;56; void test_fetch_sub_64_noret(long _Atomic *i) {57; (void)__c11_atomic_fetch_sub(i, 10, memory_order_relaxed);58; (void)__c11_atomic_fetch_sub(i, 10, memory_order_acquire);59; (void)__c11_atomic_fetch_sub(i, 10, memory_order_release);60; (void)__c11_atomic_fetch_sub(i, 10, memory_order_acq_rel);61; (void)__c11_atomic_fetch_sub(i, 10, memory_order_seq_cst);62; }63;64; long test_fetch_sub_64_ret(long _Atomic *i) {65; return __c11_atomic_fetch_sub(i, 10, memory_order_relaxed) +66; __c11_atomic_fetch_sub(i, 10, memory_order_acquire) +67; __c11_atomic_fetch_sub(i, 10, memory_order_release) +68; __c11_atomic_fetch_sub(i, 10, memory_order_acq_rel) +69; __c11_atomic_fetch_sub(i, 10, memory_order_seq_cst);70; }71;72; void test_fetch_and_32_noret(int _Atomic *i) {73; (void)__c11_atomic_fetch_and(i, 10, memory_order_relaxed);74; (void)__c11_atomic_fetch_and(i, 10, memory_order_acquire);75; (void)__c11_atomic_fetch_and(i, 10, memory_order_release);76; (void)__c11_atomic_fetch_and(i, 10, memory_order_acq_rel);77; (void)__c11_atomic_fetch_and(i, 10, memory_order_seq_cst);78; }79;80; int test_fetch_and_32_ret(int _Atomic *i) {81; return __c11_atomic_fetch_and(i, 10, memory_order_relaxed) +82; __c11_atomic_fetch_and(i, 10, memory_order_acquire) +83; __c11_atomic_fetch_and(i, 10, memory_order_release) +84; __c11_atomic_fetch_and(i, 10, memory_order_acq_rel) +85; __c11_atomic_fetch_and(i, 10, memory_order_seq_cst);86; }87;88; void test_fetch_and_64_noret(long _Atomic *i) {89; (void)__c11_atomic_fetch_and(i, 10, memory_order_relaxed);90; (void)__c11_atomic_fetch_and(i, 10, memory_order_acquire);91; (void)__c11_atomic_fetch_and(i, 10, memory_order_release);92; (void)__c11_atomic_fetch_and(i, 10, memory_order_acq_rel);93; (void)__c11_atomic_fetch_and(i, 10, memory_order_seq_cst);94; }95;96; long test_fetch_and_64_ret(long _Atomic *i) {97; return __c11_atomic_fetch_and(i, 10, memory_order_relaxed) +98; __c11_atomic_fetch_and(i, 10, memory_order_acquire) +99; __c11_atomic_fetch_and(i, 10, memory_order_release) +100; __c11_atomic_fetch_and(i, 10, memory_order_acq_rel) +101; __c11_atomic_fetch_and(i, 10, memory_order_seq_cst);102; }103;104; void test_fetch_or_32_noret(int _Atomic *i) {105; (void)__c11_atomic_fetch_or(i, 10, memory_order_relaxed);106; (void)__c11_atomic_fetch_or(i, 10, memory_order_acquire);107; (void)__c11_atomic_fetch_or(i, 10, memory_order_release);108; (void)__c11_atomic_fetch_or(i, 10, memory_order_acq_rel);109; (void)__c11_atomic_fetch_or(i, 10, memory_order_seq_cst);110; }111;112; int test_fetch_or_32_ret(int _Atomic *i) {113; return __c11_atomic_fetch_or(i, 10, memory_order_relaxed) +114; __c11_atomic_fetch_or(i, 10, memory_order_acquire) +115; __c11_atomic_fetch_or(i, 10, memory_order_release) +116; __c11_atomic_fetch_or(i, 10, memory_order_acq_rel) +117; __c11_atomic_fetch_or(i, 10, memory_order_seq_cst);118; }119;120; void test_fetch_or_64_noret(long _Atomic *i) {121; (void)__c11_atomic_fetch_or(i, 10, memory_order_relaxed);122; (void)__c11_atomic_fetch_or(i, 10, memory_order_acquire);123; (void)__c11_atomic_fetch_or(i, 10, memory_order_release);124; (void)__c11_atomic_fetch_or(i, 10, memory_order_acq_rel);125; (void)__c11_atomic_fetch_or(i, 10, memory_order_seq_cst);126; }127;128; long test_fetch_or_64_ret(long _Atomic *i) {129; return __c11_atomic_fetch_or(i, 10, memory_order_relaxed) +130; __c11_atomic_fetch_or(i, 10, memory_order_acquire) +131; __c11_atomic_fetch_or(i, 10, memory_order_release) +132; __c11_atomic_fetch_or(i, 10, memory_order_acq_rel) +133; __c11_atomic_fetch_or(i, 10, memory_order_seq_cst);134; }135;136; void test_fetch_xor_32_noret(int _Atomic *i) {137; (void)__c11_atomic_fetch_xor(i, 10, memory_order_relaxed);138; (void)__c11_atomic_fetch_xor(i, 10, memory_order_acquire);139; (void)__c11_atomic_fetch_xor(i, 10, memory_order_release);140; (void)__c11_atomic_fetch_xor(i, 10, memory_order_acq_rel);141; (void)__c11_atomic_fetch_xor(i, 10, memory_order_seq_cst);142; }143;144; int test_fetch_xor_32_ret(int _Atomic *i) {145; return __c11_atomic_fetch_xor(i, 10, memory_order_relaxed) +146; __c11_atomic_fetch_xor(i, 10, memory_order_acquire) +147; __c11_atomic_fetch_xor(i, 10, memory_order_release) +148; __c11_atomic_fetch_xor(i, 10, memory_order_acq_rel) +149; __c11_atomic_fetch_xor(i, 10, memory_order_seq_cst);150; }151;152; void test_fetch_xor_64_noret(long _Atomic *i) {153; (void)__c11_atomic_fetch_xor(i, 10, memory_order_relaxed);154; (void)__c11_atomic_fetch_xor(i, 10, memory_order_acquire);155; (void)__c11_atomic_fetch_xor(i, 10, memory_order_release);156; (void)__c11_atomic_fetch_xor(i, 10, memory_order_acq_rel);157; (void)__c11_atomic_fetch_xor(i, 10, memory_order_seq_cst);158; }159;160; long test_fetch_xor_64_ret(long _Atomic *i) {161; return __c11_atomic_fetch_xor(i, 10, memory_order_relaxed) +162; __c11_atomic_fetch_xor(i, 10, memory_order_acquire) +163; __c11_atomic_fetch_xor(i, 10, memory_order_release) +164; __c11_atomic_fetch_xor(i, 10, memory_order_acq_rel) +165; __c11_atomic_fetch_xor(i, 10, memory_order_seq_cst);166; }167 168target triple = "bpf"169 170; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)171define dso_local void @test_fetch_add_32_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {172; CHECK-LABEL: test_fetch_add_32_noret:173; CHECK: .Ltest_fetch_add_32_noret$local:174; CHECK-NEXT: .type .Ltest_fetch_add_32_noret$local,@function175; CHECK-NEXT: # %bb.0: # %entry176; CHECK-NEXT: w2 = 10177; CHECK-NEXT: w3 = 10178; CHECK-NEXT: lock *(u32 *)(r1 + 0) += w3179; CHECK-NEXT: w3 = 10180; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)181; CHECK-NEXT: w3 = 10182; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)183; CHECK-NEXT: w3 = 10184; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)185; CHECK-NEXT: w2 = atomic_fetch_add((u32 *)(r1 + 0), w2)186; CHECK-NEXT: exit187entry:188 %0 = atomicrmw add ptr %i, i32 10 monotonic, align 4189 %1 = atomicrmw add ptr %i, i32 10 acquire, align 4190 %2 = atomicrmw add ptr %i, i32 10 release, align 4191 %3 = atomicrmw add ptr %i, i32 10 acq_rel, align 4192 %4 = atomicrmw add ptr %i, i32 10 seq_cst, align 4193 ret void194}195 196; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)197define dso_local i32 @test_fetch_add_32_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {198; CHECK-LABEL: test_fetch_add_32_ret:199; CHECK: .Ltest_fetch_add_32_ret$local:200; CHECK-NEXT: .type .Ltest_fetch_add_32_ret$local,@function201; CHECK-NEXT: # %bb.0: # %entry202; CHECK-NEXT: w2 = 10203; CHECK-NEXT: w3 = 10204; CHECK-NEXT: lock *(u32 *)(r1 + 0) += w3205; CHECK-NEXT: w0 = 10206; CHECK-NEXT: w0 = atomic_fetch_add((u32 *)(r1 + 0), w0)207; CHECK-NEXT: w0 += w3208; CHECK-NEXT: w3 = 10209; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)210; CHECK-NEXT: w0 += w3211; CHECK-NEXT: w3 = 10212; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)213; CHECK-NEXT: w0 += w3214; CHECK-NEXT: w2 = atomic_fetch_add((u32 *)(r1 + 0), w2)215; CHECK-NEXT: w0 += w2216; CHECK-NEXT: exit217entry:218 %0 = atomicrmw add ptr %i, i32 10 monotonic, align 4219 %1 = atomicrmw add ptr %i, i32 10 acquire, align 4220 %add = add nsw i32 %1, %0221 %2 = atomicrmw add ptr %i, i32 10 release, align 4222 %add5 = add nsw i32 %add, %2223 %3 = atomicrmw add ptr %i, i32 10 acq_rel, align 4224 %add8 = add nsw i32 %add5, %3225 %4 = atomicrmw add ptr %i, i32 10 seq_cst, align 4226 %add11 = add nsw i32 %add8, %4227 ret i32 %add11228}229 230; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)231define dso_local void @test_fetch_add_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {232; CHECK-LABEL: test_fetch_add_64_noret:233; CHECK: .Ltest_fetch_add_64_noret$local:234; CHECK-NEXT: .type .Ltest_fetch_add_64_noret$local,@function235; CHECK-NEXT: # %bb.0: # %entry236; CHECK-NEXT: r2 = 10237; CHECK-NEXT: r3 = 10238; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3239; CHECK-NEXT: r3 = 10240; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)241; CHECK-NEXT: r3 = 10242; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)243; CHECK-NEXT: r3 = 10244; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)245; CHECK-NEXT: r2 = atomic_fetch_add((u64 *)(r1 + 0), r2)246; CHECK-NEXT: exit247entry:248 %0 = atomicrmw add ptr %i, i64 10 monotonic, align 8249 %1 = atomicrmw add ptr %i, i64 10 acquire, align 8250 %2 = atomicrmw add ptr %i, i64 10 release, align 8251 %3 = atomicrmw add ptr %i, i64 10 acq_rel, align 8252 %4 = atomicrmw add ptr %i, i64 10 seq_cst, align 8253 ret void254}255 256; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)257define dso_local i64 @test_fetch_add_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {258; CHECK-LABEL: test_fetch_add_64_ret:259; CHECK: .Ltest_fetch_add_64_ret$local:260; CHECK-NEXT: .type .Ltest_fetch_add_64_ret$local,@function261; CHECK-NEXT: # %bb.0: # %entry262; CHECK-NEXT: r2 = 10263; CHECK-NEXT: r3 = 10264; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3265; CHECK-NEXT: r0 = 10266; CHECK-NEXT: r0 = atomic_fetch_add((u64 *)(r1 + 0), r0)267; CHECK-NEXT: r0 += r3268; CHECK-NEXT: r3 = 10269; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)270; CHECK-NEXT: r0 += r3271; CHECK-NEXT: r3 = 10272; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)273; CHECK-NEXT: r0 += r3274; CHECK-NEXT: r2 = atomic_fetch_add((u64 *)(r1 + 0), r2)275; CHECK-NEXT: r0 += r2276; CHECK-NEXT: exit277entry:278 %0 = atomicrmw add ptr %i, i64 10 monotonic, align 8279 %1 = atomicrmw add ptr %i, i64 10 acquire, align 8280 %add = add nsw i64 %1, %0281 %2 = atomicrmw add ptr %i, i64 10 release, align 8282 %add5 = add nsw i64 %add, %2283 %3 = atomicrmw add ptr %i, i64 10 acq_rel, align 8284 %add8 = add nsw i64 %add5, %3285 %4 = atomicrmw add ptr %i, i64 10 seq_cst, align 8286 %add11 = add nsw i64 %add8, %4287 ret i64 %add11288}289 290; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)291define dso_local void @test_fetch_sub_32_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {292; CHECK-LABEL: test_fetch_sub_32_noret:293; CHECK: .Ltest_fetch_sub_32_noret$local:294; CHECK-NEXT: .type .Ltest_fetch_sub_32_noret$local,@function295; CHECK-NEXT: # %bb.0: # %entry296; CHECK-NEXT: w2 = 10297; CHECK-NEXT: w2 = -w2298; CHECK-NEXT: w3 = w2299; CHECK-NEXT: lock *(u32 *)(r1 + 0) += w3300; CHECK-NEXT: w3 = w2301; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)302; CHECK-NEXT: w3 = w2303; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)304; CHECK-NEXT: w3 = w2305; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)306; CHECK-NEXT: w2 = atomic_fetch_add((u32 *)(r1 + 0), w2)307; CHECK-NEXT: exit308entry:309 %0 = atomicrmw sub ptr %i, i32 10 monotonic, align 4310 %1 = atomicrmw sub ptr %i, i32 10 acquire, align 4311 %2 = atomicrmw sub ptr %i, i32 10 release, align 4312 %3 = atomicrmw sub ptr %i, i32 10 acq_rel, align 4313 %4 = atomicrmw sub ptr %i, i32 10 seq_cst, align 4314 ret void315}316 317; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)318define dso_local i32 @test_fetch_sub_32_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {319; CHECK-LABEL: test_fetch_sub_32_ret:320; CHECK: .Ltest_fetch_sub_32_ret$local:321; CHECK-NEXT: .type .Ltest_fetch_sub_32_ret$local,@function322; CHECK-NEXT: # %bb.0: # %entry323; CHECK-NEXT: w2 = 10324; CHECK-NEXT: w2 = -w2325; CHECK-NEXT: w3 = w2326; CHECK-NEXT: lock *(u32 *)(r1 + 0) += w3327; CHECK-NEXT: w0 = w2328; CHECK-NEXT: w0 = atomic_fetch_add((u32 *)(r1 + 0), w0)329; CHECK-NEXT: w0 += w3330; CHECK-NEXT: w3 = w2331; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)332; CHECK-NEXT: w0 += w3333; CHECK-NEXT: w3 = w2334; CHECK-NEXT: w3 = atomic_fetch_add((u32 *)(r1 + 0), w3)335; CHECK-NEXT: w0 += w3336; CHECK-NEXT: w2 = atomic_fetch_add((u32 *)(r1 + 0), w2)337; CHECK-NEXT: w0 += w2338; CHECK-NEXT: exit339entry:340 %0 = atomicrmw sub ptr %i, i32 10 monotonic, align 4341 %1 = atomicrmw sub ptr %i, i32 10 acquire, align 4342 %add = add nsw i32 %1, %0343 %2 = atomicrmw sub ptr %i, i32 10 release, align 4344 %add5 = add nsw i32 %add, %2345 %3 = atomicrmw sub ptr %i, i32 10 acq_rel, align 4346 %add8 = add nsw i32 %add5, %3347 %4 = atomicrmw sub ptr %i, i32 10 seq_cst, align 4348 %add11 = add nsw i32 %add8, %4349 ret i32 %add11350}351 352; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)353define dso_local void @test_fetch_sub_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {354; CHECK-LABEL: test_fetch_sub_64_noret:355; CHECK: .Ltest_fetch_sub_64_noret$local:356; CHECK-NEXT: .type .Ltest_fetch_sub_64_noret$local,@function357; CHECK-NEXT: # %bb.0: # %entry358; CHECK-NEXT: r2 = 10359; CHECK-NEXT: r2 = -r2360; CHECK-NEXT: r3 = r2361; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3362; CHECK-NEXT: r3 = r2363; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)364; CHECK-NEXT: r3 = r2365; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)366; CHECK-NEXT: r3 = r2367; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)368; CHECK-NEXT: r2 = atomic_fetch_add((u64 *)(r1 + 0), r2)369; CHECK-NEXT: exit370entry:371 %0 = atomicrmw sub ptr %i, i64 10 monotonic, align 8372 %1 = atomicrmw sub ptr %i, i64 10 acquire, align 8373 %2 = atomicrmw sub ptr %i, i64 10 release, align 8374 %3 = atomicrmw sub ptr %i, i64 10 acq_rel, align 8375 %4 = atomicrmw sub ptr %i, i64 10 seq_cst, align 8376 ret void377}378 379; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)380define dso_local i64 @test_fetch_sub_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {381; CHECK-LABEL: test_fetch_sub_64_ret:382; CHECK: .Ltest_fetch_sub_64_ret$local:383; CHECK-NEXT: .type .Ltest_fetch_sub_64_ret$local,@function384; CHECK-NEXT: # %bb.0: # %entry385; CHECK-NEXT: r2 = 10386; CHECK-NEXT: r2 = -r2387; CHECK-NEXT: r3 = r2388; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3389; CHECK-NEXT: r0 = r2390; CHECK-NEXT: r0 = atomic_fetch_add((u64 *)(r1 + 0), r0)391; CHECK-NEXT: r0 += r3392; CHECK-NEXT: r3 = r2393; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)394; CHECK-NEXT: r0 += r3395; CHECK-NEXT: r3 = r2396; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)397; CHECK-NEXT: r0 += r3398; CHECK-NEXT: r2 = atomic_fetch_add((u64 *)(r1 + 0), r2)399; CHECK-NEXT: r0 += r2400; CHECK-NEXT: exit401entry:402 %0 = atomicrmw sub ptr %i, i64 10 monotonic, align 8403 %1 = atomicrmw sub ptr %i, i64 10 acquire, align 8404 %add = add nsw i64 %1, %0405 %2 = atomicrmw sub ptr %i, i64 10 release, align 8406 %add5 = add nsw i64 %add, %2407 %3 = atomicrmw sub ptr %i, i64 10 acq_rel, align 8408 %add8 = add nsw i64 %add5, %3409 %4 = atomicrmw sub ptr %i, i64 10 seq_cst, align 8410 %add11 = add nsw i64 %add8, %4411 ret i64 %add11412}413 414; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)415define dso_local void @test_fetch_and_32_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {416; CHECK-LABEL: test_fetch_and_32_noret:417; CHECK: .Ltest_fetch_and_32_noret$local:418; CHECK-NEXT: .type .Ltest_fetch_and_32_noret$local,@function419; CHECK-NEXT: # %bb.0: # %entry420; CHECK-NEXT: w2 = 10421; CHECK-NEXT: w3 = 10422; CHECK-NEXT: lock *(u32 *)(r1 + 0) &= w3423; CHECK-NEXT: w3 = 10424; CHECK-NEXT: w3 = atomic_fetch_and((u32 *)(r1 + 0), w3)425; CHECK-NEXT: w3 = 10426; CHECK-NEXT: w3 = atomic_fetch_and((u32 *)(r1 + 0), w3)427; CHECK-NEXT: w3 = 10428; CHECK-NEXT: w3 = atomic_fetch_and((u32 *)(r1 + 0), w3)429; CHECK-NEXT: w2 = atomic_fetch_and((u32 *)(r1 + 0), w2)430; CHECK-NEXT: exit431entry:432 %0 = atomicrmw and ptr %i, i32 10 monotonic, align 4433 %1 = atomicrmw and ptr %i, i32 10 acquire, align 4434 %2 = atomicrmw and ptr %i, i32 10 release, align 4435 %3 = atomicrmw and ptr %i, i32 10 acq_rel, align 4436 %4 = atomicrmw and ptr %i, i32 10 seq_cst, align 4437 ret void438}439 440; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)441define dso_local i32 @test_fetch_and_32_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {442; CHECK-LABEL: test_fetch_and_32_ret:443; CHECK: .Ltest_fetch_and_32_ret$local:444; CHECK-NEXT: .type .Ltest_fetch_and_32_ret$local,@function445; CHECK-NEXT: # %bb.0: # %entry446; CHECK-NEXT: w2 = 10447; CHECK-NEXT: w3 = 10448; CHECK-NEXT: lock *(u32 *)(r1 + 0) &= w3449; CHECK-NEXT: w0 = 10450; CHECK-NEXT: w0 = atomic_fetch_and((u32 *)(r1 + 0), w0)451; CHECK-NEXT: w0 += w3452; CHECK-NEXT: w3 = 10453; CHECK-NEXT: w3 = atomic_fetch_and((u32 *)(r1 + 0), w3)454; CHECK-NEXT: w0 += w3455; CHECK-NEXT: w3 = 10456; CHECK-NEXT: w3 = atomic_fetch_and((u32 *)(r1 + 0), w3)457; CHECK-NEXT: w0 += w3458; CHECK-NEXT: w2 = atomic_fetch_and((u32 *)(r1 + 0), w2)459; CHECK-NEXT: w0 += w2460; CHECK-NEXT: exit461entry:462 %0 = atomicrmw and ptr %i, i32 10 monotonic, align 4463 %1 = atomicrmw and ptr %i, i32 10 acquire, align 4464 %add = add nsw i32 %1, %0465 %2 = atomicrmw and ptr %i, i32 10 release, align 4466 %add5 = add nsw i32 %add, %2467 %3 = atomicrmw and ptr %i, i32 10 acq_rel, align 4468 %add8 = add nsw i32 %add5, %3469 %4 = atomicrmw and ptr %i, i32 10 seq_cst, align 4470 %add11 = add nsw i32 %add8, %4471 ret i32 %add11472}473 474; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)475define dso_local void @test_fetch_and_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {476; CHECK-LABEL: test_fetch_and_64_noret:477; CHECK: .Ltest_fetch_and_64_noret$local:478; CHECK-NEXT: .type .Ltest_fetch_and_64_noret$local,@function479; CHECK-NEXT: # %bb.0: # %entry480; CHECK-NEXT: r2 = 10481; CHECK-NEXT: r3 = 10482; CHECK-NEXT: lock *(u64 *)(r1 + 0) &= r3483; CHECK-NEXT: r3 = 10484; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)485; CHECK-NEXT: r3 = 10486; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)487; CHECK-NEXT: r3 = 10488; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)489; CHECK-NEXT: r2 = atomic_fetch_and((u64 *)(r1 + 0), r2)490; CHECK-NEXT: exit491entry:492 %0 = atomicrmw and ptr %i, i64 10 monotonic, align 8493 %1 = atomicrmw and ptr %i, i64 10 acquire, align 8494 %2 = atomicrmw and ptr %i, i64 10 release, align 8495 %3 = atomicrmw and ptr %i, i64 10 acq_rel, align 8496 %4 = atomicrmw and ptr %i, i64 10 seq_cst, align 8497 ret void498}499 500; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)501define dso_local i64 @test_fetch_and_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {502; CHECK-LABEL: test_fetch_and_64_ret:503; CHECK: .Ltest_fetch_and_64_ret$local:504; CHECK-NEXT: .type .Ltest_fetch_and_64_ret$local,@function505; CHECK-NEXT: # %bb.0: # %entry506; CHECK-NEXT: r2 = 10507; CHECK-NEXT: r3 = 10508; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)509; CHECK-NEXT: r0 = 10510; CHECK-NEXT: r0 = atomic_fetch_and((u64 *)(r1 + 0), r0)511; CHECK-NEXT: r0 += r3512; CHECK-NEXT: r3 = 10513; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)514; CHECK-NEXT: r0 += r3515; CHECK-NEXT: r3 = 10516; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)517; CHECK-NEXT: r0 += r3518; CHECK-NEXT: r2 = atomic_fetch_and((u64 *)(r1 + 0), r2)519; CHECK-NEXT: r0 += r2520; CHECK-NEXT: exit521entry:522 %0 = atomicrmw and ptr %i, i64 10 monotonic, align 8523 %1 = atomicrmw and ptr %i, i64 10 acquire, align 8524 %add = add nsw i64 %1, %0525 %2 = atomicrmw and ptr %i, i64 10 release, align 8526 %add5 = add nsw i64 %add, %2527 %3 = atomicrmw and ptr %i, i64 10 acq_rel, align 8528 %add8 = add nsw i64 %add5, %3529 %4 = atomicrmw and ptr %i, i64 10 seq_cst, align 8530 %add11 = add nsw i64 %add8, %4531 ret i64 %add11532}533 534; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)535define dso_local void @test_fetch_or_32_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {536; CHECK-LABEL: test_fetch_or_32_noret:537; CHECK: .Ltest_fetch_or_32_noret$local:538; CHECK-NEXT: .type .Ltest_fetch_or_32_noret$local,@function539; CHECK-NEXT: # %bb.0: # %entry540; CHECK-NEXT: w2 = 10541; CHECK-NEXT: w3 = 10542; CHECK-NEXT: lock *(u32 *)(r1 + 0) |= w3543; CHECK-NEXT: w3 = 10544; CHECK-NEXT: w3 = atomic_fetch_or((u32 *)(r1 + 0), w3)545; CHECK-NEXT: w3 = 10546; CHECK-NEXT: w3 = atomic_fetch_or((u32 *)(r1 + 0), w3)547; CHECK-NEXT: w3 = 10548; CHECK-NEXT: w3 = atomic_fetch_or((u32 *)(r1 + 0), w3)549; CHECK-NEXT: w2 = atomic_fetch_or((u32 *)(r1 + 0), w2)550; CHECK-NEXT: exit551entry:552 %0 = atomicrmw or ptr %i, i32 10 monotonic, align 4553 %1 = atomicrmw or ptr %i, i32 10 acquire, align 4554 %2 = atomicrmw or ptr %i, i32 10 release, align 4555 %3 = atomicrmw or ptr %i, i32 10 acq_rel, align 4556 %4 = atomicrmw or ptr %i, i32 10 seq_cst, align 4557 ret void558}559 560; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)561define dso_local i32 @test_fetch_or_32_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {562; CHECK-LABEL: test_fetch_or_32_ret:563; CHECK: .Ltest_fetch_or_32_ret$local:564; CHECK-NEXT: .type .Ltest_fetch_or_32_ret$local,@function565; CHECK-NEXT: # %bb.0: # %entry566; CHECK-NEXT: w2 = 10567; CHECK-NEXT: w3 = 10568; CHECK-NEXT: lock *(u32 *)(r1 + 0) |= w3569; CHECK-NEXT: w0 = 10570; CHECK-NEXT: w0 = atomic_fetch_or((u32 *)(r1 + 0), w0)571; CHECK-NEXT: w0 += w3572; CHECK-NEXT: w3 = 10573; CHECK-NEXT: w3 = atomic_fetch_or((u32 *)(r1 + 0), w3)574; CHECK-NEXT: w0 += w3575; CHECK-NEXT: w3 = 10576; CHECK-NEXT: w3 = atomic_fetch_or((u32 *)(r1 + 0), w3)577; CHECK-NEXT: w0 += w3578; CHECK-NEXT: w2 = atomic_fetch_or((u32 *)(r1 + 0), w2)579; CHECK-NEXT: w0 += w2580; CHECK-NEXT: exit581entry:582 %0 = atomicrmw or ptr %i, i32 10 monotonic, align 4583 %1 = atomicrmw or ptr %i, i32 10 acquire, align 4584 %add = add nsw i32 %1, %0585 %2 = atomicrmw or ptr %i, i32 10 release, align 4586 %add5 = add nsw i32 %add, %2587 %3 = atomicrmw or ptr %i, i32 10 acq_rel, align 4588 %add8 = add nsw i32 %add5, %3589 %4 = atomicrmw or ptr %i, i32 10 seq_cst, align 4590 %add11 = add nsw i32 %add8, %4591 ret i32 %add11592}593 594; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)595define dso_local void @test_fetch_or_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {596; CHECK-LABEL: test_fetch_or_64_noret:597; CHECK: .Ltest_fetch_or_64_noret$local:598; CHECK-NEXT: .type .Ltest_fetch_or_64_noret$local,@function599; CHECK-NEXT: # %bb.0: # %entry600; CHECK-NEXT: r2 = 10601; CHECK-NEXT: r3 = 10602; CHECK-NEXT: lock *(u64 *)(r1 + 0) |= r3603; CHECK-NEXT: r3 = 10604; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)605; CHECK-NEXT: r3 = 10606; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)607; CHECK-NEXT: r3 = 10608; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)609; CHECK-NEXT: r2 = atomic_fetch_or((u64 *)(r1 + 0), r2)610; CHECK-NEXT: exit611entry:612 %0 = atomicrmw or ptr %i, i64 10 monotonic, align 8613 %1 = atomicrmw or ptr %i, i64 10 acquire, align 8614 %2 = atomicrmw or ptr %i, i64 10 release, align 8615 %3 = atomicrmw or ptr %i, i64 10 acq_rel, align 8616 %4 = atomicrmw or ptr %i, i64 10 seq_cst, align 8617 ret void618}619 620; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)621define dso_local i64 @test_fetch_or_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {622; CHECK-LABEL: test_fetch_or_64_ret:623; CHECK: .Ltest_fetch_or_64_ret$local:624; CHECK-NEXT: .type .Ltest_fetch_or_64_ret$local,@function625; CHECK-NEXT: # %bb.0: # %entry626; CHECK-NEXT: r2 = 10627; CHECK-NEXT: r3 = 10628; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)629; CHECK-NEXT: r0 = 10630; CHECK-NEXT: r0 = atomic_fetch_or((u64 *)(r1 + 0), r0)631; CHECK-NEXT: r0 += r3632; CHECK-NEXT: r3 = 10633; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)634; CHECK-NEXT: r0 += r3635; CHECK-NEXT: r3 = 10636; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)637; CHECK-NEXT: r0 += r3638; CHECK-NEXT: r2 = atomic_fetch_or((u64 *)(r1 + 0), r2)639; CHECK-NEXT: r0 += r2640; CHECK-NEXT: exit641entry:642 %0 = atomicrmw or ptr %i, i64 10 monotonic, align 8643 %1 = atomicrmw or ptr %i, i64 10 acquire, align 8644 %add = add nsw i64 %1, %0645 %2 = atomicrmw or ptr %i, i64 10 release, align 8646 %add5 = add nsw i64 %add, %2647 %3 = atomicrmw or ptr %i, i64 10 acq_rel, align 8648 %add8 = add nsw i64 %add5, %3649 %4 = atomicrmw or ptr %i, i64 10 seq_cst, align 8650 %add11 = add nsw i64 %add8, %4651 ret i64 %add11652}653 654; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)655define dso_local void @test_fetch_xor_32_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {656; CHECK-LABEL: test_fetch_xor_32_noret:657; CHECK: .Ltest_fetch_xor_32_noret$local:658; CHECK-NEXT: .type .Ltest_fetch_xor_32_noret$local,@function659; CHECK-NEXT: # %bb.0: # %entry660; CHECK-NEXT: w2 = 10661; CHECK-NEXT: w3 = 10662; CHECK-NEXT: lock *(u32 *)(r1 + 0) ^= w3663; CHECK-NEXT: w3 = 10664; CHECK-NEXT: w3 = atomic_fetch_xor((u32 *)(r1 + 0), w3)665; CHECK-NEXT: w3 = 10666; CHECK-NEXT: w3 = atomic_fetch_xor((u32 *)(r1 + 0), w3)667; CHECK-NEXT: w3 = 10668; CHECK-NEXT: w3 = atomic_fetch_xor((u32 *)(r1 + 0), w3)669; CHECK-NEXT: w2 = atomic_fetch_xor((u32 *)(r1 + 0), w2)670; CHECK-NEXT: exit671entry:672 %0 = atomicrmw xor ptr %i, i32 10 monotonic, align 4673 %1 = atomicrmw xor ptr %i, i32 10 acquire, align 4674 %2 = atomicrmw xor ptr %i, i32 10 release, align 4675 %3 = atomicrmw xor ptr %i, i32 10 acq_rel, align 4676 %4 = atomicrmw xor ptr %i, i32 10 seq_cst, align 4677 ret void678}679 680; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)681define dso_local i32 @test_fetch_xor_32_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {682; CHECK-LABEL: test_fetch_xor_32_ret:683; CHECK: .Ltest_fetch_xor_32_ret$local:684; CHECK-NEXT: .type .Ltest_fetch_xor_32_ret$local,@function685; CHECK-NEXT: # %bb.0: # %entry686; CHECK-NEXT: w2 = 10687; CHECK-NEXT: w3 = 10688; CHECK-NEXT: lock *(u32 *)(r1 + 0) ^= w3689; CHECK-NEXT: w0 = 10690; CHECK-NEXT: w0 = atomic_fetch_xor((u32 *)(r1 + 0), w0)691; CHECK-NEXT: w0 += w3692; CHECK-NEXT: w3 = 10693; CHECK-NEXT: w3 = atomic_fetch_xor((u32 *)(r1 + 0), w3)694; CHECK-NEXT: w0 += w3695; CHECK-NEXT: w3 = 10696; CHECK-NEXT: w3 = atomic_fetch_xor((u32 *)(r1 + 0), w3)697; CHECK-NEXT: w0 += w3698; CHECK-NEXT: w2 = atomic_fetch_xor((u32 *)(r1 + 0), w2)699; CHECK-NEXT: w0 += w2700; CHECK-NEXT: exit701entry:702 %0 = atomicrmw xor ptr %i, i32 10 monotonic, align 4703 %1 = atomicrmw xor ptr %i, i32 10 acquire, align 4704 %add = add nsw i32 %1, %0705 %2 = atomicrmw xor ptr %i, i32 10 release, align 4706 %add5 = add nsw i32 %add, %2707 %3 = atomicrmw xor ptr %i, i32 10 acq_rel, align 4708 %add8 = add nsw i32 %add5, %3709 %4 = atomicrmw xor ptr %i, i32 10 seq_cst, align 4710 %add11 = add nsw i32 %add8, %4711 ret i32 %add11712}713 714; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)715define dso_local void @test_fetch_xor_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {716; CHECK-LABEL: test_fetch_xor_64_noret:717; CHECK: .Ltest_fetch_xor_64_noret$local:718; CHECK-NEXT: .type .Ltest_fetch_xor_64_noret$local,@function719; CHECK-NEXT: # %bb.0: # %entry720; CHECK-NEXT: r2 = 10721; CHECK-NEXT: r3 = 10722; CHECK-NEXT: lock *(u64 *)(r1 + 0) ^= r3723; CHECK-NEXT: r3 = 10724; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)725; CHECK-NEXT: r3 = 10726; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)727; CHECK-NEXT: r3 = 10728; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)729; CHECK-NEXT: r2 = atomic_fetch_xor((u64 *)(r1 + 0), r2)730; CHECK-NEXT: exit731entry:732 %0 = atomicrmw xor ptr %i, i64 10 monotonic, align 8733 %1 = atomicrmw xor ptr %i, i64 10 acquire, align 8734 %2 = atomicrmw xor ptr %i, i64 10 release, align 8735 %3 = atomicrmw xor ptr %i, i64 10 acq_rel, align 8736 %4 = atomicrmw xor ptr %i, i64 10 seq_cst, align 8737 ret void738}739 740; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)741define dso_local i64 @test_fetch_xor_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {742; CHECK-LABEL: test_fetch_xor_64_ret:743; CHECK: .Ltest_fetch_xor_64_ret$local:744; CHECK-NEXT: .type .Ltest_fetch_xor_64_ret$local,@function745; CHECK-NEXT: # %bb.0: # %entry746; CHECK-NEXT: r2 = 10747; CHECK-NEXT: r3 = 10748; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)749; CHECK-NEXT: r0 = 10750; CHECK-NEXT: r0 = atomic_fetch_xor((u64 *)(r1 + 0), r0)751; CHECK-NEXT: r0 += r3752; CHECK-NEXT: r3 = 10753; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)754; CHECK-NEXT: r0 += r3755; CHECK-NEXT: r3 = 10756; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)757; CHECK-NEXT: r0 += r3758; CHECK-NEXT: r2 = atomic_fetch_xor((u64 *)(r1 + 0), r2)759; CHECK-NEXT: r0 += r2760; CHECK-NEXT: exit761entry:762 %0 = atomicrmw xor ptr %i, i64 10 monotonic, align 8763 %1 = atomicrmw xor ptr %i, i64 10 acquire, align 8764 %add = add nsw i64 %1, %0765 %2 = atomicrmw xor ptr %i, i64 10 release, align 8766 %add5 = add nsw i64 %add, %2767 %3 = atomicrmw xor ptr %i, i64 10 acq_rel, align 8768 %add8 = add nsw i64 %add5, %3769 %4 = atomicrmw xor ptr %i, i64 10 seq_cst, align 8770 %add11 = add nsw i64 %add8, %4771 ret i64 %add11772}773 774attributes #0 = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="v3" }775 776!llvm.module.flags = !{!0, !1}777!llvm.ident = !{!2}778 779!0 = !{i32 1, !"wchar_size", i32 4}780!1 = !{i32 7, !"frame-pointer", i32 2}781!2 = !{!"clang version 20.0.0git (git@github.com:yonghong-song/llvm-project.git 6f71e34e194dab5a52cb2211af575c6067e9e504)"}782