This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[SH][committed] Fix PR 62312
- From: Oleg Endo <oleg dot endo at t-online dot de>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 02 Sep 2014 00:35:23 +0200
- Subject: [SH][committed] Fix PR 62312
- Authentication-results: sourceware.org; auth=none
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"