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]
Other format: [Raw text]

[SH][committed] Fix PR 62312


Hi,

The attached patch fixes PR 62312.  It's actually obvious.  Tested with
'make all-gcc' and checking that the added test case fails without the
patch and passes with the patch.
Committed to trunk as r214804 and to 4.9 as r214805.

Cheers,
Oleg

gcc/ChangeLog:
	PR target/62312
	* config/sh/sh.md (*cmp_div0s_0): Add missing constraints.

gcc/testsuite/ChangeLog:
	PR target/62312
	* gcc.c-torture/compile/pr62312.c: New.
Index: gcc/testsuite/gcc.c-torture/compile/pr62312.c
===================================================================
--- gcc/testsuite/gcc.c-torture/compile/pr62312.c	(revision 0)
+++ gcc/testsuite/gcc.c-torture/compile/pr62312.c	(revision 0)
@@ -0,0 +1,23 @@
+/* PR target/62312  */
+
+typedef struct { unsigned int arg[100]; } *FunctionCallInfo;
+typedef struct { int day; int month; } Interval;
+void* palloc (unsigned int);
+int bar (void);
+void baz (void);
+
+void
+interval_pl (FunctionCallInfo fcinfo)
+{
+  Interval *span1 = ((Interval *) ((char *) ((fcinfo->arg[0]))));
+  Interval *span2 = ((Interval *) ((char *) ((fcinfo->arg[1]))));
+  Interval *result = (Interval *) palloc (sizeof (Interval));
+
+  if ((((span1->month) < 0) == ((span2->month) < 0))
+      && !(((result->month) < 0) == ((span1->month) < 0)))
+    do {
+      if (bar ())
+	baz ();
+    } while(0);
+  result->day = span1->day + span2->day;
+}
Index: gcc/config/sh/sh.md
===================================================================
--- gcc/config/sh/sh.md	(revision 214803)
+++ gcc/config/sh/sh.md	(working copy)
@@ -869,9 +869,9 @@
 
 (define_insn "*cmp_div0s_0"
   [(set (reg:SI T_REG)
-	(eq:SI (lshiftrt:SI (match_operand:SI 0 "arith_reg_operand")
+	(eq:SI (lshiftrt:SI (match_operand:SI 0 "arith_reg_operand" "%r")
 			    (const_int 31))
-	       (ge:SI (match_operand:SI 1 "arith_reg_operand")
+	       (ge:SI (match_operand:SI 1 "arith_reg_operand" "r")
 		      (const_int 0))))]
   "TARGET_SH1"
   "div0s	%0,%1"

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