From 84593a48f6446a48ee86724972fdcdcae143f9cd Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Thu, 27 Nov 2014 11:00:15 +0000 Subject: [PATCH] re PR target/59593 ([arm big-endian] using "ldrh" access a immediate which stored in a memory by word) 2014-11-27 Thomas Preud'homme 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 | 13 +++++ gcc/config/arm/arm.c | 2 +- gcc/config/arm/arm.md | 51 ++++++++++++++++---- gcc/config/arm/thumb1.md | 27 ----------- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.target/arm/constant-pool.c | 27 +++++++++++ 6 files changed, 88 insertions(+), 37 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/constant-pool.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b4eec7dcc3..32e0bcb01f0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2014-11-27 Thomas Preud'homme + + 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 * tree-ssa-sccvn.c (try_to_simplify): Allow diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 64494e85392..6377d8c932c 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -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: diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index a52716d4457..2e2a7882b2e 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -10594,6 +10594,42 @@ [(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" @@ -10604,15 +10640,12 @@ 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 diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md index ddedc397a55..2208ae6fa09 100644 --- a/gcc/config/arm/thumb1.md +++ b/gcc/config/arm/thumb1.md @@ -1735,33 +1735,6 @@ (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" "")) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index db8d4ff24c5..d6bddf9f86d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-11-27 Thomas Preud'homme + + PR target/59593 + * gcc.target/arm/constant-pool.c: New test. + 2014-11-27 Kyrylo Tkachov * 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 index 00000000000..8427dfb1a80 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/constant-pool.c @@ -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; +} -- 2.30.2