https://gcc.gnu.org/g:cb5a2055984ab58ace86a3789415240784ceb110
commit r17-4669-gcb5a2055984ab58ace86a3789415240784ceb110 Author: Dominic P <[email protected]> Date: Thu Sep 17 05:07:14 2026 +0100 testsuite: derive the sign shift from sizeof in minmax-swar-1 and -2 The shift count was 31 under an int32 requirement, which left the rule untested on every other int width. Tested on x86_64-pc-linux-gnu, aarch64-linux-gnu and arm-none-eabi (cortex-m0 soft). Assisted-by: Claude Opus 5 (Anthropic) gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/minmax-swar-1.c: Derive the shift count from sizeof (int); drop the int32 requirement. * gcc.dg/tree-ssa/minmax-swar-2.c: Likewise. Signed-off-by: Dominic P <[email protected]> Diff: --- gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-1.c | 20 +++++++++++--------- gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-2.c | 7 ++++--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-1.c b/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-1.c index 53bf1242cb8b..1c7395af1d4a 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-1.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-1.c @@ -1,47 +1,49 @@ /* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-forwprop1 -fdump-tree-optimized" } */ -/* { dg-require-effective-target int32 } */ + +#define SHIFT (sizeof (int) * __CHAR_BIT__ - 1) /* The branchless min and max that x264's x264_median writes. The existing - rule turns x & (x >> 31) into MIN <x, 0>; these have to finish the job. */ + rule turns x & (x >> (precision - 1)) into MIN <x, 0>; these have to finish + the job. */ int swar_min (int a, int b) { int t = a - b; - return b + (t & (t >> 31)); + return b + (t & (t >> SHIFT)); } int swar_max (int a, int b) { int t = a - b; - return a - (t & (t >> 31)); + return a - (t & (t >> SHIFT)); } int swar_min_not (int a, int b) { int t = a - b; - return a - (t & ~(t >> 31)); + return a - (t & ~(t >> SHIFT)); } int swar_max_not (int a, int b) { int t = a - b; - return b + (t & ~(t >> 31)); + return b + (t & ~(t >> SHIFT)); } /* Both uses of the one difference have to fold. */ int swar_median (int a, int b, int c) { - int t = (a - b) & ((a - b) >> 31); + int t = (a - b) & ((a - b) >> SHIFT); a -= t; b += t; - b -= (b - c) & ((b - c) >> 31); - b += (a - b) & ((a - b) >> 31); + b -= (b - c) & ((b - c) >> SHIFT); + b += (a - b) & ((a - b) >> SHIFT); return b; } diff --git a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-2.c b/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-2.c index b600d69207e9..0066b185abff 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-2.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/minmax-swar-2.c @@ -1,6 +1,7 @@ /* { dg-do compile } */ /* { dg-options "-O2 -fwrapv -fdump-tree-optimized" } */ -/* { dg-require-effective-target int32 } */ + +#define SHIFT (sizeof (int) * __CHAR_BIT__ - 1) /* With a wrapping difference the identity fails: for a = INT_MIN, b = 1 the difference wraps positive and the branchless form returns b. The inner @@ -11,14 +12,14 @@ int swar_min (int a, int b) { int t = a - b; - return b + (t & (t >> 31)); + return b + (t & (t >> SHIFT)); } int swar_max (int a, int b) { int t = a - b; - return a - (t & (t >> 31)); + return a - (t & (t >> SHIFT)); } /* { dg-final { scan-tree-dump-times "MIN_EXPR <\[^,\]*, 0>" 2 "optimized" } } */
