Commit bf00cc0f by Alan Modra Committed by Alan Modra

re PR target/24997 (ICE with -ftree-vectorize)

	PR target/24997
	* config/rs6000/rs6000.c (legitimate_indexed_address_p): Allow pattern
	generated by reload.
	* config/rs6000/predicates.md (indexed_or_indirect_operand): Use
	indexed_or_indirect_address.
	(indexed_or_indirect_address): Don't test for base reg.  Call
	address_operand last.  Make it a special predicate.

From-SVN: r107591
parent 24a62419
2005-11-28 Alan Modra <amodra@bigpond.net.au>
PR target/24997
* config/rs6000/rs6000.c (legitimate_indexed_address_p): Allow pattern
generated by reload.
* config/rs6000/predicates.md (indexed_or_indirect_operand): Use
indexed_or_indirect_address.
(indexed_or_indirect_address): Don't test for base reg. Call
address_operand last. Make it a special predicate.
2005-11-27 Kazu Hirata <kazu@codesourcery.com> 2005-11-27 Kazu Hirata <kazu@codesourcery.com>
* config/m68k/m68k.c (notice_update_cc): Remove useless code. * config/m68k/m68k.c (notice_update_cc): Remove useless code.
......
...@@ -353,25 +353,6 @@ ...@@ -353,25 +353,6 @@
|| reload_in_progress, || reload_in_progress,
mode, XEXP (op, 0))"))) mode, XEXP (op, 0))")))
;; Return 1 if the operand is an indexed or indirect memory operand.
(define_predicate "indexed_or_indirect_operand"
(match_operand 0 "memory_operand")
{
rtx tmp = XEXP (op, 0);
if (TARGET_ALTIVEC
&& ALTIVEC_VECTOR_MODE (mode)
&& GET_CODE (tmp) == AND
&& GET_CODE (XEXP (tmp, 1)) == CONST_INT
&& INTVAL (XEXP (tmp, 1)) == -16)
tmp = XEXP (tmp, 0);
return REG_P (tmp)
|| (GET_CODE (tmp) == PLUS
&& REG_P (XEXP (tmp, 0))
&& REG_P (XEXP (tmp, 1)));
})
;; Return 1 if the operand is a memory operand with an address divisible by 4 ;; Return 1 if the operand is a memory operand with an address divisible by 4
(define_predicate "word_offset_memref_operand" (define_predicate "word_offset_memref_operand"
(and (match_operand 0 "memory_operand") (and (match_operand 0 "memory_operand")
...@@ -380,13 +361,28 @@ ...@@ -380,13 +361,28 @@
|| GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT
|| INTVAL (XEXP (XEXP (op, 0), 1)) % 4 == 0"))) || INTVAL (XEXP (XEXP (op, 0), 1)) % 4 == 0")))
;; Return 1 if the operand is an indexed or indirect memory operand.
(define_predicate "indexed_or_indirect_operand"
(match_code "mem")
{
op = XEXP (op, 0);
if (TARGET_ALTIVEC
&& ALTIVEC_VECTOR_MODE (mode)
&& GET_CODE (op) == AND
&& GET_CODE (XEXP (op, 1)) == CONST_INT
&& INTVAL (XEXP (op, 1)) == -16)
op = XEXP (op, 0);
return indexed_or_indirect_address (op, mode);
})
;; Return 1 if the operand is an indexed or indirect address. ;; Return 1 if the operand is an indexed or indirect address.
(define_predicate "indexed_or_indirect_address" (define_special_predicate "indexed_or_indirect_address"
(and (match_operand 0 "address_operand") (and (match_test "REG_P (op)
(match_test "REG_P (op)
|| (GET_CODE (op) == PLUS || (GET_CODE (op) == PLUS
&& REG_P (XEXP (op, 0)) /* Omit testing REG_P (XEXP (op, 0)). */
&& REG_P (XEXP (op, 1)))"))) && REG_P (XEXP (op, 1)))")
(match_operand 0 "address_operand")))
;; Used for the destination of the fix_truncdfsi2 expander. ;; Used for the destination of the fix_truncdfsi2 expander.
;; If stfiwx will be used, the result goes to memory; otherwise, ;; If stfiwx will be used, the result goes to memory; otherwise,
......
...@@ -2731,13 +2731,23 @@ legitimate_indexed_address_p (rtx x, int strict) ...@@ -2731,13 +2731,23 @@ legitimate_indexed_address_p (rtx x, int strict)
op0 = XEXP (x, 0); op0 = XEXP (x, 0);
op1 = XEXP (x, 1); op1 = XEXP (x, 1);
if (!REG_P (op0) || !REG_P (op1)) if (REG_P (op0) && REG_P (op1))
return false; return ((INT_REG_OK_FOR_BASE_P (op0, strict)
&& INT_REG_OK_FOR_INDEX_P (op1, strict))
return ((INT_REG_OK_FOR_BASE_P (op0, strict) || (INT_REG_OK_FOR_BASE_P (op1, strict)
&& INT_REG_OK_FOR_INDEX_P (op1, strict)) && INT_REG_OK_FOR_INDEX_P (op0, strict)));
|| (INT_REG_OK_FOR_BASE_P (op1, strict)
&& INT_REG_OK_FOR_INDEX_P (op0, strict))); /* Recognize the rtl generated by reload which we know will later be
replaced by a base reg. We rely on nothing but reload generating
this particular pattern, a reasonable assumption because it is not
canonical. */
else if (reload_in_progress
&& GET_CODE (op0) == PLUS
&& REG_P (XEXP (op0, 0))
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
&& REG_P (op1))
return INT_REG_OK_FOR_INDEX_P (op1, strict);
return false;
} }
inline bool inline bool
......
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