From: Steve Ellcey Date: Mon, 9 Oct 2006 18:26:35 +0000 (+0000) Subject: re PR target/28490 (ICE in ia64_expand_move, at config/ia64/ia64.c:1088) X-Git-Tag: releases/gcc-4.0.4~301 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7fb50c10a4745657b8b084c030de0cec85e24035;p=thirdparty%2Fgcc.git re PR target/28490 (ICE in ia64_expand_move, at config/ia64/ia64.c:1088) PR target/28490 Backport from mainline 2006-09-15 Jim Wilson 2006-09-19 Steve Ellcey * config/ia64/ia64.c (ia64_legitimate_constant_p): Allow function pointers as legitimate constants. Handle symbol offsets same as they are handled in ia64_expand_move and move_operand. From-SVN: r117583 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 597da2e099bc..f0a7bf08e885 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-10-09 Steve Ellcey + + PR target/28490 + Backport from mainline + 2006-09-15 Jim Wilson + 2006-09-19 Steve Ellcey + * config/ia64/ia64.c (ia64_legitimate_constant_p): Allow function + pointers as legitimate constants. Handle symbol offsets same as + they are handled in ia64_expand_move and move_operand. + 2006-10-08 Andrew Pinski PR debug/28980 diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index c4fd00b88744..6981091da169 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -741,7 +741,30 @@ ia64_legitimate_constant_p (rtx x) case CONST: case SYMBOL_REF: - return tls_symbolic_operand_type (x) == 0; + /* ??? Short term workaround for PR 28490. We must make the code here + match the code in ia64_expand_move and move_operand, even though they + are both technically wrong. */ + if (tls_symbolic_operand_type (x) == 0) + { + HOST_WIDE_INT addend = 0; + rtx op = x; + + if (GET_CODE (op) == CONST + && GET_CODE (XEXP (op, 0)) == PLUS + && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT) + { + addend = INTVAL (XEXP (XEXP (op, 0), 1)); + op = XEXP (XEXP (op, 0), 0); + } + + if (any_offset_symbol_operand (op, GET_MODE (op)) + || function_operand (op, GET_MODE (op))) + return true; + if (aligned_offset_symbol_operand (op, GET_MODE (op))) + return (addend & 0x3fff) == 0; + return false; + } + return false; default: return false;