diff mbox series

[PR86438] avoid too-long shift in test

Message ID orr2a82e3r.fsf@lxoliva.fsfla.org
State New
Headers show
Series [PR86438] avoid too-long shift in test | expand

Commit Message

Alexandre Oliva April 12, 2019, 1:42 a.m. UTC
The test fell back to long long and long when __int128 is not
available, but it assumed sizeof(long) < sizeof(long long) because of
a shift count that would be out of range for a long long if their
widths are the same.  Fixed by splitting it up into two shifts.

Tested on x86_64-linux-gnu, -m64 and -m32.  Hopefully Andrew and/or John
David will let me know if it fails to fix the problem on the platforms
in which they've observed it.  Thanks for the report, sorry it took me
so long to get to it.  I'm going to install this as obvious, unless
there are objections in the next few days.


for  gcc/testsuite/ChangeLog

	PR rtl-optimization/86438
	* gcc.dg/torture/pr86438.c: Split up too-wide shift.
---
 gcc/testsuite/gcc.dg/torture/pr86438.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Andrew Stubbs April 15, 2019, 11:03 a.m. UTC | #1
On 12/04/2019 02:42, Alexandre Oliva wrote:
> The test fell back to long long and long when __int128 is not
> available, but it assumed sizeof(long) < sizeof(long long) because of
> a shift count that would be out of range for a long long if their
> widths are the same.  Fixed by splitting it up into two shifts.
> 
> Tested on x86_64-linux-gnu, -m64 and -m32.  Hopefully Andrew and/or John
> David will let me know if it fails to fix the problem on the platforms
> in which they've observed it.  Thanks for the report, sorry it took me
> so long to get to it.  I'm going to install this as obvious, unless
> there are objections in the next few days.

Confirmed; the test now passes for amdgcn.

Andrew
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr86438.c b/gcc/testsuite/gcc.dg/torture/pr86438.c
index 3e95515ae6a6..5f8b463f7572 100644
--- a/gcc/testsuite/gcc.dg/torture/pr86438.c
+++ b/gcc/testsuite/gcc.dg/torture/pr86438.c
@@ -24,6 +24,6 @@  main (void)
   u64 d = (g ? 5 : 4);
   u32 f = __builtin_sub_overflow_p (d, (u128) d, (u64) 0);
   u128 x = g + f + d;
-  check (x >> (sizeof (u64) * __CHAR_BIT__), x);
+  check ((x >> 1) >> (sizeof (u64) * __CHAR_BIT__ - 1), x);
   return 0;
 }