diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/varasm.c | 21 |
2 files changed, 20 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ef77e9e..c47536a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2001-07-28 Richard Henderson <rth@redhat.com> + * varasm.c (immed_real_const_1): Don't elide special cases for + nested functions. + (clear_const_double_mem): Clear const_tiny_rtx too. + +2001-07-28 Richard Henderson <rth@redhat.com> + * dwarf2out.c (dw_val_class_offset): New. (struct dw_ranges_struct, dw_ranges_ref): New. (ranges_table, ranges_table_allocated): New. diff --git a/gcc/varasm.c b/gcc/varasm.c index e739784..4b9438e 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -1917,19 +1917,15 @@ immed_real_const_1 (d, mode) u.d = d; - /* Detect special cases. But be careful we don't use a CONST_DOUBLE - that's from a parent function since it may be in its constant pool. */ - if (REAL_VALUES_IDENTICAL (dconst0, d) - && (cfun == 0 || decl_function_context (current_function_decl) == 0)) + /* Detect special cases. */ + if (REAL_VALUES_IDENTICAL (dconst0, d)) return CONST0_RTX (mode); /* Check for NaN first, because some ports (specifically the i386) do not emit correct ieee-fp code by default, and thus will generate a core dump here if we pass a NaN to REAL_VALUES_EQUAL and if REAL_VALUES_EQUAL does a floating point comparison. */ - else if ((! REAL_VALUE_ISNAN (d) && REAL_VALUES_EQUAL (dconst1, d)) - && (cfun == 0 - || decl_function_context (current_function_decl) == 0)) + else if (! REAL_VALUE_ISNAN (d) && REAL_VALUES_EQUAL (dconst1, d)) return CONST1_RTX (mode); if (sizeof u == sizeof (HOST_WIDE_INT)) @@ -1996,6 +1992,8 @@ void clear_const_double_mem () { register rtx r, next; + enum machine_mode mode; + int i; for (r = const_double_chain; r; r = next) { @@ -2004,6 +2002,15 @@ clear_const_double_mem () CONST_DOUBLE_MEM (r) = cc0_rtx; } const_double_chain = 0; + + for (i = 0; i <= 2; i++) + for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT); mode != VOIDmode; + mode = GET_MODE_WIDER_MODE (mode)) + { + r = const_tiny_rtx[i][(int) mode]; + CONST_DOUBLE_CHAIN (r) = 0; + CONST_DOUBLE_MEM (r) = cc0_rtx; + } } /* Given an expression EXP with a constant value, |