Commit 655b5fc8 by Andre Vieira Committed by Thomas Preud'homme

[ARM] PR71607: Fix ICE when loading constant

2017-05-05  Andre Vieira  <andre.simoesdiasvieira@arm.com>
            Prakhar Bahuguna  <prakhar.bahuguna@arm.com>

    gcc/
    PR target/71607
    * config/arm/arm.md (use_literal_pool): Remove.
    (64-bit immediate split): No longer takes cost into consideration
    if arm_disable_literal_pool is enabled.
    * config/arm/arm.c (arm_tls_referenced_p): Add diagnostic if TLS is
    used when arm_disable_literal_pool is enabled.
    (arm_max_const_double_inline_cost): Remove use of
    arm_disable_literal_pool.
    (push_minipool_fix): Add assert.
    (arm_reorg): Add return if arm_disable_literal_pool is enabled.
    * config/arm/vfp.md (no_literal_pool_df_immediate): New.
    (no_literal_pool_sf_immediate): New.

2017-05-05  Andre Vieira  <andre.simoesdiasvieira@arm.com>
        Thomas Preud'homme  <thomas.preudhomme@arm.com>
        Prakhar Bahuguna  <prakhar.bahuguna@arm.com>

    gcc/testsuite/
    PR target/71607
    * gcc.target/arm/thumb2-slow-flash-data.c: Renamed to ...
    * gcc.target/arm/thumb2-slow-flash-data-1.c: ... this.
    * gcc.target/arm/thumb2-slow-flash-data-2.c: New.
    * gcc.target/arm/thumb2-slow-flash-data-3.c: New.
    * gcc.target/arm/thumb2-slow-flash-data-4.c: New.
    * gcc.target/arm/thumb2-slow-flash-data-5.c: New.
    * gcc.target/arm/tls-disable-literal-pool.c: New.

Co-Authored-By: Prakhar Bahuguna <prakhar.bahuguna@arm.com>
Co-Authored-By: Thomas Preud'homme <thomas.preudhomme@arm.com>

