[Bug target/24779] [4.0 Regression] Python miscompilation - TOC reload
dje at watson dot ibm dot com
gcc-bugzilla@gcc.gnu.org
Wed Nov 16 17:45:00 GMT 2005
------- Comment #5 from dje at watson dot ibm dot com 2005-11-16 17:45 -------
Subject: Re: Python miscompilation - TOC reload
Appended is a proposed patch to backport the easy_fp_constant
change to 4.0. Can you check if this fixes the problem? This patch may
hurt performance because the float extend functionality is not in 4.0.
PR target/24779
* config/rs6000/rs6000.c (easy_fp_constant): SFmode constant
0.0f is easy. Return 0 for SFmode and DFmode before reload when
flag_unsafe_math_optimizations not enabled.
* config/rs6000/rs6000.md (movdf splitter): Use
const_double_operand predicate for TARGET_POWERPC64.
Index: rs6000.c
===================================================================
*** rs6000.c (revision 106255)
--- rs6000.c (working copy)
*************** easy_fp_constant (rtx op, enum machine_m
*** 2277,2283 ****
long k[2];
REAL_VALUE_TYPE rv;
! if (TARGET_E500_DOUBLE)
return 0;
REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
--- 2277,2290 ----
long k[2];
REAL_VALUE_TYPE rv;
! /* Force constants to memory before reload to utilize
! compress_float_constant.
! Avoid this when flag_unsafe_math_optimizations is enabled
! because RDIV division to reciprocal optimization is not able
! to regenerate the division. */
! if (TARGET_E500_DOUBLE
! || (!reload_in_progress && !reload_completed
! && !flag_unsafe_math_optimizations))
return 0;
REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
*************** easy_fp_constant (rtx op, enum machine_m
*** 2291,2296 ****
--- 2298,2316 ----
{
long l;
REAL_VALUE_TYPE rv;
+
+ /* The constant 0.f is easy. */
+ if (op == CONST0_RTX (SFmode))
+ return 1;
+
+ /* Force constants to memory before reload to utilize
+ compress_float_constant.
+ Avoid this when flag_unsafe_math_optimizations is enabled
+ because RDIV division to reciprocal optimization is not able
+ to regenerate the division. */
+ if (!reload_in_progress && !reload_completed
+ && !flag_unsafe_math_optimizations)
+ return 0;
REAL_VALUE_FROM_CONST_DOUBLE (rv, op);
REAL_VALUE_TO_TARGET_SINGLE (rv, l);
Index: rs6000.md
===================================================================
*** rs6000.md (revision 106255)
--- rs6000.md (working copy)
***************
*** 8043,8049 ****
(define_split
[(set (match_operand:DF 0 "gpc_reg_operand" "")
! (match_operand:DF 1 "easy_fp_constant" ""))]
"TARGET_POWERPC64 && reload_completed
&& ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
|| (GET_CODE (operands[0]) == SUBREG
--- 8043,8049 ----
(define_split
[(set (match_operand:DF 0 "gpc_reg_operand" "")
! (match_operand:DF 1 "const_double_operand" ""))]
"TARGET_POWERPC64 && reload_completed
&& ((GET_CODE (operands[0]) == REG && REGNO (operands[0]) <= 31)
|| (GET_CODE (operands[0]) == SUBREG
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24779
More information about the Gcc-bugs
mailing list