blob: 1d950711be26cd34f45e2d25481c054a9f2f5b49 [file] [log] [blame]
David Neto482550a2018-03-24 05:21:07 -07001// Copyright 2018 The Clspv Authors. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// This translation unit defines all Clspv command line option variables.
16
Diego Novilloa4c44fa2019-04-11 10:56:15 -040017#include "llvm/PassRegistry.h"
David Neto118188e2018-08-24 11:27:54 -040018#include "llvm/Support/CommandLine.h"
David Neto482550a2018-03-24 05:21:07 -070019
Diego Novilloa4c44fa2019-04-11 10:56:15 -040020#include "Passes.h"
21
David Neto482550a2018-03-24 05:21:07 -070022namespace {
David Neto862b7d82018-06-14 18:48:37 -040023
Alan Bakeraf289ab2018-08-29 11:26:44 -040024llvm::cl::opt<bool>
25 inline_entry_points("inline-entry-points", llvm::cl::init(false),
26 llvm::cl::desc("Exhaustively inline entry points."));
27
Alan Baker0dd3fd22018-08-24 11:03:12 -040028llvm::cl::opt<bool> no_inline_single_call_site(
29 "no-inline-single", llvm::cl::init(false),
30 llvm::cl::desc("Disable inlining functions with single call sites."));
31
David Netoc5fb5242018-07-30 13:28:31 -040032// Should the compiler try to use direct resource accesses within helper
David Neto862b7d82018-06-14 18:48:37 -040033// functions instead of passing pointers via function arguments?
David Netoc5fb5242018-07-30 13:28:31 -040034llvm::cl::opt<bool> no_direct_resource_access(
35 "no-dra", llvm::cl::init(false),
David Neto862b7d82018-06-14 18:48:37 -040036 llvm::cl::desc(
David Netoc5fb5242018-07-30 13:28:31 -040037 "No Direct Resource Access: Avoid rewriting helper functions "
38 "to access resources directly instead of by pointers "
39 "in function arguments. Affects kernel arguments of type "
40 "pointer-to-global, pointer-to-constant, image, and sampler."));
David Neto862b7d82018-06-14 18:48:37 -040041
Alan Bakerfc6888e2018-08-20 20:54:33 -040042llvm::cl::opt<bool> no_share_module_scope_variables(
43 "no-smsv", llvm::cl::init(false),
44 llvm::cl::desc("No Share Module Scope Variables: Avoid de-duplicating "
45 "module scope variables."));
46
David Neto482550a2018-03-24 05:21:07 -070047// By default, reuse the same descriptor set number for all arguments.
48// To turn that off, use -distinct-kernel-descriptor-sets
49llvm::cl::opt<bool> distinct_kernel_descriptor_sets(
50 "distinct-kernel-descriptor-sets", llvm::cl::init(false),
Alan Bakerfc6888e2018-08-20 20:54:33 -040051 llvm::cl::desc("Each kernel uses its own descriptor set for its arguments. "
52 "Turns off direct-resource-access optimizations."));
David Neto482550a2018-03-24 05:21:07 -070053
54// TODO(dneto): As per Neil Henning suggestion, might not need this if
55// you can trace the pointer back far enough to see that it's 32-bit
56// aligned. However, even in the vstore_half case, you'll probably get
57// better performance if you can rely on SPV_KHR_16bit_storage since in
58// the alternate case you're using a (relaxed) atomic, and therefore
59// have to write through to the cache.
60llvm::cl::opt<bool> f16bit_storage(
61 "f16bit_storage", llvm::cl::init(false),
62 llvm::cl::desc("Assume the target supports SPV_KHR_16bit_storage"));
63
David Netob6e2e062018-04-25 10:32:06 -040064llvm::cl::opt<bool> hack_initializers(
65 "hack-initializers", llvm::cl::init(false),
66 llvm::cl::desc(
67 "At the start of each kernel, explicitly write the initializer "
68 "value for a compiler-generated variable containing the workgroup "
69 "size. Required by some drivers to make the get_global_size builtin "
70 "function work when used with non-constant dimension index."));
71
David Neto862b7d82018-06-14 18:48:37 -040072llvm::cl::opt<bool> hack_dis(
73 "hack-dis", llvm::cl::init(false),
Alan Bakerfc6888e2018-08-20 20:54:33 -040074 llvm::cl::desc("Force use of a distinct image or sampler variable for each "
75 "image or sampler kernel argument. This prevents sharing "
76 "of resource variables."));
David Neto862b7d82018-06-14 18:48:37 -040077
David Neto482550a2018-03-24 05:21:07 -070078llvm::cl::opt<bool> hack_inserts(
79 "hack-inserts", llvm::cl::init(false),
80 llvm::cl::desc(
81 "Avoid all single-index OpCompositInsert instructions "
82 "into struct types by using complete composite construction and "
83 "extractions"));
84
David Neto3a0df832018-08-03 14:35:42 -040085llvm::cl::opt<bool> hack_signed_compare_fixup(
86 "hack-scf", llvm::cl::init(false),
87 llvm::cl::desc("Rewrite signed integer comparisons to use other kinds of "
88 "instructions"));
89
David Neto482550a2018-03-24 05:21:07 -070090// Some drivers don't like to see constant composite values constructed
91// from scalar Undef values. Replace numeric scalar and vector Undef with
92// corresponding OpConstantNull. We need to keep Undef for image values,
93// for example. In the LLVM domain, image values are passed as pointer to
94// struct.
95// See https://github.com/google/clspv/issues/95
96llvm::cl::opt<bool> hack_undef(
97 "hack-undef", llvm::cl::init(false),
98 llvm::cl::desc("Use OpConstantNull instead of OpUndef for floating point, "
99 "integer, or vectors of them"));
100
Alan Baker33376ea2018-08-30 12:02:31 -0400101llvm::cl::opt<bool> hack_phis(
102 "hack-phis", llvm::cl::init(false),
103 llvm::cl::desc(
104 "Scalarize phi instructions of struct type before code generation"));
105
alan-baker3fa76d92018-11-12 14:54:40 -0500106llvm::cl::opt<bool> hack_block_order(
107 "hack-block-order", llvm::cl::init(false),
108 llvm::cl::desc("Order basic blocks using structured order"));
109
David Neto482550a2018-03-24 05:21:07 -0700110llvm::cl::opt<bool>
111 pod_ubo("pod-ubo", llvm::cl::init(false),
112 llvm::cl::desc("POD kernel arguments are in uniform buffers"));
113
David Neto85082642018-03-24 06:55:20 -0700114llvm::cl::opt<bool> module_constants_in_storage_buffer(
115 "module-constants-in-storage-buffer", llvm::cl::init(false),
116 llvm::cl::desc(
117 "Module-scope __constants are collected into a single storage buffer. "
118 "The binding and initialization data are reported in the descriptor "
119 "map."));
120
David Neto482550a2018-03-24 05:21:07 -0700121llvm::cl::opt<bool> show_ids("show-ids", llvm::cl::init(false),
122 llvm::cl::desc("Show SPIR-V IDs for functions"));
123
Alan Bakerfcda9482018-10-02 17:09:59 -0400124llvm::cl::opt<bool> constant_args_in_uniform_buffer(
125 "constant-args-ubo", llvm::cl::init(false),
126 llvm::cl::desc("Put pointer-to-constant kernel args in UBOs."));
127
alan-baker3d9e2012019-01-11 14:55:30 -0500128// Default to 64kB.
129llvm::cl::opt<int> maximum_ubo_size(
130 "max-ubo-size", llvm::cl::init(64 << 10),
131 llvm::cl::desc("Specify the maximum UBO array size in bytes."));
132
133llvm::cl::opt<bool> relaxed_ubo_layout(
134 "relaxed-ubo-layout",
135 llvm::cl::desc("Allow UBO layouts, that do not satisfy the restriction "
136 "that ArrayStride is a multiple of array alignment. This "
137 "does not generate valid SPIR-V for the Vulkan environment; "
138 "however, some drivers may accept it."));
139
alan-bakera3e02382019-02-15 08:27:27 -0500140llvm::cl::opt<bool> std430_ubo_layout(
alan-baker4217b322019-03-06 08:56:12 -0500141 "std430-ubo-layout", llvm::cl::init(false),
alan-bakera3e02382019-02-15 08:27:27 -0500142 llvm::cl::desc("Allow UBO layouts that conform to std430 (SSBO) layout "
143 "requirements. This does not generate valid SPIR-V for the "
144 "Vulkan environment; however, some drivers may accept it."));
145
alan-baker4217b322019-03-06 08:56:12 -0500146llvm::cl::opt<bool> keep_unused_arguments(
147 "keep-unused-arguments", llvm::cl::init(false),
148 llvm::cl::desc("Do not remove unused non-kernel function arguments."));
149
alan-bakerace4e592019-04-09 08:43:22 -0400150llvm::cl::opt<bool> int8_support("int8", llvm::cl::init(true),
alan-bakerb39c8262019-03-08 14:03:37 -0500151 llvm::cl::desc("Allow 8-bit integers"));
152
Kévin Petit0fc88042019-04-09 23:25:02 +0100153static llvm::cl::opt<bool>
154 cplusplus("c++", llvm::cl::init(false),
Diego Novillo3cc8d7a2019-04-10 13:30:34 -0400155 llvm::cl::desc("Enable experimental C++ support"));
Kévin Petita624c0c2019-05-07 20:27:43 +0800156
157static llvm::cl::opt<bool> images("images", llvm::cl::init(true),
158 llvm::cl::desc("Enable support for images"));
alan-baker09cb9802019-12-10 13:16:27 -0500159
160static bool use_sampler_map = false;
David Neto482550a2018-03-24 05:21:07 -0700161} // namespace
162
163namespace clspv {
164namespace Option {
165
Alan Bakeraf289ab2018-08-29 11:26:44 -0400166bool InlineEntryPoints() { return inline_entry_points; }
Alan Baker0dd3fd22018-08-24 11:03:12 -0400167bool InlineSingleCallSite() { return !no_inline_single_call_site; }
David Netoc5fb5242018-07-30 13:28:31 -0400168bool DirectResourceAccess() {
169 return !(no_direct_resource_access || distinct_kernel_descriptor_sets);
170}
Alan Bakerfc6888e2018-08-20 20:54:33 -0400171bool ShareModuleScopeVariables() { return !no_share_module_scope_variables; }
David Neto482550a2018-03-24 05:21:07 -0700172bool DistinctKernelDescriptorSets() { return distinct_kernel_descriptor_sets; }
173bool F16BitStorage() { return f16bit_storage; }
David Neto862b7d82018-06-14 18:48:37 -0400174bool HackDistinctImageSampler() { return hack_dis; }
David Netob6e2e062018-04-25 10:32:06 -0400175bool HackInitializers() { return hack_initializers; }
David Neto482550a2018-03-24 05:21:07 -0700176bool HackInserts() { return hack_inserts; }
David Neto3a0df832018-08-03 14:35:42 -0400177bool HackSignedCompareFixup() { return hack_signed_compare_fixup; }
David Neto482550a2018-03-24 05:21:07 -0700178bool HackUndef() { return hack_undef; }
Alan Baker33376ea2018-08-30 12:02:31 -0400179bool HackPhis() { return hack_phis; }
alan-baker3fa76d92018-11-12 14:54:40 -0500180bool HackBlockOrder() { return hack_block_order; }
Alan Bakerfc6888e2018-08-20 20:54:33 -0400181bool ModuleConstantsInStorageBuffer() {
182 return module_constants_in_storage_buffer;
183}
David Neto482550a2018-03-24 05:21:07 -0700184bool PodArgsInUniformBuffer() { return pod_ubo; }
185bool ShowIDs() { return show_ids; }
alan-baker3fa76d92018-11-12 14:54:40 -0500186bool ConstantArgsInUniformBuffer() { return constant_args_in_uniform_buffer; }
alan-baker3d9e2012019-01-11 14:55:30 -0500187uint64_t MaxUniformBufferSize() { return maximum_ubo_size; }
188bool RelaxedUniformBufferLayout() { return relaxed_ubo_layout; }
alan-bakera3e02382019-02-15 08:27:27 -0500189bool Std430UniformBufferLayout() { return std430_ubo_layout; }
alan-baker4217b322019-03-06 08:56:12 -0500190bool KeepUnusedArguments() { return keep_unused_arguments; }
alan-bakerb39c8262019-03-08 14:03:37 -0500191bool Int8Support() { return int8_support; }
Kévin Petit0fc88042019-04-09 23:25:02 +0100192bool CPlusPlus() { return cplusplus; }
Kévin Petita624c0c2019-05-07 20:27:43 +0800193bool ImageSupport() { return images; }
alan-baker09cb9802019-12-10 13:16:27 -0500194bool UseSamplerMap() { return use_sampler_map; }
195void SetUseSamplerMap(bool use) { use_sampler_map = use; }
David Neto482550a2018-03-24 05:21:07 -0700196
197} // namespace Option
198} // namespace clspv