On 11/15/20 6:04 AM, J.W. Jagersma via Gcc-patches wrote:
> On 2020-11-13 09:41, Richard Biener wrote:
>> On Thu, Mar 12, 2020 at 1:41 AM J.W. Jagersma via Gcc-patches
>> <gcc-patches@gcc.gnu.org> wrote:
>>> diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
>>> index 2a409dcaffe..58b16aa763a 100644
>>> --- a/gcc/tree-eh.c
>>> +++ b/gcc/tree-eh.c
>>> @@ -2077,6 +2077,8 @@ lower_eh_constructs_2 (struct leh_state *state,
>>> gimple_stmt_iterator *gsi)
>>> DECL_GIMPLE_REG_P (tmp) = 1;
>>> gsi_insert_after (gsi, s, GSI_SAME_STMT);
>>> }
>>> +
>>> +record_throwing_stmt:
>>> /* Look for things that can throw exceptions, and record them. */
>>> if (state->cur_region && stmt_could_throw_p (cfun, stmt))
>>> {
>>> @@ -2085,6 +2087,36 @@ lower_eh_constructs_2 (struct leh_state *state,
>>> gimple_stmt_iterator *gsi)
>>> }
>>> break;
>>>
>>> + case GIMPLE_ASM:
>>> + {
>>> + /* As above with GIMPLE_ASSIGN. Change each register output operand
>>> + to a temporary and insert a new stmt to assign this to the
>>> original
>>> + operand. */
>>> + gasm *asm_stmt = as_a <gasm *> (stmt);
>>> + if (stmt_could_throw_p (cfun, stmt)
>>> + && gimple_asm_noutputs (asm_stmt) > 0
>>> + && gimple_stmt_may_fallthru (stmt))
>>> + {
>>> + for (unsigned i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
>>> + {
>>> + tree op = gimple_asm_output_op (asm_stmt, i);
>>> + tree opval = TREE_VALUE (op);
>>> + if (tree_could_throw_p (opval)
>>> + || !is_gimple_reg_type (TREE_TYPE (opval))
>>> + || !is_gimple_reg (get_base_address (opval)))
>>> + continue;
>>> +
>>> + tree tmp = create_tmp_reg (TREE_TYPE (opval));
>>> + gimple *s = gimple_build_assign (opval, tmp);
>>> + gimple_set_location (s, gimple_location (stmt));
>>> + gimple_set_block (s, gimple_block (stmt));
>>> + TREE_VALUE (op) = tmp;
>>> + gsi_insert_after (gsi, s, GSI_SAME_STMT);
>>> + }
>>> + }
>>> + }
>>> + goto record_throwing_stmt;
>> Can you avoid the ugly goto by simply duplicating the common code please?
>>
>> Otherwise OK.
>>
>> As you say volatile asms are already considered throwing in some pieces of
>> code so this is a step towards fulfilling that promise.
>>
>> Thanks,
>> Richard.
>>
> Hi Richard,
>
> Thanks for your feedback. I'll have to check again if I made any other
> changes since this. If not, and if there are no further objections, I will
> resubmit this patch soon with this goto removed.
Sounds good. I'll keep an eye out for it. I think we'll want to look
at the doc text one more time too to make sure it matches the semantics
we can actually guarantee.
Jeff