Patchwork Fix up ARM ICE (PR target/49069)

login
register
mail settings
Submitter Jakub Jelinek
Date Jan. 23, 2013, 8:42 a.m.
Message ID <20130123084200.GB7269@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/214844/
State New
Headers show

Comments

Jakub Jelinek - Jan. 23, 2013, 8:42 a.m.
On Tue, Jan 22, 2013 at 10:38:24AM +0000, Ramana Radhakrishnan wrote:
> Instead I'd just use s_register_operand for operand1 and continue to
> use cmpdi_operand for operand2 and fix it so.
> 
> And likewise .
> 
> Ok with those changes and if no regressions.

Managed to bootstrap/regtest this (via scratch rpm builds) on
armv7hl-linux-gnueabi, here is what I've committed:

2013-01-23  Jakub Jelinek  <jakub@redhat.com>

	PR target/49069
	* config/arm/arm.md (cbranchdi4, cstoredi4): Use s_register_operand
	instead of cmpdi_operand for first comparison operand.
	Don't assert that comparison operands aren't both constants.

	* gcc.dg/pr49069.c: New test.


	Jakub

Patch

--- gcc/config/arm/arm.md.jj	2013-01-18 17:59:43.765932181 +0100
+++ gcc/config/arm/arm.md	2013-01-22 12:07:13.572331618 +0100
@@ -7030,16 +7030,12 @@ 
 (define_expand "cbranchdi4"
   [(set (pc) (if_then_else
 	      (match_operator 0 "expandable_comparison_operator"
-	       [(match_operand:DI 1 "cmpdi_operand" "")
+	       [(match_operand:DI 1 "s_register_operand" "")
 	        (match_operand:DI 2 "cmpdi_operand" "")])
 	      (label_ref (match_operand 3 "" ""))
 	      (pc)))]
   "TARGET_32BIT"
   "{
-     /* We should not have two constants.  */
-     gcc_assert (GET_MODE (operands[1]) == DImode
-		 || GET_MODE (operands[2]) == DImode);
-
      if (!arm_validize_comparison (&operands[0], &operands[1], &operands[2]))
        FAIL;
      emit_jump_insn (gen_cbranch_cc (operands[0], operands[1], operands[2],
@@ -7955,14 +7951,10 @@ 
 (define_expand "cstoredi4"
   [(set (match_operand:SI 0 "s_register_operand" "")
 	(match_operator:SI 1 "expandable_comparison_operator"
-	 [(match_operand:DI 2 "cmpdi_operand" "")
+	 [(match_operand:DI 2 "s_register_operand" "")
 	  (match_operand:DI 3 "cmpdi_operand" "")]))]
   "TARGET_32BIT"
   "{
-     /* We should not have two constants.  */
-     gcc_assert (GET_MODE (operands[2]) == DImode
-		 || GET_MODE (operands[3]) == DImode);
-
      if (!arm_validize_comparison (&operands[1],
      				   &operands[2],
 				   &operands[3]))
--- gcc/testsuite/gcc.dg/pr49069.c.jj	2012-11-17 15:43:17.572007394 +0100
+++ gcc/testsuite/gcc.dg/pr49069.c	2013-01-17 16:43:41.613146835 +0100
@@ -0,0 +1,15 @@ 
+/* PR target/49069 */
+/* { dg-do compile } */
+/* { dg-options "-Os -fno-tree-forwprop -Wno-div-by-zero" } */
+
+int a;
+const unsigned long long b[1] = { 1ULL };
+extern void bar (int);
+
+void
+foo (void)
+{
+  for (a = 0; a == 1; a = 2)
+    ;
+  bar (b[0] == (a == 0 ? a : a / 0));
+}