On 2011/11/2 11:47 PM, Bernd Schmidt wrote:
> On 10/31/11 10:11, Eric Botcazou wrote:
>>> I'm suggesting a new patch, as attached. Before reload_completed, we
>>> directly return 0 upon nlabel == NULL, which should be identical with
>>> old behavior, while asserting fail if after reload (where we assume the
>>> simple_return/return distinction is required).
>>>
>>> This should ensure better that, if a post-prologue case of redirecting
>>> to the exit block ever happens we will more easily know (by some future
>>> PR :P)
>>>
>>> Bootstrapped and tested on i686, and cross tested on ARM using QEMU.
>>> Eric, is this approach okay?
>>
>> Don't you want epilogue_completed instead of reload_completed?  Otherwise,
>> yes, the approach is fine with me, but wait for Bernd's input.
> 
> That looks good to me too.
> 
> 
> Bernd

(returning to this...)

I've re-tested using epilogue_completed to be sure, everything's clean
as expected. Just applied, attaching committed patch.

Thanks,
Chung-Lin
Index: ChangeLog
===================================================================
--- ChangeLog   (revision 181662)
+++ ChangeLog   (working copy)
@@ -1,3 +1,9 @@
+2011-11-23  Chung-Lin Tang  <clt...@codesourcery.com>
+
+       PR rtl-optimization/50496
+       * jump.c (redirect_jump): Assert fail on nlabel == NULL_RTX
+       only after epilogue is created. Add comments.
+
 2011-11-22  Richard Henderson  <r...@redhat.com>
 
        * config/ia64/ia64.c (ia64_expand_atomic_op): Add model parameter.
Index: jump.c
===================================================================
--- jump.c      (revision 181662)
+++ jump.c      (working copy)
@@ -1495,8 +1495,19 @@
 {
   rtx olabel = JUMP_LABEL (jump);
 
-  gcc_assert (nlabel != NULL_RTX);
+  if (!nlabel)
+    {
+      /* If there is no label, we are asked to redirect to the EXIT block.
+        When before the epilogue is emitted, return/simple_return cannot be
+        created so we return 0 immediately.  After the epilogue is emitted,
+        we always expect a label, either a non-null label, or a
+        return/simple_return RTX.  */
 
+      if (!epilogue_completed)
+       return 0;
+      gcc_unreachable ();
+    }
+
   if (nlabel == olabel)
     return 1;
 

Reply via email to