Кажется, вы можете настроить num_ops
только при таком подходе к меньшему значению.
gimple_set_num_ops
- простой установщик, он не выделяет хранилище:
static inline void
gimple_set_num_ops (gimple *gs, unsigned num_ops)
{
gs->num_ops = num_ops;
}
Вам придется создать еще один оператор GIMPLE.
Я думаю, это использование вкодовая база GCC решает ту же проблему, что и у вас (от gcc/gimple.c
):
/* Set the RHS of assignment statement pointed-to by GSI to CODE with
operands OP1, OP2 and OP3.
NOTE: The statement pointed-to by GSI may be reallocated if it
did not have enough operand slots. */
void
gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
tree op1, tree op2, tree op3)
{
unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
gimple *stmt = gsi_stmt (*gsi);
gimple *old_stmt = stmt;
/* If the new CODE needs more operands, allocate a new statement. */
if (gimple_num_ops (stmt) < new_rhs_ops + 1)
{
tree lhs = gimple_assign_lhs (old_stmt);
stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
gimple_init_singleton (stmt);
/* The LHS needs to be reset as this also changes the SSA name
on the LHS. */
gimple_assign_set_lhs (stmt, lhs);
}
gimple_set_num_ops (stmt, new_rhs_ops + 1);
gimple_set_subcode (stmt, code);
gimple_assign_set_rhs1 (stmt, op1);
if (new_rhs_ops > 1)
gimple_assign_set_rhs2 (stmt, op2);
if (new_rhs_ops > 2)
gimple_assign_set_rhs3 (stmt, op3);
if (stmt != old_stmt)
gsi_replace (gsi, stmt, false);
}