From 57403497a94a5986171d4239170612aeb010faf8 Mon Sep 17 00:00:00 2001 From: meissner Date: Wed, 15 Feb 2012 21:17:42 +0000 Subject: [PATCH] [gcc] 2012-02-15 Michael Meissner PR target/52199 * config/rs6000/rs6000.c (rs6000_expand_vector_init): Use force_reg instead of copy_to_reg for better optimization. Force non-register or memory operands into a register. [gcc/testsuite] 2012-02-15 Michael Meissner PR target/52199 * gcc.target/powerpc/pr52199.c: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@184285 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++ gcc/config/rs6000/rs6000.c | 37 ++++++++++++++---------------- gcc/testsuite/ChangeLog | 8 +++++++ gcc/testsuite/gcc.target/powerpc/pr52199.c | 24 +++++++++++++++++++ 4 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr52199.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da9520a4bbe..578f1ee1f1d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2012-02-15 Michael Meissner + + Backport from mainline + 2012-02-15 Michael Meissner + + PR target/52199 + * config/rs6000/rs6000.c (rs6000_expand_vector_init): Use + force_reg instead of copy_to_reg for better optimization. Force + non-register or memory operands into a register. + 2012-02-15 Richard Guenther Backport from mainline diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index a9cd835577e..2f2f342e792 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5324,28 +5324,25 @@ rs6000_expand_vector_init (rtx target, rtx vals) /* Double word values on VSX can use xxpermdi or lxvdsx. */ if (VECTOR_MEM_VSX_P (mode) && (mode == V2DFmode || mode == V2DImode)) { + rtx op0 = XVECEXP (vals, 0, 0); + rtx op1 = XVECEXP (vals, 0, 1); if (all_same) { - rtx element = XVECEXP (vals, 0, 0); + if (!MEM_P (op0) && !REG_P (op0)) + op0 = force_reg (inner_mode, op0); if (mode == V2DFmode) - emit_insn (gen_vsx_splat_v2df (target, element)); + emit_insn (gen_vsx_splat_v2df (target, op0)); else - emit_insn (gen_vsx_splat_v2di (target, element)); + emit_insn (gen_vsx_splat_v2di (target, op0)); } else { + op0 = force_reg (inner_mode, op0); + op1 = force_reg (inner_mode, op1); if (mode == V2DFmode) - { - rtx op0 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 0)); - rtx op1 = copy_to_mode_reg (DFmode, XVECEXP (vals, 0, 1)); - emit_insn (gen_vsx_concat_v2df (target, op0, op1)); - } + emit_insn (gen_vsx_concat_v2df (target, op0, op1)); else - { - rtx op0 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 0)); - rtx op1 = copy_to_mode_reg (DImode, XVECEXP (vals, 0, 1)); - emit_insn (gen_vsx_concat_v2di (target, op0, op1)); - } + emit_insn (gen_vsx_concat_v2di (target, op0, op1)); } return; } @@ -5359,7 +5356,7 @@ rs6000_expand_vector_init (rtx target, rtx vals) if (all_same) { rtx freg = gen_reg_rtx (V4SFmode); - rtx sreg = copy_to_reg (XVECEXP (vals, 0, 0)); + rtx sreg = force_reg (SFmode, XVECEXP (vals, 0, 0)); emit_insn (gen_vsx_xscvdpsp_scalar (freg, sreg)); emit_insn (gen_vsx_xxspltw_v4sf (target, freg, const0_rtx)); @@ -5370,13 +5367,13 @@ rs6000_expand_vector_init (rtx target, rtx vals) rtx dbl_odd = gen_reg_rtx (V2DFmode); rtx flt_even = gen_reg_rtx (V4SFmode); rtx flt_odd = gen_reg_rtx (V4SFmode); + rtx op0 = force_reg (SFmode, XVECEXP (vals, 0, 0)); + rtx op1 = force_reg (SFmode, XVECEXP (vals, 0, 1)); + rtx op2 = force_reg (SFmode, XVECEXP (vals, 0, 2)); + rtx op3 = force_reg (SFmode, XVECEXP (vals, 0, 3)); - emit_insn (gen_vsx_concat_v2sf (dbl_even, - copy_to_reg (XVECEXP (vals, 0, 0)), - copy_to_reg (XVECEXP (vals, 0, 1)))); - emit_insn (gen_vsx_concat_v2sf (dbl_odd, - copy_to_reg (XVECEXP (vals, 0, 2)), - copy_to_reg (XVECEXP (vals, 0, 3)))); + emit_insn (gen_vsx_concat_v2sf (dbl_even, op0, op1)); + emit_insn (gen_vsx_concat_v2sf (dbl_odd, op2, op3)); emit_insn (gen_vsx_xvcvdpsp (flt_even, dbl_even)); emit_insn (gen_vsx_xvcvdpsp (flt_odd, dbl_odd)); emit_insn (gen_vec_extract_evenv4sf (target, flt_even, flt_odd)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d87feb9059c..3e74b86e396 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2012-02-15 Michael Meissner + + Backport from mainline + 2012-02-15 Michael Meissner + + PR target/52199 + * gcc.target/powerpc/pr52199.c: New file. + 2012-02-14 Jakub Jelinek Backported from mainline diff --git a/gcc/testsuite/gcc.target/powerpc/pr52199.c b/gcc/testsuite/gcc.target/powerpc/pr52199.c new file mode 100644 index 00000000000..e2231938839 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr52199.c @@ -0,0 +1,24 @@ +/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-O3 -mcpu=power7 -fmerge-all-constants" } */ + +struct locale_time_t +{ + const char *abday[7]; + const unsigned int *wabday[7]; +}; + +static const unsigned int empty_wstr[1] = { 0 }; + +void +time_read (struct locale_time_t *time) +{ + int cnt; + + for (cnt=0; cnt < 7; cnt++) + { + time->abday[cnt] = ""; + time->wabday[cnt] = empty_wstr; + } +} -- 2.11.0