# For manual usage, not as a part of lit tests. Used for generating fence.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-sm_${sm} && ptxas-isa-${ptxfp} %{ llc < %s -march=nvptx64 -mcpu=sm_${sm} -mattr=+ptx${ptx} | %ptxas-verify -arch=sm_${sm} %}""" ) # (sm, ptx) TESTS = [(30, 50), (70, 60), (90, 87)] LLVM_SCOPES = ["singlethread", "", "block", "cluster", "device"] SCOPE_LLVM_TO_PTX = { "singlethread": "thread", "": "sys", "block": "cta", "cluster": "cluster", "device": "gpu", } ORDERINGS = ["acquire", "release", "acq_rel", "seq_cst"] if __name__ == "__main__": with open("fence.ll", "w") as fp: for sm, ptx in TESTS: print(run_statement.substitute(sm=sm, ptx=ptx, ptxfp=ptx / 10.0), file=fp) print( "; NOTE: Please do not modify this file manually- instead modify fence.py", file=fp, ) for ordering, llvm_scope in product(ORDERINGS, LLVM_SCOPES): print( fence_func.substitute( llvm_scope=llvm_scope, ptx_scope=SCOPE_LLVM_TO_PTX[llvm_scope], ordering=ordering, ), file=fp, )