; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc < %s --mtriple=wasm32 | FileCheck %s --check-prefixes=NO-ATOMICS ; RUN: llc < %s --mtriple=wasm32 -mattr=+atomics | FileCheck %s --check-prefixes=ATOMICS ; RUN: llc < %s --mtriple=wasm32 -mattr=+atomics,+relaxed-atomics | FileCheck %s --check-prefixes=RELAXED32 ; RUN: llc < %s --mtriple=wasm64 -mattr=+atomics,+relaxed-atomics | FileCheck %s --check-prefixes=RELAXED64 ; A multithread fence is lowered to an atomic.fence instruction. define void @fence_acquire() { ; NO-ATOMICS-LABEL: fence_acquire: ; NO-ATOMICS: .functype fence_acquire () -> () ; NO-ATOMICS-NEXT: # %bb.0: ; NO-ATOMICS-NEXT: # fallthrough-return ; ; ATOMICS-LABEL: fence_acquire: ; ATOMICS: .functype fence_acquire () -> () ; ATOMICS-NEXT: # %bb.0: ; ATOMICS-NEXT: atomic.fence ; ATOMICS-NEXT: # fallthrough-return ; ; RELAXED32-LABEL: fence_acquire: ; RELAXED32: .functype fence_acquire () -> () ; RELAXED32-NEXT: # %bb.0: ; RELAXED32-NEXT: atomic.fence acqrel ; RELAXED32-NEXT: # fallthrough-return ; ; RELAXED64-LABEL: fence_acquire: ; RELAXED64: .functype fence_acquire () -> () ; RELAXED64-NEXT: # %bb.0: ; RELAXED64-NEXT: atomic.fence acqrel ; RELAXED64-NEXT: # fallthrough-return fence acquire ret void } define void @fence_release() { ; NO-ATOMICS-LABEL: fence_release: ; NO-ATOMICS: .functype fence_release () -> () ; NO-ATOMICS-NEXT: # %bb.0: ; NO-ATOMICS-NEXT: # fallthrough-return ; ; ATOMICS-LABEL: fence_release: ; ATOMICS: .functype fence_release () -> () ; ATOMICS-NEXT: # %bb.0: ; ATOMICS-NEXT: atomic.fence ; ATOMICS-NEXT: # fallthrough-return ; ; RELAXED32-LABEL: fence_release: ; RELAXED32: .functype fence_release () -> () ; RELAXED32-NEXT: # %bb.0: ; RELAXED32-NEXT: atomic.fence acqrel ; RELAXED32-NEXT: # fallthrough-return ; ; RELAXED64-LABEL: fence_release: ; RELAXED64: .functype fence_release () -> () ; RELAXED64-NEXT: # %bb.0: ; RELAXED64-NEXT: atomic.fence acqrel ; RELAXED64-NEXT: # fallthrough-return fence release ret void } define void @fence_acq_rel() { ; NO-ATOMICS-LABEL: fence_acq_rel: ; NO-ATOMICS: .functype fence_acq_rel () -> () ; NO-ATOMICS-NEXT: # %bb.0: ; NO-ATOMICS-NEXT: # fallthrough-return ; ; ATOMICS-LABEL: fence_acq_rel: ; ATOMICS: .functype fence_acq_rel () -> () ; ATOMICS-NEXT: # %bb.0: ; ATOMICS-NEXT: atomic.fence ; ATOMICS-NEXT: # fallthrough-return ; ; RELAXED32-LABEL: fence_acq_rel: ; RELAXED32: .functype fence_acq_rel () -> () ; RELAXED32-NEXT: # %bb.0: ; RELAXED32-NEXT: atomic.fence acqrel ; RELAXED32-NEXT: # fallthrough-return ; ; RELAXED64-LABEL: fence_acq_rel: ; RELAXED64: .functype fence_acq_rel () -> () ; RELAXED64-NEXT: # %bb.0: ; RELAXED64-NEXT: atomic.fence acqrel ; RELAXED64-NEXT: # fallthrough-return fence acq_rel ret void } define void @fence_seq_cst() { ; NO-ATOMICS-LABEL: fence_seq_cst: ; NO-ATOMICS: .functype fence_seq_cst () -> () ; NO-ATOMICS-NEXT: # %bb.0: ; NO-ATOMICS-NEXT: # fallthrough-return ; ; ATOMICS-LABEL: fence_seq_cst: ; ATOMICS: .functype fence_seq_cst () -> () ; ATOMICS-NEXT: # %bb.0: ; ATOMICS-NEXT: atomic.fence ; ATOMICS-NEXT: # fallthrough-return ; ; RELAXED32-LABEL: fence_seq_cst: ; RELAXED32: .functype fence_seq_cst () -> () ; RELAXED32-NEXT: # %bb.0: ; RELAXED32-NEXT: atomic.fence seqcst ; RELAXED32-NEXT: # fallthrough-return ; ; RELAXED64-LABEL: fence_seq_cst: ; RELAXED64: .functype fence_seq_cst () -> () ; RELAXED64-NEXT: # %bb.0: ; RELAXED64-NEXT: atomic.fence seqcst ; RELAXED64-NEXT: # fallthrough-return fence seq_cst ret void } ; A singlethread fence becomes compiler_fence instruction, a pseudo instruction ; that acts as a compiler barrier. The barrier should not be emitted to .s file. define void @singlethread_fence() { ; NO-ATOMICS-LABEL: singlethread_fence: ; NO-ATOMICS: .functype singlethread_fence () -> () ; NO-ATOMICS-NEXT: # %bb.0: ; NO-ATOMICS-NEXT: # fallthrough-return ; ; ATOMICS-LABEL: singlethread_fence: ; ATOMICS: .functype singlethread_fence () -> () ; ATOMICS-NEXT: # %bb.0: ; ATOMICS-NEXT: # fallthrough-return ; ; RELAXED32-LABEL: singlethread_fence: ; RELAXED32: .functype singlethread_fence () -> () ; RELAXED32-NEXT: # %bb.0: ; RELAXED32-NEXT: # fallthrough-return ; ; RELAXED64-LABEL: singlethread_fence: ; RELAXED64: .functype singlethread_fence () -> () ; RELAXED64-NEXT: # %bb.0: ; RELAXED64-NEXT: # fallthrough-return fence syncscope("singlethread") seq_cst fence syncscope("singlethread") acquire fence syncscope("singlethread") release fence syncscope("singlethread") acq_rel ret void }