This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFA: Fix middle-end/44769


Bootstrapping on i686-pc-linux-gnu.
We get the warnings for code that is dead, but the warnings get emitted
anyways because we use effectively if (0) rather than #if 0.
By assigning the shift count to a variable first, we can avoid the
warning for the dead code.

Although we could split the shift or use a conditional, that doesn't
look that good an option here, because BITS_PER_WORD is not always
a constant; for some targets, it depends on a gcc option.
So far, we've evaluated BITS_PER_WORD in this piece of code twice.
Using a split shift or a conditional, we'd evaluate it at least four times.
Moreover, for a split shift count, we'd have the added awkwardness
what to do to make it safe for future targets with add BITS_PER_WORD
(not counting 36, 20 or 22 as odd in this context ;-).

By assigning BITS_PER_UNIT to a variable first, we evaluate it only once.

2010-11-10  Joern Rennecke  <amylaar@spamcop.net>

	PR middle-end/44769
	* final.c (split_double): Don't use BITS_PER_WORD directly in
	shift count.

Index: final.c
===================================================================
--- final.c	(revision 166491)
+++ final.c	(working copy)
@@ -3807,10 +3807,11 @@ split_double (rtx value, rtx *first, rtx
 	     Sign extend each half to HOST_WIDE_INT.  */
 	  unsigned HOST_WIDE_INT low, high;
 	  unsigned HOST_WIDE_INT mask, sign_bit, sign_extend;
+	  unsigned bits_per_word = BITS_PER_WORD;
 
 	  /* Set sign_bit to the most significant bit of a word.  */
 	  sign_bit = 1;
-	  sign_bit <<= BITS_PER_WORD - 1;
+	  sign_bit <<= bits_per_word - 1;
 
 	  /* Set mask so that all bits of the word are set.  We could
 	     have used 1 << BITS_PER_WORD instead of basing the
@@ -3833,7 +3834,7 @@ split_double (rtx value, rtx *first, rtx
 	  /* Pick the higher word, shifted to the least significant
 	     bits, and sign-extend it.  */
 	  high = INTVAL (value);
-	  high >>= BITS_PER_WORD - 1;
+	  high >>= bits_per_word - 1;
 	  high >>= 1;
 	  high &= mask;
 	  if (high & sign_bit)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]