diff mbox

PR 61084: Use widest_int in sparc_fold_builtin

Message ID 87bnuyexv7.fsf@sandifor-thinkpad.stglab.manchester.uk.ibm.com
State New
Headers show

Commit Message

Richard Sandiford May 16, 2014, 12:01 p.m. UTC
This is the second part of PR 61084, which it seems I'd forgotten to post.
pdist calculates a wide result from narrower inputs, so I should have
used widest_int rather than wide_int.

Tested by Rainer on SPARC Solaris.  OK to install?

Thanks,
Richard


gcc/
	PR target/61084
	* config/sparc/sparc.c (sparc_fold_builtin): Use widest_int rather
	than wide_int.

Comments

Eric Botcazou May 16, 2014, 5:04 p.m. UTC | #1
> This is the second part of PR 61084, which it seems I'd forgotten to post.
> pdist calculates a wide result from narrower inputs, so I should have
> used widest_int rather than wide_int.

Is that documented?  Because, if even you wide-int guys got it wrong...

> 	PR target/61084
> 	* config/sparc/sparc.c (sparc_fold_builtin): Use widest_int rather
> 	than wide_int.

OK, thanks.
Richard Sandiford May 19, 2014, 7:27 a.m. UTC | #2
Eric Botcazou <ebotcazou@adacore.com> writes:
>> This is the second part of PR 61084, which it seems I'd forgotten to post.
>> pdist calculates a wide result from narrower inputs, so I should have
>> used widest_int rather than wide_int.
>
> Is that documented?  Because, if even you wide-int guys got it wrong...

Well, I understood the distinction between wide_int and widest_int.
I just didn't understand what pdist did. :-)

The difference is documented (a bit verbosely) in wide-int.h.

Does anyone have any suggestions for a better name than "wide_int" though?
The main property of wide_int is that it has a variable precision, whereas
widest_int and offset_int have constant precisions.

Thanks,
Richard
Eric Botcazou May 19, 2014, 8:45 a.m. UTC | #3
> Well, I understood the distinction between wide_int and widest_int.
> I just didn't understand what pdist did. :-)
> 
> The difference is documented (a bit verbosely) in wide-int.h.

Yes, but not really why it's not correct to use wide_int for the computation 
made in pdist (and whether the use of widest_int could be avoided altogether 
by using a common type throughout the computation).
Richard Sandiford May 19, 2014, 8:51 a.m. UTC | #4
Eric Botcazou <ebotcazou@adacore.com> writes:
>> Well, I understood the distinction between wide_int and widest_int.
>> I just didn't understand what pdist did. :-)
>> 
>> The difference is documented (a bit verbosely) in wide-int.h.
>
> Yes, but not really why it's not correct to use wide_int for the computation 
> made in pdist

It was wrong to use wide_int because the calculation does arithmetic on
mixed QImode and DImode values.

     1) wide_int (the default).  This flavor does the math in the
     precision of its input arguments.  It is assumed (and checked)
     that the precisions of the operands and results are consistent.

The precisions weren't consistent in this case and we failed the
assertion checks.

> (and whether the use of widest_int could be avoided altogether 
> by using a common type throughout the computation).

That would work too, but widest_int seemed simpler.

Thanks,
Richard
Mike Stump May 19, 2014, 4:41 p.m. UTC | #5
On May 19, 2014, at 12:27 AM, Richard Sandiford <rdsandiford@googlemail.com> wrote:
> Does anyone have any suggestions for a better name than "wide_int" though?

Please, no.

> The main property of wide_int is that it has a variable precision, whereas
> widest_int and offset_int have constant precisions.

Right, I'd clarify that all wide_ints have a fixed precision over their lifetime; but during the creation of each, the precision for that object can be set arbitrarily (within a certain range).
diff mbox

Patch

Index: gcc/config/sparc/sparc.c
===================================================================
--- gcc/config/sparc/sparc.c	2014-05-15 13:49:25.425654068 +0100
+++ gcc/config/sparc/sparc.c	2014-05-16 12:56:48.578349758 +0100
@@ -10915,8 +10915,8 @@  sparc_fold_builtin (tree fndecl, int n_a
 	  && TREE_CODE (arg2) == INTEGER_CST)
 	{
 	  bool overflow = false;
-	  wide_int result = arg2;
-	  wide_int tmp;
+	  widest_int result = wi::to_widest (arg2);
+	  widest_int tmp;
 	  unsigned i;
 
 	  for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
@@ -10926,8 +10926,8 @@  sparc_fold_builtin (tree fndecl, int n_a
 
 	      bool neg1_ovf, neg2_ovf, add1_ovf, add2_ovf;
 
-	      tmp = wi::neg (e1, &neg1_ovf);
-	      tmp = wi::add (e0, tmp, SIGNED, &add1_ovf);
+	      tmp = wi::neg (wi::to_widest (e1), &neg1_ovf);
+	      tmp = wi::add (wi::to_widest (e0), tmp, SIGNED, &add1_ovf);
 	      if (wi::neg_p (tmp))
 		tmp = wi::neg (tmp, &neg2_ovf);
 	      else