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 ?

Thanks,
Prathamesh
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
index e60019db946..1439c8556ba 100644
--- a/gcc/tree-ssa-loop-unswitch.c
+++ b/gcc/tree-ssa-loop-unswitch.c
@@ -587,7 +587,10 @@ find_loop_guard (class loop *loop)
 	next = single_succ (header);
       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;
 	  extract_true_false_edges_from_block (header, &te, &fe);

Reply via email to