@@ -1383,9 +1383,16 @@ static void ir_load_local_addr(ir_ctx *ctx, ir_reg reg, ir_ref src)
13831383 ir_backend_data *data = ctx->data;
13841384 dasm_State **Dst = &data->dasm_state;
13851385 ir_reg base = (ctx->flags & IR_USE_FRAME_POINTER) ? IR_REG_FRAME_POINTER : IR_REG_STACK_POINTER;
1386- int32_t offset = IR_SPILL_POS_TO_OFFSET(ctx->ir_base[src].op3);
1386+ ir_insn *var_insn;
1387+ int32_t offset;
13871388
13881389 IR_ASSERT(ir_rule(ctx, src) == IR_STATIC_ALLOCA);
1390+ var_insn = &ctx->ir_base[src];
1391+ if (var_insn->op == IR_VADDR) {
1392+ var_insn = &ctx->ir_base[var_insn->op1];
1393+ }
1394+ IR_ASSERT(var_insn->op == IR_VAR || var_insn->op == IR_ALLOCA);
1395+ offset = IR_SPILL_POS_TO_OFFSET(var_insn->op3);
13891396 if (aarch64_may_encode_imm12(offset)) {
13901397 | add Rx(reg), Rx(base), #offset
13911398 } else {
@@ -5680,10 +5687,15 @@ static void ir_allocate_unique_spill_slots(ir_ctx *ctx)
56805687 ir_reg reg = ir_get_free_reg(constraints.tmp_regs[n].type, available);
56815688 ir_ref *ops = insn->ops;
56825689 IR_REGSET_EXCL(available, reg);
5683- if (constraints.tmp_regs[n].num > 0
5684- && IR_IS_CONST_REF(ops[constraints.tmp_regs[n].num])) {
5685- /* rematerialization */
5686- reg |= IR_REG_SPILL_LOAD;
5690+ if (constraints.tmp_regs[n].num > 0) {
5691+ if (IR_IS_CONST_REF(ops[constraints.tmp_regs[n].num])) {
5692+ /* rematerialization */
5693+ reg |= IR_REG_SPILL_LOAD;
5694+ } else if (ctx->ir_base[ops[constraints.tmp_regs[n].num]].op == IR_ALLOCA ||
5695+ ctx->ir_base[ops[constraints.tmp_regs[n].num]].op == IR_VADDR) {
5696+ /* local address rematerialization */
5697+ reg |= IR_REG_SPILL_LOAD;
5698+ }
56875699 }
56885700 ctx->regs[i][constraints.tmp_regs[n].num] = reg;
56895701 } else if (constraints.tmp_regs[n].reg == IR_REG_SCRATCH) {
0 commit comments