> Am 13.11.2025 um 18:30 schrieb Andrew Pinski <[email protected]>:
>
> On Thu, Nov 13, 2025 at 9:01 AM Victor Do Nascimento
> <[email protected]> wrote:
>>
>> Given that when finding whether the predicate in question is satisfied
>> or not we already do the heavy-lifting of identifying the specific
>> edge that matches the particular criterion, it is wasteful to throw
>> the edge information away, only to potentially have to recalculate it
>> when true is returned.
>>
>> Rather, given the ability of treating a valid pointer as true and,
>> conversely, the NULL pointer as false, we can return the edge for
>> should we wish to use it, while keeping the function's existing calls
>> in the code as is.
>>
>> Boostrapped and regtested on aarch64, all clean.
>>
>> gcc/ChangeLog:
>>
>> * cfgloop.cc (loop_exits_to_bb_p): Change return type.
>> (loop_exits_from_bb_p): Likewise.
>> ---
>> gcc/cfgloop.cc | 12 ++++++------
>> gcc/cfgloop.h | 4 ++--
>> 2 files changed, 8 insertions(+), 8 deletions(-)
>>
>> diff --git a/gcc/cfgloop.cc b/gcc/cfgloop.cc
>> index 84b92c78c33..4a8de022508 100644
>> --- a/gcc/cfgloop.cc
>> +++ b/gcc/cfgloop.cc
>> @@ -1807,7 +1807,7 @@ single_exit (const class loop *loop)
>>
>> /* Returns true when BB has an incoming edge exiting LOOP. */
>
> The comment needs to be updated.
> Like:
> Returns the edge of the incoming edge of BB exiting the LOOP. NULL is
> returned when there is no such edge.
Ok with such change(s)
Richard
>
> Thanks,
> Andrew
>
>>
>> -bool
>> +edge
>> loop_exits_to_bb_p (class loop *loop, basic_block bb)
>> {
>> edge e;
>> @@ -1815,14 +1815,14 @@ loop_exits_to_bb_p (class loop *loop, basic_block bb)
>>
>> FOR_EACH_EDGE (e, ei, bb->preds)
>> if (loop_exit_edge_p (loop, e))
>> - return true;
>> + return e;
>>
>> - return false;
>> + return NULL;
>> }
>>
>> /* Returns true when BB has an outgoing edge exiting LOOP. */
>>
>> -bool
>> +edge
>> loop_exits_from_bb_p (class loop *loop, basic_block bb)
>> {
>> edge e;
>> @@ -1830,9 +1830,9 @@ loop_exits_from_bb_p (class loop *loop, basic_block bb)
>>
>> FOR_EACH_EDGE (e, ei, bb->succs)
>> if (loop_exit_edge_p (loop, e))
>> - return true;
>> + return e;
>>
>> - return false;
>> + return NULL;
>> }
>>
>> /* Return location corresponding to the loop control condition if possible.
>> */
>> diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
>> index 7820e0cc2bd..82d177f0442 100644
>> --- a/gcc/cfgloop.h
>> +++ b/gcc/cfgloop.h
>> @@ -370,8 +370,8 @@ extern int num_loop_insns (const class loop *);
>> extern int average_num_loop_insns (const class loop *);
>> extern unsigned get_loop_level (const class loop *);
>> extern bool loop_exit_edge_p (const class loop *, const_edge);
>> -extern bool loop_exits_to_bb_p (class loop *, basic_block);
>> -extern bool loop_exits_from_bb_p (class loop *, basic_block);
>> +extern edge loop_exits_to_bb_p (class loop *, basic_block);
>> +extern edge loop_exits_from_bb_p (class loop *, basic_block);
>> extern void mark_loop_exit_edges (void);
>> extern dump_user_location_t get_loop_location (class loop *loop);
>>
>> --
>> 2.43.0
>>