amd/llvm,aco: Replace VLA with alloca

MSVC will never support VLA, so use alloca instead.

Reviewed-by: Tony Wasserka <tony.wasserka@gmx.de>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7157>
This commit is contained in:
James Park 2020-08-10 21:00:51 -07:00 committed by Marge Bot
parent e3515590bf
commit 4bd18e772a
6 changed files with 18 additions and 18 deletions

View File

@ -2964,7 +2964,7 @@ void emit_load(isel_context *ctx, Builder &bld, const LoadEmitInfo &info,
unsigned component_size = info.component_size;
unsigned num_vals = 0;
Temp vals[info.dst.bytes()];
Temp *const vals = (Temp *)alloca(info.dst.bytes() * sizeof(Temp));
unsigned const_offset = info.const_offset;
@ -3121,7 +3121,7 @@ void emit_load(isel_context *ctx, Builder &bld, const LoadEmitInfo &info,
std::array<Temp, NIR_MAX_VEC_COMPONENTS> allocated_vec;
bool has_vgprs = false;
for (unsigned i = 0; i < num_vals;) {
Temp tmp[num_vals];
Temp *const tmp = (Temp *)alloca(num_vals * sizeof(Temp));
unsigned num_tmps = 0;
unsigned tmp_size = 0;
RegType reg_type = RegType::sgpr;
@ -4614,7 +4614,7 @@ void visit_load_input(isel_context *ctx, nir_intrinsic_instr *instr)
get_arg(ctx, ctx->args->ac.vertex_id));
}
Temp channels[num_channels];
Temp *const channels = (Temp *)alloca(num_channels * sizeof(Temp));
unsigned channel_start = 0;
bool direct_fetch = false;
@ -8880,7 +8880,7 @@ void visit_tex(isel_context *ctx, nir_tex_instr *instr)
if (tg4_integer_cube_workaround) {
// see comment in ac_nir_to_llvm.c's lower_gather4_integer()
Temp desc[resource.size()];
Temp *const desc = (Temp *)alloca(resource.size() * sizeof(Temp));
aco_ptr<Instruction> split{create_instruction<Pseudo_instruction>(aco_opcode::p_split_vector,
Format::PSEUDO, 1, resource.size())};
split->operands[0] = Operand(resource);
@ -9210,7 +9210,7 @@ void visit_phi(isel_context *ctx, nir_phi_instr *instr)
std::vector<unsigned>& preds = logical ? ctx->block->logical_preds : ctx->block->linear_preds;
unsigned num_operands = 0;
Operand operands[std::max(exec_list_length(&instr->srcs), (unsigned)preds.size()) + 1];
Operand *const operands = (Operand *)alloca((std::max(exec_list_length(&instr->srcs), (unsigned)preds.size()) + 1) * sizeof(Operand));
unsigned num_defined = 0;
unsigned cur_pred_idx = 0;
for (std::pair<unsigned, nir_ssa_def *> src : phi_src) {
@ -9662,7 +9662,7 @@ static void visit_loop(isel_context *ctx, nir_loop *loop)
* merge block would get CSE'd */
if (nir_loop_last_block(loop)->successors[0] != nir_loop_first_block(loop)) {
unsigned num_vals = ctx->cf_info.has_branch ? 1 : (ctx->block->index - loop_header_idx + 1);
Operand vals[num_vals];
Operand *const vals = (Operand *)alloca(num_vals * sizeof(Operand));
for (aco_ptr<Instruction>& instr : ctx->program->blocks[loop_header_idx].instructions) {
if (instr->opcode == aco_opcode::p_linear_phi) {
if (ctx->cf_info.has_branch)

View File

@ -79,7 +79,7 @@ Operand get_ssa(Program *program, unsigned block_idx, ssa_state *state, bool bef
Temp res = Temp(program->allocateTmp(program->lane_mask));
state->latest[block_idx] = Operand(res);
Operand ops[pred];
Operand *const ops = (Operand *)alloca(pred * sizeof(Operand));
for (unsigned i = 0; i < pred; i++)
ops[i] = get_ssa(program, block.linear_preds[i], state, false);

View File

@ -678,10 +678,10 @@ void aco_print_instr(const Instruction *instr, FILE *output)
}
fprintf(output, "%s", instr_info.name[(int)instr->opcode]);
if (instr->operands.size()) {
bool abs[instr->operands.size()];
bool neg[instr->operands.size()];
bool opsel[instr->operands.size()];
uint8_t sel[instr->operands.size()];
bool *const abs = (bool *)alloca(instr->operands.size() * sizeof(bool));
bool *const neg = (bool *)alloca(instr->operands.size() * sizeof(bool));
bool *const opsel = (bool *)alloca(instr->operands.size() * sizeof(bool));
uint8_t *const sel = (uint8_t *)alloca(instr->operands.size() * sizeof(uint8_t));
if ((int)instr->format & (int)Format::VOP3A) {
const VOP3A_instruction* vop3 = static_cast<const VOP3A_instruction*>(instr);
for (unsigned i = 0; i < instr->operands.size(); ++i) {

View File

@ -1614,7 +1614,7 @@ Temp handle_live_in(ra_ctx& ctx, Temp val, Block* block)
new_val = read_variable(ctx, val, preds[0]);
} else {
/* there are multiple predecessors and the block is sealed */
Temp ops[preds.size()];
Temp *const ops = (Temp *)alloca(preds.size() * sizeof(Temp));
/* get the rename from each predecessor and check if they are the same */
bool needs_phi = false;

View File

@ -572,7 +572,7 @@ static LLVMValueRef ac_build_expand(struct ac_llvm_context *ctx, LLVMValueRef va
unsigned src_channels, unsigned dst_channels)
{
LLVMTypeRef elemtype;
LLVMValueRef chan[dst_channels];
LLVMValueRef *const chan = alloca(dst_channels * sizeof(LLVMValueRef));
if (LLVMGetTypeKind(LLVMTypeOf(value)) == LLVMVectorTypeKind) {
unsigned vec_size = LLVMGetVectorSize(LLVMTypeOf(value));
@ -605,7 +605,7 @@ static LLVMValueRef ac_build_expand(struct ac_llvm_context *ctx, LLVMValueRef va
LLVMValueRef ac_extract_components(struct ac_llvm_context *ctx, LLVMValueRef value, unsigned start,
unsigned channels)
{
LLVMValueRef chan[channels];
LLVMValueRef *const chan = alloca(channels * sizeof(LLVMValueRef));
for (unsigned i = 0; i < channels; i++)
chan[i] = ac_llvm_extract_elem(ctx, value, i + start);
@ -3216,7 +3216,7 @@ LLVMValueRef ac_trim_vector(struct ac_llvm_context *ctx, LLVMValueRef value, uns
if (count == num_components)
return value;
LLVMValueRef masks[MAX2(count, 2)];
LLVMValueRef *const masks = alloca(MAX2(count, 2) * sizeof(LLVMValueRef));
masks[0] = ctx->i32_0;
masks[1] = ctx->i32_1;
for (unsigned i = 2; i < count; i++)

View File

@ -1523,7 +1523,7 @@ static LLVMValueRef visit_load_push_constant(struct ac_nir_context *ctx, nir_int
unsigned num_inline_push_consts = ctx->args->num_inline_push_consts;
if (offset + count <= num_inline_push_consts) {
LLVMValueRef push_constants[num_inline_push_consts];
LLVMValueRef *const push_constants = alloca(num_inline_push_consts * sizeof(LLVMValueRef));
for (unsigned i = 0; i < num_inline_push_consts; i++)
push_constants[i] = ac_get_arg(&ctx->ac, ctx->args->inline_push_consts[i]);
return ac_build_gather_values(&ctx->ac, push_constants + offset, count);
@ -2118,7 +2118,7 @@ static LLVMValueRef visit_load_ubo_buffer(struct ac_nir_context *ctx, nir_intrin
if (instr->dest.ssa.bit_size == 16 || instr->dest.ssa.bit_size == 8) {
unsigned load_bytes = instr->dest.ssa.bit_size / 8;
LLVMValueRef results[num_components];
LLVMValueRef *const results = alloca(num_components * sizeof(LLVMValueRef));
for (unsigned i = 0; i < num_components; ++i) {
LLVMValueRef immoffset = LLVMConstInt(ctx->ac.i32, load_bytes * i, 0);
@ -4491,7 +4491,7 @@ static LLVMTypeRef glsl_to_llvm_type(struct ac_llvm_context *ac, const struct gl
assert(glsl_type_is_struct_or_ifc(type));
LLVMTypeRef member_types[glsl_get_length(type)];
LLVMTypeRef *const member_types = alloca(glsl_get_length(type) * sizeof(LLVMTypeRef));
for (unsigned i = 0; i < glsl_get_length(type); i++) {
member_types[i] = glsl_to_llvm_type(ac, glsl_get_struct_field(type, i));