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
This commit is contained in:
Alan Modra 2011-03-16 16:56:29 +10:30 committed by Alan Modra
parent 338241572a
commit 9ef13bd018
4 changed files with 35 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2011-03-16 Alan Modra <amodra@gmail.com>
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.
2011-03-15 Xinliang David Li <davidxl@google.com>
PR c/47837

View File

@ -1,5 +1,5 @@
;; Predicate definitions for POWER and PowerPC.
;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
;; Free Software Foundation, Inc.
;;
;; This file is part of GCC.
@ -871,6 +871,23 @@
return 0;
})
;; Return 1 if this operand is a valid input for a vsx_splat insn.
(define_predicate "splat_input_operand"
(match_code "label_ref,symbol_ref,const,high,reg,subreg,mem,
const_double,const_vector,const_int,plus")
{
if (MEM_P (op))
{
if (mode == DFmode)
mode = V2DFmode;
else if (mode == DImode)
mode = V2DImode;
else
gcc_unreachable ();
}
return input_operand (op, mode);
})
;; Return true if OP is an invalid SUBREG operation on the e500.
(define_predicate "rs6000_nonimmediate_operand"
(match_code "reg,subreg,mem")

View File

@ -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

View File

@ -1076,7 +1076,7 @@
(define_insn "vsx_splat_<mode>"
[(set (match_operand:VSX_D 0 "vsx_register_operand" "=wd,wd,wd,?wa,?wa,?wa")
(vec_duplicate:VSX_D
(match_operand:<VS_scalar> 1 "input_operand" "ws,f,Z,wa,wa,Z")))]
(match_operand:<VS_scalar> 1 "splat_input_operand" "ws,f,Z,wa,wa,Z")))]
"VECTOR_MEM_VSX_P (<MODE>mode)"
"@
xxpermdi %x0,%x1,%x1,0