On 12/5/23 1:46 AM, Richard Henderson wrote:
> On 05/18/12 03:48, Chung-Lin Tang wrote:
>> @@ -2401,6 +2401,7 @@ scan_trace (dw_trace_info *trace)
>> {
>> /* Propagate across fallthru edges. */
>> dwarf2out_flush_queued_reg_saves ();
>> + def_cfa_1 (&this_cfa);
>> maybe_record_trace_start (insn, NULL);
>> break;
>> }
>> @@ -2455,6 +2456,18 @@ scan_trace (dw_trace_info *trace)
>> cur_cfa = &this_cfa;
>> continue;
>> }
>> + else
>> + {
>> + /* If ELT is a annulled branch-taken instruction (i.e.
>> executed
>> + only when branch is not taken), the args_size and CFA
>> should
>> + not change through the jump. */
>> + create_trace_edges (control);
>> +
>> + /* Update and continue with the trace. */
>> + add_cfi_insn = insn;
>> + scan_insn_after (elt);
>> + continue;
>> + }
>
> I think the def_cfa_1 is misplaced. It should be immediately before
> that last continue. That mirrors the sort of flow you get via the
> other paths through the loop.
Or possibly moved before the dwarf2out_flush_queued_reg_saves () call in
the patch? (in the save_point_p () break case) Note I'm only saying
this based on overall ordering of those two routine calls in the loop.
Attached is a testcase (adapted from libgomp) that, with the SH epilogue
unwind patch applied alone, produces the ICE I'm seeing (-O2
-funwind-tables).
This dwarf2 patch, with any of the three new def_cfa_1() call sites
seems to solve it, though you might want to comment on which call site
seems "correct"
Thanks,
Chung-Lin
typedef unsigned long long gomp_ull;
int
foo (gomp_ull *pstart, gomp_ull *pend, int mode,
gomp_ull next_ull, gomp_ull end_ull, gomp_ull chunk_size_ull)
{
gomp_ull start, end, chunk, left;
start = next_ull;
if (start == end_ull)
return 0;
chunk = chunk_size_ull;
left = end_ull - start;
if (mode & 2)
{
if (chunk < left)
chunk = left;
}
else
{
if (chunk > left)
chunk = left;
}
end = start + chunk;
*pstart = start;
*pend = end;
return 1;
}