From-SVN: r247640
parent b6263c5d
2017-05-05 Andre Vieira <andre.simoesdiasvieira@arm.com>
Prakhar Bahuguna <prakhar.bahuguna@arm.com>
PR target/71607
* config/arm/arm.md (use_literal_pool): Remove.
(64-bit immediate split): No longer takes cost into consideration
if arm_disable_literal_pool is enabled.
* config/arm/arm.c (arm_tls_referenced_p): Add diagnostic if TLS is
used when arm_disable_literal_pool is enabled.
(arm_max_const_double_inline_cost): Remove use of
arm_disable_literal_pool.
(push_minipool_fix): Add assert.
(arm_reorg): Add return if arm_disable_literal_pool is enabled.
* config/arm/vfp.md (no_literal_pool_df_immediate): New.
(no_literal_pool_sf_immediate): New.
2017-05-05 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> 2017-05-05 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
PR tree-optimization/80613 PR tree-optimization/80613
......
...@@ -8691,7 +8691,16 @@ arm_tls_referenced_p (rtx x) ...@@ -8691,7 +8691,16 @@ arm_tls_referenced_p (rtx x)
{ {
const_rtx x = *iter; const_rtx x = *iter;
if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0) if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0)
return true; {
/* ARM currently does not provide relocations to encode TLS variables
into AArch32 instructions, only data, so there is no way to
currently implement these if a literal pool is disabled. */
if (arm_disable_literal_pool)
sorry ("accessing thread-local storage is not currently supported "
"with -mpure-code or -mslow-flash-data");
return true;
}
/* Don't recurse into UNSPEC_TLS looking for TLS symbols; these are /* Don't recurse into UNSPEC_TLS looking for TLS symbols; these are
TLS offsets, not real symbol references. */ TLS offsets, not real symbol references. */
...@@ -16399,6 +16408,7 @@ static void ...@@ -16399,6 +16408,7 @@ static void
push_minipool_fix (rtx_insn *insn, HOST_WIDE_INT address, rtx *loc, push_minipool_fix (rtx_insn *insn, HOST_WIDE_INT address, rtx *loc,
machine_mode mode, rtx value) machine_mode mode, rtx value)
{ {
gcc_assert (!arm_disable_literal_pool);
Mfix * fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (* fix)); Mfix * fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (* fix));
fix->insn = insn; fix->insn = insn;
...@@ -16450,10 +16460,6 @@ push_minipool_fix (rtx_insn *insn, HOST_WIDE_INT address, rtx *loc, ...@@ -16450,10 +16460,6 @@ push_minipool_fix (rtx_insn *insn, HOST_WIDE_INT address, rtx *loc,
int int
arm_max_const_double_inline_cost () arm_max_const_double_inline_cost ()
{ {
/* Let the value get synthesized to avoid the use of literal pools. */
if (arm_disable_literal_pool)
return 99;
return ((optimize_size || arm_ld_sched) ? 3 : 4); return ((optimize_size || arm_ld_sched) ? 3 : 4);
} }
...@@ -17400,6 +17406,11 @@ arm_reorg (void) ...@@ -17400,6 +17406,11 @@ arm_reorg (void)
if (!optimize) if (!optimize)
split_all_insns_noflow (); split_all_insns_noflow ();
/* Make sure we do not attempt to create a literal pool even though it should
no longer be necessary to create any. */
if (arm_disable_literal_pool)
return ;
minipool_fix_head = minipool_fix_tail = NULL; minipool_fix_head = minipool_fix_tail = NULL;
/* The first insn must always be a note, or the code below won't /* The first insn must always be a note, or the code below won't
......
...@@ -233,10 +233,6 @@ ...@@ -233,10 +233,6 @@
(match_test "arm_restrict_it")) (match_test "arm_restrict_it"))
(const_string "no") (const_string "no")
(and (eq_attr "use_literal_pool" "yes")
(match_test "arm_disable_literal_pool"))
(const_string "no")
(eq_attr "arch_enabled" "no") (eq_attr "arch_enabled" "no")
(const_string "no")] (const_string "no")]
(const_string "yes"))) (const_string "yes")))
...@@ -5878,8 +5874,9 @@ ...@@ -5878,8 +5874,9 @@
(match_operand:ANY64 1 "immediate_operand" ""))] (match_operand:ANY64 1 "immediate_operand" ""))]
"TARGET_32BIT "TARGET_32BIT
&& reload_completed && reload_completed
&& (arm_const_double_inline_cost (operands[1]) && (arm_disable_literal_pool
<= arm_max_const_double_inline_cost ())" || (arm_const_double_inline_cost (operands[1])
<= arm_max_const_double_inline_cost ()))"
[(const_int 0)] [(const_int 0)]
" "
arm_split_constant (SET, SImode, curr_insn, arm_split_constant (SET, SImode, curr_insn,
......
...@@ -2079,3 +2079,40 @@ ...@@ -2079,3 +2079,40 @@
;; fmdhr et al (VFPv1) ;; fmdhr et al (VFPv1)
;; Support for xD (single precision only) variants. ;; Support for xD (single precision only) variants.
;; fmrrs, fmsrr ;; fmrrs, fmsrr
;; Split an immediate DF move to two immediate SI moves.
(define_insn_and_split "no_literal_pool_df_immediate"
[(set (match_operand:DF 0 "s_register_operand" "")
(match_operand:DF 1 "const_double_operand" ""))]
"TARGET_THUMB2 && arm_disable_literal_pool
&& !(TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE
&& vfp3_const_double_rtx (operands[1]))"
"#"
"&& !reload_completed"
[(set (subreg:SI (match_dup 1) 0) (match_dup 2))
(set (subreg:SI (match_dup 1) 4) (match_dup 3))
(set (match_dup 0) (match_dup 1))]
"
long buf[2];
real_to_target (buf, CONST_DOUBLE_REAL_VALUE (operands[1]), DFmode);
operands[2] = GEN_INT ((int) buf[0]);
operands[3] = GEN_INT ((int) buf[1]);
operands[1] = gen_reg_rtx (DFmode);
")
;; Split an immediate SF move to one immediate SI move.
(define_insn_and_split "no_literal_pool_sf_immediate"
[(set (match_operand:SF 0 "s_register_operand" "")
(match_operand:SF 1 "const_double_operand" ""))]
"TARGET_THUMB2 && arm_disable_literal_pool
&& !(TARGET_HARD_FLOAT && vfp3_const_double_rtx (operands[1]))"
"#"
"&& !reload_completed"
[(set (subreg:SI (match_dup 1) 0) (match_dup 2))
(set (match_dup 0) (match_dup 1))]
"
long buf;
real_to_target (&buf, CONST_DOUBLE_REAL_VALUE (operands[1]), SFmode);
operands[2] = GEN_INT ((int) buf);
operands[1] = gen_reg_rtx (SFmode);
")
2017-05-05 Andre Vieira <andre.simoesdiasvieira@arm.com>
Thomas Preud'homme <thomas.preudhomme@arm.com>
Prakhar Bahuguna <prakhar.bahuguna@arm.com>
PR target/71607
* gcc.target/arm/thumb2-slow-flash-data.c: Renamed to ...
* gcc.target/arm/thumb2-slow-flash-data-1.c: ... this.
* gcc.target/arm/thumb2-slow-flash-data-2.c: New.
* gcc.target/arm/thumb2-slow-flash-data-3.c: New.
* gcc.target/arm/thumb2-slow-flash-data-4.c: New.
* gcc.target/arm/thumb2-slow-flash-data-5.c: New.
* gcc.target/arm/tls-disable-literal-pool.c: New.
2017-05-05 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> 2017-05-05 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
PR tree-optimization/80613 PR tree-optimization/80613
......
/* { dg-do compile } */
/* { dg-require-effective-target arm_cortex_m } */
/* { dg-require-effective-target arm_thumb2_ok } */
/* { dg-skip-if "avoid conflicts with multilib options" { *-*-* } { "-mcpu=*" } { "-mcpu=cortex-m4" "-mcpu=cortex-m7" } } */
/* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } { "-mfloat-abi=hard" } } */
/* { dg-options "-march=armv7e-m -mfloat-abi=hard -O2 -mthumb -mslow-flash-data" } */
float f (float);
const float max = 0.01f;
int
g (float in)
{
if (f (in) + f (in) < max)
return 0;
return 1;
}
double foo (void)
{
return 0xF1EC7A5239123AF;
}
double bar (void)
{
return 0.0f;
}
/* { dg-do compile } */
/* { dg-require-effective-target arm_cortex_m } */
/* { dg-require-effective-target arm_thumb2_ok } */
/* { dg-skip-if "avoid conflicts with multilib options" { *-*-* } { "-mcpu=*" } { "-mcpu=cortex-m4" "-mcpu=cortex-m7" } } */
/* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } { "-mfloat-abi=hard" } } */
/* { dg-options "-march=armv7e-m -mfloat-abi=hard -mthumb -mslow-flash-data" } */
/* From PR71607 */
float b;
void fn1 ();
float
fn2 ()
{
return 1.1f;
}
void
fn3 ()
{
float a[2];
a[1] = b;
fn1 (a);
}
/* { dg-do compile } */
/* { dg-require-effective-target arm_cortex_m } */
/* { dg-require-effective-target arm_thumb2_ok } */
/* { dg-skip-if "avoid conflicts with multilib options" { *-*-* } { "-mcpu=*" } { "-mcpu=cortex-m4" "-mcpu=cortex-m7" } } */
/* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } { "-mfloat-abi=hard" } } */
/* { dg-options "-march=armv7e-m -mfloat-abi=hard -O2 -mthumb -mslow-flash-data" } */
double __attribute__ ((target ("fpu=fpv5-d16")))
foo (void)
{
return 1.0f;
}
float __attribute__ ((target ("fpu=fpv5-d16")))
bar (void)
{
return 1.0f;
}
float __attribute__ ((target ("fpu=fpv5-sp-d16")))
baz (void)
{
return 1.0f;
}
/* { dg-final { scan-assembler-times "#1\\.0e\\+0" 3 } } */
/* { dg-do compile } */
/* { dg-require-effective-target arm_cortex_m } */
/* { dg-require-effective-target arm_thumb2_ok } */
/* { dg-skip-if "avoid conflicts with multilib options" { *-*-* } { "-mcpu=*" } { "-mcpu=cortex-m4" "-mcpu=cortex-m7" } } */
/* { dg-skip-if "do not override -mfloat-abi" { *-*-* } { "-mfloat-abi=*" } { "-mfloat-abi=hard" } } */
/* { dg-options "-march=armv7e-m -mfloat-abi=hard -O2 -mthumb -mslow-flash-data" } */
double __attribute__ ((target ("fpu=fpv5-sp-d16")))
foo (void)
{
return 1.0f;
}
/* { dg-final { scan-assembler-not "#1\\.0e\\+0" } } */
/* { dg-do compile } */
/* { dg-require-effective-target tls } */
/* { dg-require-effective-target arm_cortex_m } */
/* { dg-require-effective-target arm_thumb2_ok } */
/* { dg-options "-mslow-flash-data" } */
__thread int x = 0;
int
bar ()
{
return x;
}
/* { dg-error "accessing thread-local storage is not currently supported with -mpure-code or -mslow-flash-data" "" { target *-*-* } 12 } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment