On Thu, 21 Nov 2019, Prathamesh Kulkarni wrote:

> Hi,
> The issue seems to happen with -O1, because header only contains phi:
> 
>   <bb 3> [local count: 118111600]:
>   # iter.12_9 = PHI <0(2), iter.12_10(10)>
> 
> and thus we hit segfault in following hunk in find_loop_guard:
>      else
>         {
>           cond = dyn_cast <gcond *> (last_stmt (header));
>           if (! cond)
>             return NULL;
>           extract_true_false_edges_from_block (header, &te, &fe);
> 
> since last_stmt (header) returns NULL.
> 
> The attached patch, simply punts if last_stmt returns NULL, which
> avoids the segfault.
> Does it look OK ?

Please add the testcase from the PR to gcc.dg/torture
with dg-additional-options -funswitch-loops.

       else
        {
-         cond = dyn_cast <gcond *> (last_stmt (header));
+         gimple *last = last_stmt (header);
+         if (!last)
+           return NULL;
+         cond = dyn_cast <gcond *> (last);
          if (! cond)
            return NULL;

Please simply use safe_dyn_cast <gcond *> (last_stmt (header))
which appropriately deals with a NULL input.

OK with those changes.
Richard.

Reply via email to