This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

optimization/3053: crash on armlinux and conditional execution


The following appears to fix the problem.  I've no ARM hardware
to bootstrap on, and the simulator is resisting attempts to be
useful.  I rather doubt this affects any other platform though.
IA-64's use of conditional execution is limited to EQ/NE which
does not fall prey to this sort of reversal issue.

Anyway, I'll put the PR in feedback until I hear from ARM folk.


r~



Index: ifcvt.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/ifcvt.c,v
retrieving revision 1.37.4.5
diff -c -p -d -r1.37.4.5 ifcvt.c
*** ifcvt.c	2001/06/11 05:15:15	1.37.4.5
--- ifcvt.c	2001/06/11 21:08:37
*************** cond_exec_get_condition (jump)
*** 288,297 ****
       reverse the condition.  */
    if (GET_CODE (XEXP (test_if, 2)) == LABEL_REF
        && XEXP (XEXP (test_if, 2), 0) == JUMP_LABEL (jump))
!     cond = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond)),
! 			   GET_MODE (cond), XEXP (cond, 0),
! 			   XEXP (cond, 1));
  
    return cond;
  }
  
--- 288,302 ----
       reverse the condition.  */
    if (GET_CODE (XEXP (test_if, 2)) == LABEL_REF
        && XEXP (XEXP (test_if, 2), 0) == JUMP_LABEL (jump))
!     {
!       enum rtx_code rev = reversed_comparison_code (cond, jump);
!       if (rev == UNKNOWN)
! 	return NULL_RTX;
  
+       cond = gen_rtx_fmt_ee (rev, GET_MODE (cond), XEXP (cond, 0),
+ 			     XEXP (cond, 1));
+     }
+ 
    return cond;
  }
  
*************** cond_exec_process_if_block (test_bb, the
*** 318,323 ****
--- 323,329 ----
    rtx true_prob_val;		/* probability of else block */
    rtx false_prob_val;		/* probability of then block */
    int n_insns;
+   enum rtx_code false_code;
  
    /* Find the conditional jump to the ELSE or JOIN part, and isolate
       the test.  */
*************** cond_exec_process_if_block (test_bb, the
*** 379,388 ****
       the conditionally executed code.  */
    
    true_expr = test_expr;
-   false_expr = gen_rtx_fmt_ee (reverse_condition (GET_CODE (true_expr)),
- 			       GET_MODE (true_expr), XEXP (true_expr, 0),
- 			       XEXP (true_expr, 1));
  
  #ifdef IFCVT_MODIFY_TESTS
    /* If the machine description needs to modify the tests, such as setting a
       conditional execution register from a comparison, it can do so here.  */
--- 385,398 ----
       the conditionally executed code.  */
    
    true_expr = test_expr;
  
+   false_code = reversed_comparison_code (true_expr, test_bb->end);
+   if (false_code != UNKNOWN)
+     false_expr = gen_rtx_fmt_ee (false_code, GET_MODE (true_expr),
+ 				 XEXP (true_expr, 0), XEXP (true_expr, 1));
+   else
+     false_expr = NULL_RTX;
+ 
  #ifdef IFCVT_MODIFY_TESTS
    /* If the machine description needs to modify the tests, such as setting a
       conditional execution register from a comparison, it can do so here.  */
*************** cond_exec_process_if_block (test_bb, the
*** 411,418 ****
       to conditional execution.  */
  
    if (then_end
!       && ! cond_exec_process_insns (then_start, then_end,
! 				    false_expr, false_prob_val, then_mod_ok))
      goto fail;
  
    if (else_bb
--- 421,429 ----
       to conditional execution.  */
  
    if (then_end
!       && (! false_expr
! 	  || ! cond_exec_process_insns (then_start, then_end, false_expr,
! 					false_prob_val, then_mod_ok)))
      goto fail;
  
    if (else_bb


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]