re PR target/59593 ([arm big-endian] using "ldrh" access a immediate which stored...
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Thu, 27 Nov 2014 11:00:15 +0000 (11:00 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Thu, 27 Nov 2014 11:00:15 +0000 (11:00 +0000)
2014-11-27  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    gcc/
    PR target/59593
    * config/arm/arm.c (dump_minipool): dispatch to consttable pattern
    based on mode size.
    * config/arm/arm.md (consttable_1): Move from config/arm/thumb1.md and
    make it TARGET_EITHER.
    (consttable_2): Move from config/arm/thumb1.md, make it TARGET_EITHER
    and move HFmode handling from consttable_4 to it.
    (consttable_4): Move HFmode handling to consttable_2 pattern.
    * config/arm/thumb1.md (consttable_1): Move to config/arm/arm.md.
    (consttable_2): Ditto.

    gcc/testsuite/
    PR target/59593
    * gcc.target/arm/constant-pool.c: New test.

From-SVN: r218118

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.md
gcc/config/arm/thumb1.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/constant-pool.c [new file with mode: 0644]

index 2b4eec7..32e0bcb 100644 (file)
@@ -1,3 +1,16 @@
+2014-11-27  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       PR target/59593
+       * config/arm/arm.c (dump_minipool): dispatch to consttable pattern
+       based on mode size.
+       * config/arm/arm.md (consttable_1): Move from config/arm/thumb1.md and
+       make it TARGET_EITHER.
+       (consttable_2): Move from config/arm/thumb1.md, make it TARGET_EITHER
+       and move HFmode handling from consttable_4 to it.
+       (consttable_4): Move HFmode handling to consttable_2 pattern.
+       * config/arm/thumb1.md (consttable_1): Move to config/arm/arm.md.
+       (consttable_2): Ditto.
+
 2014-11-27  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-sccvn.c (try_to_simplify): Allow
index 64494e8..6377d8c 100644 (file)
@@ -16626,7 +16626,7 @@ dump_minipool (rtx_insn *scan)
              fputc ('\n', dump_file);
            }
 
-         switch (mp->fix_size)
+         switch (GET_MODE_SIZE (mp->mode))
            {
 #ifdef HAVE_consttable_1
            case 1:
index a52716d..2e2a788 100644 (file)
   [(set_attr "type" "no_insn")]
 )
 
+(define_insn "consttable_1"
+  [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_1)]
+  "TARGET_EITHER"
+  "*
+  making_const_table = TRUE;
+  assemble_integer (operands[0], 1, BITS_PER_WORD, 1);
+  assemble_zeros (3);
+  return \"\";
+  "
+  [(set_attr "length" "4")
+   (set_attr "type" "no_insn")]
+)
+
+(define_insn "consttable_2"
+  [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_2)]
+  "TARGET_EITHER"
+  "*
+  {
+    rtx x = operands[0];
+    making_const_table = TRUE;
+    switch (GET_MODE_CLASS (GET_MODE (x)))
+      {
+      case MODE_FLOAT:
+       arm_emit_fp16_const (x);
+       break;
+      default:
+       assemble_integer (operands[0], 2, BITS_PER_WORD, 1);
+       assemble_zeros (2);
+       break;
+      }
+    return \"\";
+  }"
+  [(set_attr "length" "4")
+   (set_attr "type" "no_insn")]
+)
+
 (define_insn "consttable_4"
   [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_4)]
   "TARGET_EITHER"
     switch (GET_MODE_CLASS (GET_MODE (x)))
       {
       case MODE_FLOAT:
-       if (GET_MODE (x) == HFmode)
-         arm_emit_fp16_const (x);
-       else
-         {
-           REAL_VALUE_TYPE r;
-           REAL_VALUE_FROM_CONST_DOUBLE (r, x);
-           assemble_real (r, GET_MODE (x), BITS_PER_WORD);
-         }
-       break;
+       {
+         REAL_VALUE_TYPE r;
+         REAL_VALUE_FROM_CONST_DOUBLE (r, x);
+         assemble_real (r, GET_MODE (x), BITS_PER_WORD);
+         break;
+       }
       default:
        /* XXX: Sometimes gcc does something really dumb and ends up with
           a HIGH in a constant pool entry, usually because it's trying to
index ddedc39..2208ae6 100644 (file)
    (set_attr "conds" "clob")]
 )
 
-(define_insn "consttable_1"
-  [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_1)]
-  "TARGET_THUMB1"
-  "*
-  making_const_table = TRUE;
-  assemble_integer (operands[0], 1, BITS_PER_WORD, 1);
-  assemble_zeros (3);
-  return \"\";
-  "
-  [(set_attr "length" "4")
-   (set_attr "type" "no_insn")]
-)
-
-(define_insn "consttable_2"
-  [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_2)]
-  "TARGET_THUMB1"
-  "*
-  making_const_table = TRUE;
-  gcc_assert (GET_MODE_CLASS (GET_MODE (operands[0])) != MODE_FLOAT);
-  assemble_integer (operands[0], 2, BITS_PER_WORD, 1);
-  assemble_zeros (2);
-  return \"\";
-  "
-  [(set_attr "length" "4")
-   (set_attr "type" "no_insn")]
-)
-
 ;; Miscellaneous Thumb patterns
 (define_expand "tablejump"
   [(parallel [(set (pc) (match_operand:SI 0 "register_operand" ""))
index db8d4ff..d6bddf9 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-27  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       PR target/59593
+       * gcc.target/arm/constant-pool.c: New test.
+
 2014-11-27  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/aarch64/simd/vsqrt_f64_1.c: Mark variable volatile.
diff --git a/gcc/testsuite/gcc.target/arm/constant-pool.c b/gcc/testsuite/gcc.target/arm/constant-pool.c
new file mode 100644 (file)
index 0000000..8427dfb
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+/* { dg-options "-O1" } */
+
+unsigned short v = 0x5678;
+int i;
+int j = 0;
+int *ptr = &j;
+
+int
+func (void)
+{
+  for (i = 0; i < 1; ++i)
+    {
+      *ptr = -1;
+      v = 0x1234;
+    }
+  return v;
+}
+
+int
+main (void)
+{
+  func ();
+  if (v != 0x1234)
+    __builtin_abort ();
+  return 0;
+}