diff options
author | Alan Modra <amodra@gmail.com> | 2011-03-16 16:56:29 +1030 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2011-03-16 16:56:29 +1030 |
commit | 9ef13bd018fc5c6e2dc57aa36d378919c8aeded1 (patch) | |
tree | 1a50a581db972867eb3dbeebd70c5c125ab2d722 /gcc/config/rs6000/rs6000.c | |
parent | 338241572aaefd2b54e764abf0de187ece2bd184 (diff) | |
download | gcc-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.c | 8 |
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 |