386 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=bpfel -mcpu=v1 -filetype=asm < %s | FileCheck %s3;4; Source:5; $ cat atomics_mem_order_v1.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; void test_fetch_add_64_noret(long _Atomic *i) {17; (void)__c11_atomic_fetch_add(i, 10, memory_order_relaxed);18; (void)__c11_atomic_fetch_add(i, 10, memory_order_acquire);19; (void)__c11_atomic_fetch_add(i, 10, memory_order_release);20; (void)__c11_atomic_fetch_add(i, 10, memory_order_acq_rel);21; (void)__c11_atomic_fetch_add(i, 10, memory_order_seq_cst);22; }23;24; void test_fetch_sub_64_noret(long _Atomic *i) {25; (void)__c11_atomic_fetch_sub(i, 10, memory_order_relaxed);26; (void)__c11_atomic_fetch_sub(i, 10, memory_order_acquire);27; (void)__c11_atomic_fetch_sub(i, 10, memory_order_release);28; (void)__c11_atomic_fetch_sub(i, 10, memory_order_acq_rel);29; (void)__c11_atomic_fetch_sub(i, 10, memory_order_seq_cst);30; }31;32; long test_fetch_sub_64_ret(long _Atomic *i) {33; return __c11_atomic_fetch_sub(i, 10, memory_order_acquire) +34; __c11_atomic_fetch_sub(i, 10, memory_order_release) +35; __c11_atomic_fetch_sub(i, 10, memory_order_acq_rel) +36; __c11_atomic_fetch_sub(i, 10, memory_order_seq_cst);37; }38;39; void test_fetch_and_64_noret(long _Atomic *i) {40; (void)__c11_atomic_fetch_and(i, 10, memory_order_relaxed);41; (void)__c11_atomic_fetch_and(i, 10, memory_order_acquire);42; (void)__c11_atomic_fetch_and(i, 10, memory_order_release);43; (void)__c11_atomic_fetch_and(i, 10, memory_order_acq_rel);44; (void)__c11_atomic_fetch_and(i, 10, memory_order_seq_cst);45; }46;47; long test_fetch_and_64_ret(long _Atomic *i) {48; return __c11_atomic_fetch_and(i, 10, memory_order_relaxed) +49; __c11_atomic_fetch_and(i, 10, memory_order_acquire) +50; __c11_atomic_fetch_and(i, 10, memory_order_release) +51; __c11_atomic_fetch_and(i, 10, memory_order_acq_rel) +52; __c11_atomic_fetch_and(i, 10, memory_order_seq_cst);53; }54;55; void test_fetch_or_64_noret(long _Atomic *i) {56; (void)__c11_atomic_fetch_or(i, 10, memory_order_relaxed);57; (void)__c11_atomic_fetch_or(i, 10, memory_order_acquire);58; (void)__c11_atomic_fetch_or(i, 10, memory_order_release);59; (void)__c11_atomic_fetch_or(i, 10, memory_order_acq_rel);60; (void)__c11_atomic_fetch_or(i, 10, memory_order_seq_cst);61; }62;63; long test_fetch_or_64_ret(long _Atomic *i) {64; return __c11_atomic_fetch_or(i, 10, memory_order_relaxed) +65; __c11_atomic_fetch_or(i, 10, memory_order_acquire) +66; __c11_atomic_fetch_or(i, 10, memory_order_release) +67; __c11_atomic_fetch_or(i, 10, memory_order_acq_rel) +68; __c11_atomic_fetch_or(i, 10, memory_order_seq_cst);69; }70;71; void test_fetch_xor_64_noret(long _Atomic *i) {72; (void)__c11_atomic_fetch_xor(i, 10, memory_order_relaxed);73; (void)__c11_atomic_fetch_xor(i, 10, memory_order_acquire);74; (void)__c11_atomic_fetch_xor(i, 10, memory_order_release);75; (void)__c11_atomic_fetch_xor(i, 10, memory_order_acq_rel);76; (void)__c11_atomic_fetch_xor(i, 10, memory_order_seq_cst);77; }78;79; long test_fetch_xor_64_ret(long _Atomic *i) {80; return __c11_atomic_fetch_xor(i, 10, memory_order_relaxed) +81; __c11_atomic_fetch_xor(i, 10, memory_order_acquire) +82; __c11_atomic_fetch_xor(i, 10, memory_order_release) +83; __c11_atomic_fetch_xor(i, 10, memory_order_acq_rel) +84; __c11_atomic_fetch_xor(i, 10, memory_order_seq_cst);85; }86 87target triple = "bpf"88 89; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)90define dso_local void @test_fetch_add_32_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {91; CHECK-LABEL: test_fetch_add_32_noret:92; CHECK: .Ltest_fetch_add_32_noret$local:93; CHECK-NEXT: .type .Ltest_fetch_add_32_noret$local,@function94; CHECK-NEXT: # %bb.0: # %entry95; CHECK-NEXT: r2 = 1096; CHECK-NEXT: r3 = 1097; CHECK-NEXT: lock *(u32 *)(r1 + 0) += r398; CHECK-NEXT: r3 = 1099; CHECK-NEXT: lock *(u32 *)(r1 + 0) += r3100; CHECK-NEXT: r3 = 10101; CHECK-NEXT: lock *(u32 *)(r1 + 0) += r3102; CHECK-NEXT: r3 = 10103; CHECK-NEXT: lock *(u32 *)(r1 + 0) += r3104; CHECK-NEXT: lock *(u32 *)(r1 + 0) += r2105; CHECK-NEXT: exit106entry:107 %0 = atomicrmw add ptr %i, i32 10 monotonic, align 4108 %1 = atomicrmw add ptr %i, i32 10 acquire, align 4109 %2 = atomicrmw add ptr %i, i32 10 release, align 4110 %3 = atomicrmw add ptr %i, i32 10 acq_rel, align 4111 %4 = atomicrmw add ptr %i, i32 10 seq_cst, align 4112 ret void113}114 115; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)116define dso_local void @test_fetch_add_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {117; CHECK-LABEL: test_fetch_add_64_noret:118; CHECK: .Ltest_fetch_add_64_noret$local:119; CHECK-NEXT: .type .Ltest_fetch_add_64_noret$local,@function120; CHECK-NEXT: # %bb.0: # %entry121; CHECK-NEXT: r2 = 10122; CHECK-NEXT: r3 = 10123; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3124; CHECK-NEXT: r3 = 10125; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3126; CHECK-NEXT: r3 = 10127; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3128; CHECK-NEXT: r3 = 10129; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3130; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r2131; CHECK-NEXT: exit132entry:133 %0 = atomicrmw add ptr %i, i64 10 monotonic, align 8134 %1 = atomicrmw add ptr %i, i64 10 acquire, align 8135 %2 = atomicrmw add ptr %i, i64 10 release, align 8136 %3 = atomicrmw add ptr %i, i64 10 acq_rel, align 8137 %4 = atomicrmw add ptr %i, i64 10 seq_cst, align 8138 ret void139}140 141; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)142define dso_local void @test_fetch_sub_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {143; CHECK-LABEL: test_fetch_sub_64_noret:144; CHECK: .Ltest_fetch_sub_64_noret$local:145; CHECK-NEXT: .type .Ltest_fetch_sub_64_noret$local,@function146; CHECK-NEXT: # %bb.0: # %entry147; CHECK-NEXT: r2 = 10148; CHECK-NEXT: r2 = -r2149; CHECK-NEXT: r3 = r2150; CHECK-NEXT: lock *(u64 *)(r1 + 0) += r3151; CHECK-NEXT: r3 = r2152; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)153; CHECK-NEXT: r3 = r2154; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)155; CHECK-NEXT: r3 = r2156; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)157; CHECK-NEXT: r2 = atomic_fetch_add((u64 *)(r1 + 0), r2)158; CHECK-NEXT: exit159entry:160 %0 = atomicrmw sub ptr %i, i64 10 monotonic, align 8161 %1 = atomicrmw sub ptr %i, i64 10 acquire, align 8162 %2 = atomicrmw sub ptr %i, i64 10 release, align 8163 %3 = atomicrmw sub ptr %i, i64 10 acq_rel, align 8164 %4 = atomicrmw sub ptr %i, i64 10 seq_cst, align 8165 ret void166}167 168; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)169define dso_local i64 @test_fetch_sub_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {170; CHECK-LABEL: test_fetch_sub_64_ret:171; CHECK: .Ltest_fetch_sub_64_ret$local:172; CHECK-NEXT: .type .Ltest_fetch_sub_64_ret$local,@function173; CHECK-NEXT: # %bb.0: # %entry174; CHECK-NEXT: r2 = 10175; CHECK-NEXT: r2 = -r2176; CHECK-NEXT: r3 = r2177; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)178; CHECK-NEXT: r0 = r2179; CHECK-NEXT: r0 = atomic_fetch_add((u64 *)(r1 + 0), r0)180; CHECK-NEXT: r0 += r3181; CHECK-NEXT: r3 = r2182; CHECK-NEXT: r3 = atomic_fetch_add((u64 *)(r1 + 0), r3)183; CHECK-NEXT: r0 += r3184; CHECK-NEXT: r2 = atomic_fetch_add((u64 *)(r1 + 0), r2)185; CHECK-NEXT: r0 += r2186; CHECK-NEXT: exit187entry:188 %0 = atomicrmw sub ptr %i, i64 10 acquire, align 8189 %1 = atomicrmw sub ptr %i, i64 10 release, align 8190 %add = add nsw i64 %1, %0191 %2 = atomicrmw sub ptr %i, i64 10 acq_rel, align 8192 %add5 = add nsw i64 %add, %2193 %3 = atomicrmw sub ptr %i, i64 10 seq_cst, align 8194 %add8 = add nsw i64 %add5, %3195 ret i64 %add8196}197 198; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)199define dso_local void @test_fetch_and_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {200; CHECK-LABEL: test_fetch_and_64_noret:201; CHECK: .Ltest_fetch_and_64_noret$local:202; CHECK-NEXT: .type .Ltest_fetch_and_64_noret$local,@function203; CHECK-NEXT: # %bb.0: # %entry204; CHECK-NEXT: r2 = 10205; CHECK-NEXT: r3 = 10206; CHECK-NEXT: lock *(u64 *)(r1 + 0) &= r3207; CHECK-NEXT: r3 = 10208; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)209; CHECK-NEXT: r3 = 10210; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)211; CHECK-NEXT: r3 = 10212; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)213; CHECK-NEXT: r2 = atomic_fetch_and((u64 *)(r1 + 0), r2)214; CHECK-NEXT: exit215entry:216 %0 = atomicrmw and ptr %i, i64 10 monotonic, align 8217 %1 = atomicrmw and ptr %i, i64 10 acquire, align 8218 %2 = atomicrmw and ptr %i, i64 10 release, align 8219 %3 = atomicrmw and ptr %i, i64 10 acq_rel, align 8220 %4 = atomicrmw and ptr %i, i64 10 seq_cst, align 8221 ret void222}223 224; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)225define dso_local i64 @test_fetch_and_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {226; CHECK-LABEL: test_fetch_and_64_ret:227; CHECK: .Ltest_fetch_and_64_ret$local:228; CHECK-NEXT: .type .Ltest_fetch_and_64_ret$local,@function229; CHECK-NEXT: # %bb.0: # %entry230; CHECK-NEXT: r2 = 10231; CHECK-NEXT: r3 = 10232; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)233; CHECK-NEXT: r0 = 10234; CHECK-NEXT: r0 = atomic_fetch_and((u64 *)(r1 + 0), r0)235; CHECK-NEXT: r0 += r3236; CHECK-NEXT: r3 = 10237; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)238; CHECK-NEXT: r0 += r3239; CHECK-NEXT: r3 = 10240; CHECK-NEXT: r3 = atomic_fetch_and((u64 *)(r1 + 0), r3)241; CHECK-NEXT: r0 += r3242; CHECK-NEXT: r2 = atomic_fetch_and((u64 *)(r1 + 0), r2)243; CHECK-NEXT: r0 += r2244; CHECK-NEXT: exit245entry:246 %0 = atomicrmw and ptr %i, i64 10 monotonic, align 8247 %1 = atomicrmw and ptr %i, i64 10 acquire, align 8248 %add = add nsw i64 %1, %0249 %2 = atomicrmw and ptr %i, i64 10 release, align 8250 %add5 = add nsw i64 %add, %2251 %3 = atomicrmw and ptr %i, i64 10 acq_rel, align 8252 %add8 = add nsw i64 %add5, %3253 %4 = atomicrmw and ptr %i, i64 10 seq_cst, align 8254 %add11 = add nsw i64 %add8, %4255 ret i64 %add11256}257 258; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)259define dso_local void @test_fetch_or_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {260; CHECK-LABEL: test_fetch_or_64_noret:261; CHECK: .Ltest_fetch_or_64_noret$local:262; CHECK-NEXT: .type .Ltest_fetch_or_64_noret$local,@function263; CHECK-NEXT: # %bb.0: # %entry264; CHECK-NEXT: r2 = 10265; CHECK-NEXT: r3 = 10266; CHECK-NEXT: lock *(u64 *)(r1 + 0) |= r3267; CHECK-NEXT: r3 = 10268; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)269; CHECK-NEXT: r3 = 10270; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)271; CHECK-NEXT: r3 = 10272; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)273; CHECK-NEXT: r2 = atomic_fetch_or((u64 *)(r1 + 0), r2)274; CHECK-NEXT: exit275entry:276 %0 = atomicrmw or ptr %i, i64 10 monotonic, align 8277 %1 = atomicrmw or ptr %i, i64 10 acquire, align 8278 %2 = atomicrmw or ptr %i, i64 10 release, align 8279 %3 = atomicrmw or ptr %i, i64 10 acq_rel, align 8280 %4 = atomicrmw or ptr %i, i64 10 seq_cst, align 8281 ret void282}283 284; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)285define dso_local i64 @test_fetch_or_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {286; CHECK-LABEL: test_fetch_or_64_ret:287; CHECK: .Ltest_fetch_or_64_ret$local:288; CHECK-NEXT: .type .Ltest_fetch_or_64_ret$local,@function289; CHECK-NEXT: # %bb.0: # %entry290; CHECK-NEXT: r2 = 10291; CHECK-NEXT: r3 = 10292; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)293; CHECK-NEXT: r0 = 10294; CHECK-NEXT: r0 = atomic_fetch_or((u64 *)(r1 + 0), r0)295; CHECK-NEXT: r0 += r3296; CHECK-NEXT: r3 = 10297; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)298; CHECK-NEXT: r0 += r3299; CHECK-NEXT: r3 = 10300; CHECK-NEXT: r3 = atomic_fetch_or((u64 *)(r1 + 0), r3)301; CHECK-NEXT: r0 += r3302; CHECK-NEXT: r2 = atomic_fetch_or((u64 *)(r1 + 0), r2)303; CHECK-NEXT: r0 += r2304; CHECK-NEXT: exit305entry:306 %0 = atomicrmw or ptr %i, i64 10 monotonic, align 8307 %1 = atomicrmw or ptr %i, i64 10 acquire, align 8308 %add = add nsw i64 %1, %0309 %2 = atomicrmw or ptr %i, i64 10 release, align 8310 %add5 = add nsw i64 %add, %2311 %3 = atomicrmw or ptr %i, i64 10 acq_rel, align 8312 %add8 = add nsw i64 %add5, %3313 %4 = atomicrmw or ptr %i, i64 10 seq_cst, align 8314 %add11 = add nsw i64 %add8, %4315 ret i64 %add11316}317 318; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)319define dso_local void @test_fetch_xor_64_noret(ptr nocapture noundef %i) local_unnamed_addr #0 {320; CHECK-LABEL: test_fetch_xor_64_noret:321; CHECK: .Ltest_fetch_xor_64_noret$local:322; CHECK-NEXT: .type .Ltest_fetch_xor_64_noret$local,@function323; CHECK-NEXT: # %bb.0: # %entry324; CHECK-NEXT: r2 = 10325; CHECK-NEXT: r3 = 10326; CHECK-NEXT: lock *(u64 *)(r1 + 0) ^= r3327; CHECK-NEXT: r3 = 10328; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)329; CHECK-NEXT: r3 = 10330; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)331; CHECK-NEXT: r3 = 10332; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)333; CHECK-NEXT: r2 = atomic_fetch_xor((u64 *)(r1 + 0), r2)334; CHECK-NEXT: exit335entry:336 %0 = atomicrmw xor ptr %i, i64 10 monotonic, align 8337 %1 = atomicrmw xor ptr %i, i64 10 acquire, align 8338 %2 = atomicrmw xor ptr %i, i64 10 release, align 8339 %3 = atomicrmw xor ptr %i, i64 10 acq_rel, align 8340 %4 = atomicrmw xor ptr %i, i64 10 seq_cst, align 8341 ret void342}343 344; Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)345define dso_local i64 @test_fetch_xor_64_ret(ptr nocapture noundef %i) local_unnamed_addr #0 {346; CHECK-LABEL: test_fetch_xor_64_ret:347; CHECK: .Ltest_fetch_xor_64_ret$local:348; CHECK-NEXT: .type .Ltest_fetch_xor_64_ret$local,@function349; CHECK-NEXT: # %bb.0: # %entry350; CHECK-NEXT: r2 = 10351; CHECK-NEXT: r3 = 10352; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)353; CHECK-NEXT: r0 = 10354; CHECK-NEXT: r0 = atomic_fetch_xor((u64 *)(r1 + 0), r0)355; CHECK-NEXT: r0 += r3356; CHECK-NEXT: r3 = 10357; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)358; CHECK-NEXT: r0 += r3359; CHECK-NEXT: r3 = 10360; CHECK-NEXT: r3 = atomic_fetch_xor((u64 *)(r1 + 0), r3)361; CHECK-NEXT: r0 += r3362; CHECK-NEXT: r2 = atomic_fetch_xor((u64 *)(r1 + 0), r2)363; CHECK-NEXT: r0 += r2364; CHECK-NEXT: exit365entry:366 %0 = atomicrmw xor ptr %i, i64 10 monotonic, align 8367 %1 = atomicrmw xor ptr %i, i64 10 acquire, align 8368 %add = add nsw i64 %1, %0369 %2 = atomicrmw xor ptr %i, i64 10 release, align 8370 %add5 = add nsw i64 %add, %2371 %3 = atomicrmw xor ptr %i, i64 10 acq_rel, align 8372 %add8 = add nsw i64 %add5, %3373 %4 = atomicrmw xor ptr %i, i64 10 seq_cst, align 8374 %add11 = add nsw i64 %add8, %4375 ret i64 %add11376}377 378attributes #0 = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="v1" }379 380!llvm.module.flags = !{!0, !1}381!llvm.ident = !{!2}382 383!0 = !{i32 1, !"wchar_size", i32 4}384!1 = !{i32 7, !"frame-pointer", i32 2}385!2 = !{!"clang version 20.0.0git (git@github.com:yonghong-song/llvm-project.git 6f71e34e194dab5a52cb2211af575c6067e9e504)"}386