From: Richard Henderson Date: Mon, 20 May 2002 16:57:57 +0000 (-0700) Subject: cse.c (canon_hash): Reorder do_not_record test. X-Git-Tag: releases/gcc-3.1.1~312 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c184e413c9c7fcf6c1989da43752cc7c3943bc69;p=thirdparty%2Fgcc.git cse.c (canon_hash): Reorder do_not_record test. * cse.c (canon_hash): Reorder do_not_record test. Always allow pic_offset_table_rtx. From-SVN: r53663 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a979e0f947ab..94a36a0ac048 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-05-20 Richard Henderson + + * cse.c (canon_hash): Reorder do_not_record test. Always + allow pic_offset_table_rtx. + 2002-05-19 Neil Booth * doc/contrib.texi: Update my entry. diff --git a/gcc/cse.c b/gcc/cse.c index a607b0c46f34..570c61c3e2cc 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -2254,10 +2254,11 @@ canon_hash (x, mode) case REG: { unsigned int regno = REGNO (x); + bool record; /* On some machines, we can't record any non-fixed hard register, because extending its life will cause reload problems. We - consider ap, fp, and sp to be fixed for this purpose. + consider ap, fp, sp, gp to be fixed for this purpose. We also consider CCmode registers to be fixed for this purpose; failure to do so leads to failure to simplify 0<100 type of @@ -2267,16 +2268,28 @@ canon_hash (x, mode) Nor should we record any register that is in a small class, as defined by CLASS_LIKELY_SPILLED_P. */ - if (regno < FIRST_PSEUDO_REGISTER - && (global_regs[regno] - || CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno)) - || (SMALL_REGISTER_CLASSES - && ! fixed_regs[regno] - && x != frame_pointer_rtx - && x != hard_frame_pointer_rtx - && x != arg_pointer_rtx - && x != stack_pointer_rtx - && GET_MODE_CLASS (GET_MODE (x)) != MODE_CC))) + if (regno >= FIRST_PSEUDO_REGISTER) + record = true; + else if (x == frame_pointer_rtx + || x == hard_frame_pointer_rtx + || x == arg_pointer_rtx + || x == stack_pointer_rtx + || x == pic_offset_table_rtx) + record = true; + else if (global_regs[regno]) + record = false; + else if (fixed_regs[regno]) + record = true; + else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC) + record = true; + else if (SMALL_REGISTER_CLASSES) + record = false; + else if (CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (regno))) + record = false; + else + record = true; + + if (!record) { do_not_record = 1; return 0;