| # For manual usage, not as a part of lit tests. Used for generating the following tests: |
| # fence-sm30.ll, fence-sm70.ll, fence-sm90.ll |
| |
| from string import Template |
| from itertools import product |
| |
| fence_func = Template( |
| """ |
| define void @fence_${ordering}_${ptx_scope}() { |
| fence syncscope(\"${llvm_scope}\") ${ordering} |
| ret void |
| } |
| """ |
| ) |
| |
| run_statement = Template( |
| """; RUN: llc < %s -march=nvptx64 -mcpu=sm_${sm} -mattr=+ptx${ptx} | FileCheck %s --check-prefix=SM${sm} |
| ; RUN: %if ptxas %{ llc < %s -march=nvptx -mcpu=sm_${sm} -mattr=+ptx${ptx} | %ptxas-verify %}""" |
| ) |
| |
| # (sm, ptx) |
| TESTS = [(30, 50), (70, 60), (90, 87)] |
| |
| LLVM_SCOPES_NO_CLUSTER = ["", "block", "device"] |
| |
| SCOPE_LLVM_TO_PTX = {"": "sys", "block": "cta", "cluster": "cluster", "device": "gpu"} |
| |
| ORDERINGS = ["acquire", "release", "acq_rel", "seq_cst"] |
| |
| if __name__ == "__main__": |
| # non-cluster orderings are supported on SM30, SM70 and SM90 |
| with open("fence-nocluster.ll", "w") as fp: |
| for sm, ptx in TESTS: |
| print(run_statement.substitute(sm=sm, ptx=ptx), file=fp) |
| for ordering, llvm_scope in product(ORDERINGS, LLVM_SCOPES_NO_CLUSTER): |
| print( |
| fence_func.substitute( |
| llvm_scope=llvm_scope, |
| ptx_scope=SCOPE_LLVM_TO_PTX[llvm_scope], |
| ordering=ordering, |
| ), |
| file=fp, |
| ) |
| |
| # cluster ordering only supported on SM90 |
| with open("fence-cluster.ll", "w") as fp: |
| print(run_statement.substitute(sm=90, ptx=87), file=fp) |
| for ordering in ORDERINGS: |
| print( |
| fence_func.substitute( |
| llvm_scope="cluster", |
| ptx_scope=SCOPE_LLVM_TO_PTX["cluster"], |
| ordering=ordering, |
| ), |
| file=fp, |
| ) |