| ; 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 | |
| } |