This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix up ARM ICE (PR target/49069)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Ramana Radhakrishnan <ramrad01 at arm dot com>
- Cc: "nickc at redhat dot com" <nickc at redhat dot com>, Richard Earnshaw <Richard dot Earnshaw at arm dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 23 Jan 2013 09:42:00 +0100
- Subject: Re: [PATCH] Fix up ARM ICE (PR target/49069)
- References: <20130121105515.GH7269@tucnak.redhat.com> <50FE6C20.8080508@arm.com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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.
--- 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));
+}
Jakub