aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/neon.md8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr52375.c12
-rw-r--r--gcc/testsuite/gcc.target/arm/pr52375.c15
5 files changed, 42 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1a9e0f9..0406ed2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2012-02-27 Jakub Jelinek <jakub@redhat.com>
+ PR target/52375
+ * config/arm/neon.md (vashr<mode>3, vlshr<mode>3): Use
+ s_register_operand in the test instead of REG_P. Don't call
+ gen_reg_rtx if it won't be used.
+
PR tree-optimization/52376
* ipa-split.c (split_function): Ignore CLOBBER stmts.
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index a6c891d..e0d6a0c 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -1064,9 +1064,9 @@
(match_operand:VDQIW 2 "imm_rshift_or_reg_neon" "")))]
"TARGET_NEON"
{
- rtx neg = gen_reg_rtx (<MODE>mode);
- if (REG_P (operands[2]))
+ if (s_register_operand (operands[2], <MODE>mode))
{
+ rtx neg = gen_reg_rtx (<MODE>mode);
emit_insn (gen_neg<mode>2 (neg, operands[2]));
emit_insn (gen_ashl<mode>3_signed (operands[0], operands[1], neg));
}
@@ -1081,9 +1081,9 @@
(match_operand:VDQIW 2 "imm_rshift_or_reg_neon" "")))]
"TARGET_NEON"
{
- rtx neg = gen_reg_rtx (<MODE>mode);
- if (REG_P (operands[2]))
+ if (s_register_operand (operands[2], <MODE>mode))
{
+ rtx neg = gen_reg_rtx (<MODE>mode);
emit_insn (gen_neg<mode>2 (neg, operands[2]));
emit_insn (gen_ashl<mode>3_unsigned (operands[0], operands[1], neg));
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0af8d11..5c9f70c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2012-02-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/52375
+ * gcc.target/arm/pr52375.c: New test.
+ * gcc.c-torture/compile/pr52375.c: New test.
+
2012-02-27 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* gfortran.dg/typebound_operator_9.f03: Skip on SPU.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr52375.c b/gcc/testsuite/gcc.c-torture/compile/pr52375.c
new file mode 100644
index 0000000..e6877bb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr52375.c
@@ -0,0 +1,12 @@
+/* PR target/52375 */
+
+struct C { int c, d; };
+
+unsigned
+foo (struct C *p)
+{
+ unsigned int b = 0, i;
+ for (i = 0; i < 64; i++)
+ b |= 0x80000000U >> p[i].c;
+ return b;
+}
diff --git a/gcc/testsuite/gcc.target/arm/pr52375.c b/gcc/testsuite/gcc.target/arm/pr52375.c
new file mode 100644
index 0000000..0405c66
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr52375.c
@@ -0,0 +1,15 @@
+/* PR target/52375 */
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-options "-march=armv7-a -mfloat-abi=hard -mfpu=neon -O -ftree-vectorize" } */
+
+struct C { int c, d; };
+
+unsigned
+foo (struct C *p)
+{
+ unsigned int b = 0, i;
+ for (i = 0; i < 64; i++)
+ b |= 0x80000000U >> p[i].c;
+ return b;
+}