aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/rs6000/rs6000.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2011-03-16 16:56:29 +1030
committerAlan Modra <amodra@gcc.gnu.org>2011-03-16 16:56:29 +1030
commit9ef13bd018fc5c6e2dc57aa36d378919c8aeded1 (patch)
tree1a50a581db972867eb3dbeebd70c5c125ab2d722 /gcc/config/rs6000/rs6000.c
parent338241572aaefd2b54e764abf0de187ece2bd184 (diff)
downloadgcc-9ef13bd018fc5c6e2dc57aa36d378919c8aeded1.zip
gcc-9ef13bd018fc5c6e2dc57aa36d378919c8aeded1.tar.gz
gcc-9ef13bd018fc5c6e2dc57aa36d378919c8aeded1.tar.bz2
re PR target/45844 (FAIL: gfortran.dg/vect/pr45714-b.f -O (internal compiler error))
PR target/45844 * config/rs6000/rs6000.c (rs6000_legitimize_reload_address): Don't create invalid offset address for vsx splat insn. * config/rs6000/predicates.md (splat_input_operand): New. * config/rs6000/vsx.md (vsx_splat_*): Use it. From-SVN: r171031
Diffstat (limited to 'gcc/config/rs6000/rs6000.c')
-rw-r--r--gcc/config/rs6000/rs6000.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 0ff1745..0714c8f 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -6676,6 +6676,14 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
{
bool reg_offset_p = reg_offset_addressing_ok_p (mode);
+ /* Nasty hack for vsx_splat_V2DF/V2DI load from mem, which takes a
+ DFmode/DImode MEM. */
+ if (reg_offset_p
+ && opnum == 1
+ && ((mode == DFmode && recog_data.operand_mode[0] == V2DFmode)
+ || (mode == DImode && recog_data.operand_mode[0] == V2DImode)))
+ reg_offset_p = false;
+
/* We must recognize output that we have already generated ourselves. */
if (GET_CODE (x) == PLUS
&& GET_CODE (XEXP (x, 0)) == PLUS