[{"id":3677797,"web_url":"http://patchwork.ozlabs.org/comment/3677797/","msgid":"<CALvbMcAs3i6KUrm4EhKDiH=fm2QBDWznCyOHGS1mmVCNfreHGA@mail.gmail.com>","list_archive_url":null,"date":"2026-04-15T19:23:30","subject":"Re: [PATCH v2] match.pd: right shift compare canonicalization\n [PR124808]","submitter":{"id":91428,"url":"http://patchwork.ozlabs.org/api/people/91428/","name":"Andrew Pinski","email":"andrew.pinski@oss.qualcomm.com"},"content":"On Wed, Apr 15, 2026 at 10:57 AM Daniel Henrique Barboza\n<daniel.barboza@oss.qualcomm.com> wrote:\n>\n> From: Daniel Barboza <daniel.barboza@oss.qualcomm.com>\n>\n> Canonicalize right shift non-equality comparisons with constants by\n> turn them into a comparison with a left shifted constant.  Assuming the\n> generic format:\n>\n> (A >> CST1) CMP CST2\n>\n> For CMP (<, >=) we'll compare A with CST2 left shifted by CST1:\n>\n> - (A >> CST1) < CST2  -> A < (CST2 << CST1)\n> - (A >> CST1) >= CST2 -> A >= (CST2 << CST1)\n>\n> And for CMP (<=, >) we need to IOR the lower CST1 bits from the left\n> shift:\n>\n> - (A >> CST1) <= CST2 -> A <= (CST2 << CST1) | mask\n> - (A >> CST1) > CST2  -> A > (CST2 << CST1) | mask\n>\n> Given that the right hand side changes involves just constants, in the\n> end we'll replace a rshift + cmp with just a cmp.\n>\n> Bootstrapped and regression tested in x86, aarch64 and RISC-V.\n>\n>         PR tree-optimization/124808\n>\n> gcc/ChangeLog:\n>\n>         * match.pd(`(A >> CST1) CMP CST2`): New pattern.\n>\n> gcc/testsuite/ChangeLog:\n>\n>         * gcc.target/arm/sat-1.c: Changed rshift GE/LE patterns to use\n>         a bit_xor instead, avoiding the transformation to be applied and\n>         preserving the test behavior.\n>         * gcc.target/i386/pr104479.c: Change 'cond_shr' to use a NE\n>         compare instead of a GE compare, making the test behave as\n>         expected without this transformation.\n\nI am not sure we want to change these 2 testcases here. Like for an\nexample, ss1 in  arm/sat-1.c we should still get:\n  _1 = x_2(D) >> 5;\n  _4 = MIN_EXPR <_1, 63>;\n  _5 = MAX_EXPR <_4, -64>;\nOn the gimple level. This might mean we need to add a few extra match\npatterns to handle the case like this (hopefully I did this\ncorrectly):\n```\n  _1 = x_2(D) >> 5;\n  if (x_2(D) < -2048)\n    goto <bb 4>; [34.00%]\n  else\n    goto <bb 3>; [66.00%]\n\n  <bb 3> :\n  _4 = MIN_EXPR <_1, 63>;\n\n  <bb 4> :\n  # _6 = PHI <-64(2), _4(3)>\n```\nAt least we should copy the testcase and xfail the original (and file\na bug for each of the missed optimizations here).\n\npr104479.c comes from a spec benchmark (I think x264 but I could be\nwrong) so changing the testcase there seems wrong.\nAnd it also means we are not optimizing it as good as we should now.\n\nThe way forwardprop handles comparisons is a problem in general and\nthat might be the issue here. IIRC for comparisons forwprop tries to\nbuild up a generic tree and then fold that.\n\nSo maybe the workaround here is to enable this pattern for GIMPLE only.\nThe other workaround is to use single_use directly instead of `:s`.\n\nThat is:\n(for cmp (le lt ge gt)\n  (simplify\n   (cmp (rshift:s@3 @0 INTEGER_CST@1) INTEGER_CST@2)\n    (if (INTEGRAL_TYPE_P (TREE_TYPE (@0) && single_use (@3))\n\nBut that might not work for the generic, so making this pattern GIMPLE\nonly might be the only way.\nThat is just using `#if GIMPLE/#endif` around it or using if (GIMPLE).\n\nThanks,\nAndrea\n\n\n>         * gcc.dg/tree-ssa/pr124808-2.c: New test.\n>         * gcc.dg/tree-ssa/pr124808.c: New test.\n> ---\n>\n> Changes from v1:\n> - changed shift amount check to use free_fits_uhwi_p\n> - use tree_int_cst_sgn() to check for positive CST2\n> - use wi:to_wide() == 0 to check for @2 == 0\n> - fixed regression on sat-1.c\n> - fixed typo in match.pd comment\n> - v1 link: https://gcc.gnu.org/pipermail/gcc-patches/2026-April/712779.html\n>\n>  gcc/match.pd                               | 52 +++++++++++++++\n>  gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c | 44 ++++++++++++\n>  gcc/testsuite/gcc.dg/tree-ssa/pr124808.c   | 78 ++++++++++++++++++++++\n>  gcc/testsuite/gcc.target/arm/sat-1.c       |  8 +--\n>  gcc/testsuite/gcc.target/i386/pr104479.c   |  2 +-\n>  5 files changed, 179 insertions(+), 5 deletions(-)\n>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c\n>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124808.c\n>\n> diff --git a/gcc/match.pd b/gcc/match.pd\n> index 7f16fd4e081..5c9172d89e6 100644\n> --- a/gcc/match.pd\n> +++ b/gcc/match.pd\n> @@ -5367,6 +5367,58 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)\n>        @0)))))\n>  #endif\n>\n> +/* PR124808: (A >> CST1) CMP CST2 -> A CMP (CST2 << CST1)\n> +   Canonicalize non-equality comparisons between a right\n> +   shift and a constant, turning it into a comparison\n> +   with a constant that is left shifted.  If we view A as:\n> +\n> +   A: \"|--- CST2 ----|--CST1--|\"\n> +\n> +   A >> CST1 will be equal to CST2 for all A values in the\n> +   range CST2 << CST1 to (CST2 << CST1) | 1s_mask (CST1).\n> +\n> +   Therefore:\n> +   - (A >> CST1) < CST2 -> A < (CST2 << CST1), A must\n> +     be smaller than all values from the range;\n> +   - (A >> CST1) <= CST2 -> A <= (CST2 << CST1) | mask,\n> +     A must be smaller or equal than the range end;\n> +   - (A >> CST1) > CST2 -> A > (CST2 << CST1) | mask,\n> +     A must be greater than all values from the range;\n> +   - (A >> CST1) >= CST2 -> A >= (CST2 << CST1), A must\n> +     be greater or equal than the range start.\n> +\n> +   We're also using \":s\" given that this class of optimizations\n> +   \"VA1 LSHIFT/RSHIFT VAL2 CMP VAL3\" tend to match CTZ|CLZ\n> +   builtin patterns.  */\n> +(for cmp (le lt ge gt)\n> + (simplify\n> +  (cmp (rshift:s @0 INTEGER_CST@1) INTEGER_CST@2)\n> +  (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))\n> +       && tree_fits_uhwi_p (@1)\n> +       && tree_to_uhwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))\n> +       && tree_int_cst_sgn (@2) >= 0\n> +       /* If @2 is nonzero check if we'll overflow when doing\n> +         @2 << @1 by doing a wi::lshift and checking if the\n> +         result is zero (i.e. overflow).  */\n> +       && (wi::to_wide (@2) == 0\n> +          || !wi::eq_p (wi::lshift (wi::to_wide (@2), wi::to_wide (@1)),\n> +                        wi::zero (TYPE_PRECISION (TREE_TYPE (@2))))))\n> +\n> +   /* No need to set the lower @1 bits of the resulting\n> +      lshift for \"<\" and \">=\" comparisons.  */\n> +   (if (cmp == LT_EXPR || cmp == GE_EXPR)\n> +    (cmp @0 (lshift @2 @1))\n> +\n> +     /* For \"<=\" and \">\" set the lower @1 lshift bits.  */\n> +     (with {\n> +       tree type2 = TREE_TYPE (@2);\n> +       unsigned prec = TYPE_PRECISION (type2);\n> +       unsigned mask_len = TREE_INT_CST_LOW (@1);\n> +       wide_int cst1_mask = wi::mask (mask_len, false, prec);\n> +      }\n> +       (cmp @0 (bit_ior (lshift @2 @1)\n> +                       { wide_int_to_tree (type2, cst1_mask); })))))))\n> +\n>  /* Rewrite an LROTATE_EXPR by a constant into an\n>     RROTATE_EXPR by a new constant.  */\n>  (simplify\n> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c\n> new file mode 100644\n> index 00000000000..c6a20467645\n> --- /dev/null\n> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c\n> @@ -0,0 +1,44 @@\n> +/* { dg-additional-options -O2 } */\n> +/* { dg-additional-options -fdump-tree-gimple } */\n> +\n> +long* SetupPrecalculatedData1 (long* a) {\n> +  long b = 1;\n> +  int i;\n> +  for (i = 0; i < 64; i++) {\n> +    if(i>>3 < 7)\n> +      a[i] += (b<<(i+8));\n> +  }\n> +  return a;\n> +}\n> +\n> +long* SetupPrecalculatedData2 (long* a) {\n> +  long b = 1;\n> +  int i;\n> +  for (i = 0; i <= 64; i++) {\n> +    if(i>>3 < 7)\n> +      a[i] += (b<<(i+8));\n> +  }\n> +  return a;\n> +}\n> +\n> +long* SetupPrecalculatedData3 (long* a) {\n> +  long b = 1;\n> +  int i;\n> +  for (i = 0; i < 64; i++) {\n> +    if(i>>3 > 7)\n> +      a[i] += (b<<(i+8));\n> +  }\n> +  return a;\n> +}\n> +\n> +long* SetupPrecalculatedData4 (long* a) {\n> +  long b = 1;\n> +  int i;\n> +  for (i = 0; i < 64; i++) {\n> +    if(i>>3 >= 7)\n> +      a[i] += (b<<(i+8));\n> +  }\n> +  return a;\n> +}\n> +\n> +/* { dg-final { scan-tree-dump-times \">> 3\" 0 gimple } } */\n> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr124808.c b/gcc/testsuite/gcc.dg/tree-ssa/pr124808.c\n> new file mode 100644\n> index 00000000000..5f3c1f0a8c4\n> --- /dev/null\n> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr124808.c\n> @@ -0,0 +1,78 @@\n> +/* { dg-do run } */\n> +/* { dg-options \"-O2\" } */\n> +\n> +void abort(void);\n> +\n> +/* Macro adapted from builtin-object-size-common.h  */\n> +#define FAIL() \\\n> +  do { \\\n> +    __builtin_printf (\"Failure at line: %d\\n\", __LINE__);      \\\n> +    abort();                                                   \\\n> +  } while (0)\n> +\n> +#define SHIFTVAL 3\n> +#define CMPVAL 1\n> +\n> +long setValue1 (long in)\n> +{\n> +  if (in >> SHIFTVAL < CMPVAL)\n> +    return in += SHIFTVAL;\n> +  return -1;\n> +}\n> +\n> +long setValue2 (long in)\n> +{\n> +  if (in >> SHIFTVAL <= CMPVAL)\n> +    return in += SHIFTVAL;\n> +  return -1;\n> +}\n> +\n> +long setValue3 (long in)\n> +{\n> +  if (in >> SHIFTVAL > CMPVAL)\n> +    return in += SHIFTVAL;\n> +  return -1;\n> +}\n> +\n> +long setValue4 (long in)\n> +{\n> +  if (in >> SHIFTVAL >= CMPVAL)\n> +    return in += SHIFTVAL;\n> +  return -1;\n> +}\n> +\n> +int main (void) {\n> +  /* setValue1: in << 3 < 1;  */\n> +  if (setValue1 (7) != 10)\n> +    FAIL ();\n> +  if (setValue1 (8) != -1)\n> +    FAIL ();\n> +\n> +  /* setValue2: in << 3 <= 1;  */\n> +  if (setValue2 (7) != 10)\n> +    FAIL ();\n> +  if (setValue2 (8) != 11)\n> +    FAIL ();\n> +  if (setValue2 (15) != 18)\n> +    FAIL ();\n> +  if (setValue2 (16) != -1)\n> +    FAIL ();\n> +\n> +  /* setValue3: in << 3 > 1;  */\n> +  if (setValue3 (15) != -1)\n> +    FAIL ();\n> +  if (setValue3 (16) != 19)\n> +    FAIL ();\n> +\n> +  /* setValue4: in << 3 >= 1;  */\n> +  if (setValue4 (7) != -1)\n> +    FAIL ();\n> +  if (setValue4 (8) != 11)\n> +    FAIL ();\n> +  if (setValue4 (15) != 18)\n> +    FAIL ();\n> +  if (setValue4 (16) != 19)\n> +    FAIL ();\n> +\n> +  return 0;\n> +}\n> diff --git a/gcc/testsuite/gcc.target/arm/sat-1.c b/gcc/testsuite/gcc.target/arm/sat-1.c\n> index ebde56a4554..b2a95924da3 100644\n> --- a/gcc/testsuite/gcc.target/arm/sat-1.c\n> +++ b/gcc/testsuite/gcc.target/arm/sat-1.c\n> @@ -26,7 +26,7 @@ int u1 (int x)\n>\n>  int us1 (int x)\n>  {\n> -  return sat1 (x >> 5, 0, 63);\n> +  return sat1 (x ^ 0xFF, 0, 63);\n>  }\n>\n>  int s1 (int x)\n> @@ -36,7 +36,7 @@ int s1 (int x)\n>\n>  int ss1 (int x)\n>  {\n> -  return sat1 (x >> 5, -64, 63);\n> +  return sat1 (x ^ 0xFF, -64, 63);\n>  }\n>\n>  int u2 (int x)\n> @@ -46,7 +46,7 @@ int u2 (int x)\n>\n>  int us2 (int x)\n>  {\n> -  return sat2 (x >> 5, 0, 63);\n> +  return sat2 (x ^ 0xFF, 0, 63);\n>  }\n>\n>  int s2 (int x)\n> @@ -56,7 +56,7 @@ int s2 (int x)\n>\n>  int ss2 (int x)\n>  {\n> -  return sat2 (x >> 5, -64, 63);\n> +  return sat2 (x ^ 0xFF, -64, 63);\n>  }\n>\n>  /* { dg-final { scan-assembler-times \"usat\" 4 } } */\n> diff --git a/gcc/testsuite/gcc.target/i386/pr104479.c b/gcc/testsuite/gcc.target/i386/pr104479.c\n> index 4ca4c482542..ff5603aae7b 100644\n> --- a/gcc/testsuite/gcc.target/i386/pr104479.c\n> +++ b/gcc/testsuite/gcc.target/i386/pr104479.c\n> @@ -12,7 +12,7 @@ cond_shr (unsigned int* __restrict dst,\n>    for(int x = 0; x < i_width; x++)\n>      {\n>        unsigned int temp = src[x] >> 3;\n> -      dst[x] =  temp > 255 ? temp : y[x];\n> +      dst[x] =  temp != 255 ? temp : y[x];\n>      }\n>  }\n>\n> --\n> 2.43.0\n>","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=h7ETL+x+;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=NoaXvru4;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=h7ETL+x+;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=NoaXvru4","sourceware.org; dmarc=none (p=none dis=none)\n header.from=oss.qualcomm.com","sourceware.org;\n spf=pass smtp.mailfrom=oss.qualcomm.com","server2.sourceware.org;\n arc=pass smtp.remote-ip=205.220.180.131"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fwrg500gFz1yHc\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 16 Apr 2026 05:24:15 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id BE0C14BA23E0\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 19:24:13 +0000 (GMT)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n [205.220.180.131])\n by sourceware.org (Postfix) with ESMTPS id 3E7014BA2E10\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 19:23:44 +0000 (GMT)","from pps.filterd (m0279868.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 63FFQJiT1702619\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 19:23:43 GMT","from mail-dy1-f199.google.com (mail-dy1-f199.google.com\n [74.125.82.199])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4djdamgtgj-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 19:23:43 +0000 (GMT)","by mail-dy1-f199.google.com with SMTP id\n 5a478bee46e88-2d9da2559aeso14074358eec.0\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 12:23:43 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org BE0C14BA23E0","OpenDKIM Filter v2.11.0 sourceware.org 3E7014BA2E10"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 3E7014BA2E10","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 3E7014BA2E10","ARC-Seal":["i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1776281024; cv=pass;\n b=XN9U/lxmWqCPN8bg5vKXRqLViDdA+uvNG/900C6gZrGw1DshNhhVF7PgwMnOT0PXv4wHPpqoWZ+iNZR7WnAYoD71Sc+wFk6ubPz3yjBDSuNLjGpqglTfUP7LcI/YODty9aLvGgxKVV8EAoNHfmZTI0JjE49gy9eEp3nUb1nC17g=","i=1; a=rsa-sha256; t=1776281022; cv=none;\n d=google.com; s=arc-20240605;\n b=VnUBkKZuypJoAfyPhHHeAlTH+7Y8FGbSrdY0UUj4Pgib2H33uA1Z7/ccR5rklEA4/w\n XELKeAYl2yuAf7KRGT5uKncOpOS8aV/jW1anqwP+XZ4+5FV/TFoqoLvF3mOHqNSyN0Kj\n vUJ3h16oNgmmgKMFvTT+PC603l65cnEBmkwwHPLl+Ehzsm5SJHX6UsIUla/ipqj8l7Pj\n pSCNgkU1ZXlL/dmWMto5HJtUv0QH+zSj+VcnempJdG9y85XtC6LYCQZkFUATHqb3K8Pj\n CKwXwozkHeobz/vkNB3LVJ7Z4B+QMDadOUNxxQ5FQftYbSFpTN7HeuuKHXDmgmeTDO9D\n EQeA=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776281024; c=relaxed/simple;\n bh=+vF1JeRBrl0dE0G/trjeX/Ot0uHP0Xh54/hLYCAs46Q=;\n h=DKIM-Signature:DKIM-Signature:MIME-Version:From:Date:Message-ID:\n Subject:To;\n b=TsxS1u8Sls/kj+R7B9TqfSY1fEQmC+XSwwcYli61wOpFXUZroVuFcjdvKKLLcUMocmJw+KwAKOwFW9Cu2WnAmLfla2gtQz8ygYyjFihNAUlM5FK5pgK8VATy0HpS15R5GOnO+1bzmmgWODk5N/oJwAC7yToD34cSYZpAkrgVoJo=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:dkim-signature;\n bh=Z8W0ZP3bC2vahmc0ZW/r42qYs/ER+kW1yqGcz4G3r+4=;\n fh=6iYHMs1AWdlXsix1dekPdk3naIOb8QIZEI8h8UsuOtQ=;\n b=aUOt+sAi5nshCjxwSyZPuPwVG1CPxyxN59DmOTdolNqipJO1w8goLvkI9jICFlisux\n AwsLIc+mivzn31yU/+QVAfYNW2VK3wZpMt6+DAAEbHFlcuBoA1YlnumdIjy1oZCpTry5\n f0zDScdxhAyrxegh6pElFlC9O0bdtaAzD/7Uscg67aMuVEIPa8VvGZWsfvu3o0iTJPcO\n uymXXgyrEmwonRQxvLxURXR/rmzE3nz+qMGusmMv5pvauqnrI+U/j5KZVvD27ti5tIR5\n NNfBTJmH8ubLZBJoWpG6fq3iynoank2t2+Sf/Eo8YNdqi/HOc3y8QV+xgjfs/kFy8/FG\n dYcA==; darn=gcc.gnu.org"],"ARC-Authentication-Results":["i=2; server2.sourceware.org","i=1; mx.google.com; arc=none"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-transfer-encoding:content-type:date:from:in-reply-to\n :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n Z8W0ZP3bC2vahmc0ZW/r42qYs/ER+kW1yqGcz4G3r+4=; b=h7ETL+x+OKBpKY0R\n qnun8pO4RRBPIAS7MBwr77f1jSpR1XXG+CJj3mn4UpuyKQoocjnn8XYdQ+3/4PoF\n R5mEDbKSxTYPQlutQrWu7M+3WvrmFGG5ak4mQGgAK6RwCj6hdsHP5GwREyxx/151\n P5O/FF7xfcagDqKpgA5JYqu/5wWemdYNQprag28yxiQeDi7rBv2RJtRt7pJRPrnI\n E1oGwGHYBwK3XPOJys0Rwx0al48jqK6cM7DfXwXK2WrmWzwY30dpm3exbSJB2HKk\n KdbXiyw8YZOXJTM/jHCz/hTII7Z1bse4KSePNQEGYxmdD3ZJS87LfJrlvXpGWsBd\n FOlX4Q==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1776281022; x=1776885822; darn=gcc.gnu.org;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=Z8W0ZP3bC2vahmc0ZW/r42qYs/ER+kW1yqGcz4G3r+4=;\n b=NoaXvru4+dGLbM+TrWjYhScSO28GzW71+T5Ejfq6mQDeiYU2rCl7z8513SoCHlU7QY\n EfcV7ZmxlNgdrhCP6yZsbVEIpyDSSaOXclXctmAAwj5+h17q8L9ggGn0Yv2UY4+tlUds\n MUnky4XKb31BVBkD9YRDCPmkUtnJ8eyMhSYKAhhudoYvqI2RyjSJMEQ3CPs4GZ8roEKU\n VcSe4ZG6JSfqSmKslIwOsHm8PKm76bFIO23zC1i95Df+IOvTvt91iOrDsHpWOhTI9e+s\n +Z6/KwrDYFDUJkpLJShIN4pKxOdXL3vm3qt1VjP8hY9AgCpNK2fdbq9xiG0JVsRym5Ne\n zknw=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776281022; x=1776885822;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=Z8W0ZP3bC2vahmc0ZW/r42qYs/ER+kW1yqGcz4G3r+4=;\n b=cz6i0wETY0LSKeowxoqdo7tzY3vL4z8MKtZxketgHZxnMn/WVmYh70SAnd5gNpkTir\n Uq8NrSP8VLE4XA4wecIMaQIBvIp4IWagtW8v/1kT05U0qxItpbavJ8OYBEP72wyOUxsE\n dLJ3/AnBbcfVb7yZhkcZPIyrUGaj+9N7FTFLxTLtBRf6LG8EG0tpTP4JUodhROwl4+lu\n LmWJ36FCWUQcOveGLVyO1djY2Nsvbh4ddUdMajkNdK8IZ++dW0KTC8Y5ex1WaiVDbJQ6\n lBDNSdi31H5gmilqHCAFvuVNfTDcyheNNgycNlAKDlzQgab8SN/XYt1cEIUyXKPG2QWB\n OcXg==","X-Gm-Message-State":"AOJu0YzmYFkiy4yoPiumrz2YS4phM/rEpR4TQc+/k4qrswlh5TOLHolc\n S85BKvclPqkOXIuHfCm5Ot7Jq35Ay1euBlx9c89kbAsfk6sdNnsVd/QLjKezXq8vAPgYkSkqs5e\n 10vo3iuaGwHlIvnAO7DDI4NNk0I579AcLJDUjlbls8kWUoLf6TsS2WlOIFoCrj5IORKiJ9elzU7\n 2qzCa6zg4+Ly30niA98fgf+SV8KIGuCIQmmHM=","X-Gm-Gg":"AeBDietMCo1W8sQaAUdkucEuWuPkVxp/iHufOJibRay1HUIeXkWhx4e+DWYx8yseuko\n iW/kOTNjdTXOe1w040Z8m/0dFq4yl5g8zjZyGAsGGs9QNFbFN7pVBCuvcGbt0v0sPEVm2ggu4Op\n Fs3a1u/PxRSSpuf3Xl0sLx7RgbnRu6KmH8heiynOPUuwc0aeERsyH2C3C1P4j5s2zdqIvieFtwP\n dvc","X-Received":["by 2002:a05:693c:2d91:b0:2ce:3aa1:d39b with SMTP id\n 5a478bee46e88-2d5898a73famr14658591eec.20.1776281022309;\n Wed, 15 Apr 2026 12:23:42 -0700 (PDT)","by 2002:a05:693c:2d91:b0:2ce:3aa1:d39b with SMTP id\n 5a478bee46e88-2d5898a73famr14658568eec.20.1776281021602; Wed, 15 Apr 2026\n 12:23:41 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260415175748.2714868-1-daniel.barboza@oss.qualcomm.com>","In-Reply-To":"<20260415175748.2714868-1-daniel.barboza@oss.qualcomm.com>","From":"Andrew Pinski <andrew.pinski@oss.qualcomm.com>","Date":"Wed, 15 Apr 2026 12:23:30 -0700","X-Gm-Features":"AQROBzCRXAnnUfmZfY7JiaGCXsbsMiySGKUQ8had7TgUQHg_BlQZgqyexHZdIxY","Message-ID":"\n <CALvbMcAs3i6KUrm4EhKDiH=fm2QBDWznCyOHGS1mmVCNfreHGA@mail.gmail.com>","Subject":"Re: [PATCH v2] match.pd: right shift compare canonicalization\n [PR124808]","To":"Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>","Cc":"gcc-patches@gcc.gnu.org, jeffrey.law@oss.qualcomm.com","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-Proofpoint-ORIG-GUID":"wdalSvFrcPuwg9xwBdX7Q0vlMi3Z6-m5","X-Authority-Analysis":"v=2.4 cv=HMjz0Itv c=1 sm=1 tr=0 ts=69dfe5bf cx=c_pps\n a=cFYjgdjTJScbgFmBucgdfQ==:117 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10\n a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22\n a=ZpdpYltYx_vBUK5n70dp:22 a=mDV3o1hIAAAA:8 a=EUspDBNiAAAA:8\n a=yFnJMebxWhnC8uHNjBsA:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22","X-Proofpoint-GUID":"wdalSvFrcPuwg9xwBdX7Q0vlMi3Z6-m5","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDE1MDE4MSBTYWx0ZWRfXxuhYmEXTDUOH\n 01/0+nF5I9THDmKcgV6h3ypYDcIvuSFrOOTKfzJCdUYjeFNLAZJ1GDYQex2cBMOQHI+qh6COro7\n wBSudd1oMl0Xi1Cs+JVWiMga4DFmz9QRqkfuxmYZgZJ6kLOqNcs5Gek8JPx0R72/xnqNd4ZolQj\n mYRC6oitSW4o+iKek/FJaBDlL2vuIqkLINjC83kBUFZIwZQA9DMi3TOuUVtjf11NpFYQgQoOOhY\n OLaVSCzUPIZx69VlTeEOnswFF4L7vNmp6IripOMjT1OdeLZiBfi8kUvoErNpumaXhVgeb2mA4bp\n 5mWFkcskk3AIuaMtZuQ+3I/1QhBOwTaI2n50q3L8QSAKJtMLZYYrPnWrIBdpBFwtc5MIEk9Ke2f\n gMVmeLmpOxCnFR3ATgqO+aXv68GBmzmWJ+yP15xz8jQUCUSdgxoLHQWhdkxDgE4SLlIrj3xcPPJ\n vi3Wy8UpuNgv15HjlxA==","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-15_01,2026-04-13_04,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n adultscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 priorityscore=1501\n clxscore=1015 impostorscore=0 spamscore=0 malwarescore=0 suspectscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2604070000 definitions=main-2604150181","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}},{"id":3677830,"web_url":"http://patchwork.ozlabs.org/comment/3677830/","msgid":"<935e37fa-ad98-4218-b68a-08b6a31302aa@oss.qualcomm.com>","list_archive_url":null,"date":"2026-04-15T21:54:38","subject":"Re: [PATCH v2] match.pd: right shift compare canonicalization\n [PR124808]","submitter":{"id":92288,"url":"http://patchwork.ozlabs.org/api/people/92288/","name":"Daniel Henrique Barboza","email":"daniel.barboza@oss.qualcomm.com"},"content":"On 4/15/2026 4:23 PM, Andrew Pinski wrote:\n> On Wed, Apr 15, 2026 at 10:57 AM Daniel Henrique Barboza\n> <daniel.barboza@oss.qualcomm.com> wrote:\n>>\n>> From: Daniel Barboza <daniel.barboza@oss.qualcomm.com>\n>>\n>> Canonicalize right shift non-equality comparisons with constants by\n>> turn them into a comparison with a left shifted constant.  Assuming the\n>> generic format:\n>>\n>> (A >> CST1) CMP CST2\n>>\n>> For CMP (<, >=) we'll compare A with CST2 left shifted by CST1:\n>>\n>> - (A >> CST1) < CST2  -> A < (CST2 << CST1)\n>> - (A >> CST1) >= CST2 -> A >= (CST2 << CST1)\n>>\n>> And for CMP (<=, >) we need to IOR the lower CST1 bits from the left\n>> shift:\n>>\n>> - (A >> CST1) <= CST2 -> A <= (CST2 << CST1) | mask\n>> - (A >> CST1) > CST2  -> A > (CST2 << CST1) | mask\n>>\n>> Given that the right hand side changes involves just constants, in the\n>> end we'll replace a rshift + cmp with just a cmp.\n>>\n>> Bootstrapped and regression tested in x86, aarch64 and RISC-V.\n>>\n>>          PR tree-optimization/124808\n>>\n>> gcc/ChangeLog:\n>>\n>>          * match.pd(`(A >> CST1) CMP CST2`): New pattern.\n>>\n>> gcc/testsuite/ChangeLog:\n>>\n>>          * gcc.target/arm/sat-1.c: Changed rshift GE/LE patterns to use\n>>          a bit_xor instead, avoiding the transformation to be applied and\n>>          preserving the test behavior.\n>>          * gcc.target/i386/pr104479.c: Change 'cond_shr' to use a NE\n>>          compare instead of a GE compare, making the test behave as\n>>          expected without this transformation.\n> \n> I am not sure we want to change these 2 testcases here. Like for an\n> example, ss1 in  arm/sat-1.c we should still get:\n>    _1 = x_2(D) >> 5;\n>    _4 = MIN_EXPR <_1, 63>;\n>    _5 = MAX_EXPR <_4, -64>;\n> On the gimple level. This might mean we need to add a few extra match\n> patterns to handle the case like this (hopefully I did this\n> correctly):\n> ```\n>    _1 = x_2(D) >> 5;\n>    if (x_2(D) < -2048)\n>      goto <bb 4>; [34.00%]\n>    else\n>      goto <bb 3>; [66.00%]\n> \n>    <bb 3> :\n>    _4 = MIN_EXPR <_1, 63>;\n> \n>    <bb 4> :\n>    # _6 = PHI <-64(2), _4(3)>\n> ```\n> At least we should copy the testcase and xfail the original (and file\n> a bug for each of the missed optimizations here).\n> \n> pr104479.c comes from a spec benchmark (I think x264 but I could be\n> wrong) so changing the testcase there seems wrong.\n> And it also means we are not optimizing it as good as we should now.\n> \n> The way forwardprop handles comparisons is a problem in general and\n> that might be the issue here. IIRC for comparisons forwprop tries to\n> build up a generic tree and then fold that.\n> \n> So maybe the workaround here is to enable this pattern for GIMPLE only.\n> The other workaround is to use single_use directly instead of `:s`.\n> \n> That is:\n> (for cmp (le lt ge gt)\n>    (simplify\n>     (cmp (rshift:s@3 @0 INTEGER_CST@1) INTEGER_CST@2)\n>      (if (INTEGRAL_TYPE_P (TREE_TYPE (@0) && single_use (@3))\n> \n> But that might not work for the generic, so making this pattern GIMPLE\n> only might be the only way.\n> That is just using `#if GIMPLE/#endif` around it or using if (GIMPLE).\n\nGuess you're on the money on both accounts.  Doing:\n\n+#if GIMPLE\n  /* PR124808: (A >> CST1) CMP CST2 -> A CMP (CST2 << CST1)\n     Canonicalize non-equality comparisons between a right\n     shift and a constant, turning it into a comparison\n@@ -5392,8 +5393,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)\n     builtin patterns.  */\n  (for cmp (le lt ge gt)\n   (simplify\n-  (cmp (rshift:s @0 INTEGER_CST@1) INTEGER_CST@2)\n+  (cmp (rshift@3 @0 INTEGER_CST@1) INTEGER_CST@2)\n    (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))\n+       && single_use (@3)\n         && tree_fits_uhwi_p (@1)\n         && tree_to_uhwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))\n         && tree_int_cst_sgn (@2) >= 0\n@@ -5418,6 +5420,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)\n        }\n         (cmp @0 (bit_ior (lshift @2 @1)\n                         { wide_int_to_tree (type2, cst1_mask); })))))))\n+#endif\n\n\nfixes both sat-1.c and pr104479.c.  I'll run some regression tests and\nsend a v3.\n\n\nThanks,\nDaniel\n\n> \n> Thanks,\n> Andrea\n> \n> \n>>          * gcc.dg/tree-ssa/pr124808-2.c: New test.\n>>          * gcc.dg/tree-ssa/pr124808.c: New test.\n>> ---\n>>\n>> Changes from v1:\n>> - changed shift amount check to use free_fits_uhwi_p\n>> - use tree_int_cst_sgn() to check for positive CST2\n>> - use wi:to_wide() == 0 to check for @2 == 0\n>> - fixed regression on sat-1.c\n>> - fixed typo in match.pd comment\n>> - v1 link: https://gcc.gnu.org/pipermail/gcc-patches/2026-April/712779.html\n>>\n>>   gcc/match.pd                               | 52 +++++++++++++++\n>>   gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c | 44 ++++++++++++\n>>   gcc/testsuite/gcc.dg/tree-ssa/pr124808.c   | 78 ++++++++++++++++++++++\n>>   gcc/testsuite/gcc.target/arm/sat-1.c       |  8 +--\n>>   gcc/testsuite/gcc.target/i386/pr104479.c   |  2 +-\n>>   5 files changed, 179 insertions(+), 5 deletions(-)\n>>   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c\n>>   create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr124808.c\n>>\n>> diff --git a/gcc/match.pd b/gcc/match.pd\n>> index 7f16fd4e081..5c9172d89e6 100644\n>> --- a/gcc/match.pd\n>> +++ b/gcc/match.pd\n>> @@ -5367,6 +5367,58 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)\n>>         @0)))))\n>>   #endif\n>>\n>> +/* PR124808: (A >> CST1) CMP CST2 -> A CMP (CST2 << CST1)\n>> +   Canonicalize non-equality comparisons between a right\n>> +   shift and a constant, turning it into a comparison\n>> +   with a constant that is left shifted.  If we view A as:\n>> +\n>> +   A: \"|--- CST2 ----|--CST1--|\"\n>> +\n>> +   A >> CST1 will be equal to CST2 for all A values in the\n>> +   range CST2 << CST1 to (CST2 << CST1) | 1s_mask (CST1).\n>> +\n>> +   Therefore:\n>> +   - (A >> CST1) < CST2 -> A < (CST2 << CST1), A must\n>> +     be smaller than all values from the range;\n>> +   - (A >> CST1) <= CST2 -> A <= (CST2 << CST1) | mask,\n>> +     A must be smaller or equal than the range end;\n>> +   - (A >> CST1) > CST2 -> A > (CST2 << CST1) | mask,\n>> +     A must be greater than all values from the range;\n>> +   - (A >> CST1) >= CST2 -> A >= (CST2 << CST1), A must\n>> +     be greater or equal than the range start.\n>> +\n>> +   We're also using \":s\" given that this class of optimizations\n>> +   \"VA1 LSHIFT/RSHIFT VAL2 CMP VAL3\" tend to match CTZ|CLZ\n>> +   builtin patterns.  */\n>> +(for cmp (le lt ge gt)\n>> + (simplify\n>> +  (cmp (rshift:s @0 INTEGER_CST@1) INTEGER_CST@2)\n>> +  (if (INTEGRAL_TYPE_P (TREE_TYPE (@0))\n>> +       && tree_fits_uhwi_p (@1)\n>> +       && tree_to_uhwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))\n>> +       && tree_int_cst_sgn (@2) >= 0\n>> +       /* If @2 is nonzero check if we'll overflow when doing\n>> +         @2 << @1 by doing a wi::lshift and checking if the\n>> +         result is zero (i.e. overflow).  */\n>> +       && (wi::to_wide (@2) == 0\n>> +          || !wi::eq_p (wi::lshift (wi::to_wide (@2), wi::to_wide (@1)),\n>> +                        wi::zero (TYPE_PRECISION (TREE_TYPE (@2))))))\n>> +\n>> +   /* No need to set the lower @1 bits of the resulting\n>> +      lshift for \"<\" and \">=\" comparisons.  */\n>> +   (if (cmp == LT_EXPR || cmp == GE_EXPR)\n>> +    (cmp @0 (lshift @2 @1))\n>> +\n>> +     /* For \"<=\" and \">\" set the lower @1 lshift bits.  */\n>> +     (with {\n>> +       tree type2 = TREE_TYPE (@2);\n>> +       unsigned prec = TYPE_PRECISION (type2);\n>> +       unsigned mask_len = TREE_INT_CST_LOW (@1);\n>> +       wide_int cst1_mask = wi::mask (mask_len, false, prec);\n>> +      }\n>> +       (cmp @0 (bit_ior (lshift @2 @1)\n>> +                       { wide_int_to_tree (type2, cst1_mask); })))))))\n>> +\n>>   /* Rewrite an LROTATE_EXPR by a constant into an\n>>      RROTATE_EXPR by a new constant.  */\n>>   (simplify\n>> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c\n>> new file mode 100644\n>> index 00000000000..c6a20467645\n>> --- /dev/null\n>> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr124808-2.c\n>> @@ -0,0 +1,44 @@\n>> +/* { dg-additional-options -O2 } */\n>> +/* { dg-additional-options -fdump-tree-gimple } */\n>> +\n>> +long* SetupPrecalculatedData1 (long* a) {\n>> +  long b = 1;\n>> +  int i;\n>> +  for (i = 0; i < 64; i++) {\n>> +    if(i>>3 < 7)\n>> +      a[i] += (b<<(i+8));\n>> +  }\n>> +  return a;\n>> +}\n>> +\n>> +long* SetupPrecalculatedData2 (long* a) {\n>> +  long b = 1;\n>> +  int i;\n>> +  for (i = 0; i <= 64; i++) {\n>> +    if(i>>3 < 7)\n>> +      a[i] += (b<<(i+8));\n>> +  }\n>> +  return a;\n>> +}\n>> +\n>> +long* SetupPrecalculatedData3 (long* a) {\n>> +  long b = 1;\n>> +  int i;\n>> +  for (i = 0; i < 64; i++) {\n>> +    if(i>>3 > 7)\n>> +      a[i] += (b<<(i+8));\n>> +  }\n>> +  return a;\n>> +}\n>> +\n>> +long* SetupPrecalculatedData4 (long* a) {\n>> +  long b = 1;\n>> +  int i;\n>> +  for (i = 0; i < 64; i++) {\n>> +    if(i>>3 >= 7)\n>> +      a[i] += (b<<(i+8));\n>> +  }\n>> +  return a;\n>> +}\n>> +\n>> +/* { dg-final { scan-tree-dump-times \">> 3\" 0 gimple } } */\n>> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr124808.c b/gcc/testsuite/gcc.dg/tree-ssa/pr124808.c\n>> new file mode 100644\n>> index 00000000000..5f3c1f0a8c4\n>> --- /dev/null\n>> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr124808.c\n>> @@ -0,0 +1,78 @@\n>> +/* { dg-do run } */\n>> +/* { dg-options \"-O2\" } */\n>> +\n>> +void abort(void);\n>> +\n>> +/* Macro adapted from builtin-object-size-common.h  */\n>> +#define FAIL() \\\n>> +  do { \\\n>> +    __builtin_printf (\"Failure at line: %d\\n\", __LINE__);      \\\n>> +    abort();                                                   \\\n>> +  } while (0)\n>> +\n>> +#define SHIFTVAL 3\n>> +#define CMPVAL 1\n>> +\n>> +long setValue1 (long in)\n>> +{\n>> +  if (in >> SHIFTVAL < CMPVAL)\n>> +    return in += SHIFTVAL;\n>> +  return -1;\n>> +}\n>> +\n>> +long setValue2 (long in)\n>> +{\n>> +  if (in >> SHIFTVAL <= CMPVAL)\n>> +    return in += SHIFTVAL;\n>> +  return -1;\n>> +}\n>> +\n>> +long setValue3 (long in)\n>> +{\n>> +  if (in >> SHIFTVAL > CMPVAL)\n>> +    return in += SHIFTVAL;\n>> +  return -1;\n>> +}\n>> +\n>> +long setValue4 (long in)\n>> +{\n>> +  if (in >> SHIFTVAL >= CMPVAL)\n>> +    return in += SHIFTVAL;\n>> +  return -1;\n>> +}\n>> +\n>> +int main (void) {\n>> +  /* setValue1: in << 3 < 1;  */\n>> +  if (setValue1 (7) != 10)\n>> +    FAIL ();\n>> +  if (setValue1 (8) != -1)\n>> +    FAIL ();\n>> +\n>> +  /* setValue2: in << 3 <= 1;  */\n>> +  if (setValue2 (7) != 10)\n>> +    FAIL ();\n>> +  if (setValue2 (8) != 11)\n>> +    FAIL ();\n>> +  if (setValue2 (15) != 18)\n>> +    FAIL ();\n>> +  if (setValue2 (16) != -1)\n>> +    FAIL ();\n>> +\n>> +  /* setValue3: in << 3 > 1;  */\n>> +  if (setValue3 (15) != -1)\n>> +    FAIL ();\n>> +  if (setValue3 (16) != 19)\n>> +    FAIL ();\n>> +\n>> +  /* setValue4: in << 3 >= 1;  */\n>> +  if (setValue4 (7) != -1)\n>> +    FAIL ();\n>> +  if (setValue4 (8) != 11)\n>> +    FAIL ();\n>> +  if (setValue4 (15) != 18)\n>> +    FAIL ();\n>> +  if (setValue4 (16) != 19)\n>> +    FAIL ();\n>> +\n>> +  return 0;\n>> +}\n>> diff --git a/gcc/testsuite/gcc.target/arm/sat-1.c b/gcc/testsuite/gcc.target/arm/sat-1.c\n>> index ebde56a4554..b2a95924da3 100644\n>> --- a/gcc/testsuite/gcc.target/arm/sat-1.c\n>> +++ b/gcc/testsuite/gcc.target/arm/sat-1.c\n>> @@ -26,7 +26,7 @@ int u1 (int x)\n>>\n>>   int us1 (int x)\n>>   {\n>> -  return sat1 (x >> 5, 0, 63);\n>> +  return sat1 (x ^ 0xFF, 0, 63);\n>>   }\n>>\n>>   int s1 (int x)\n>> @@ -36,7 +36,7 @@ int s1 (int x)\n>>\n>>   int ss1 (int x)\n>>   {\n>> -  return sat1 (x >> 5, -64, 63);\n>> +  return sat1 (x ^ 0xFF, -64, 63);\n>>   }\n>>\n>>   int u2 (int x)\n>> @@ -46,7 +46,7 @@ int u2 (int x)\n>>\n>>   int us2 (int x)\n>>   {\n>> -  return sat2 (x >> 5, 0, 63);\n>> +  return sat2 (x ^ 0xFF, 0, 63);\n>>   }\n>>\n>>   int s2 (int x)\n>> @@ -56,7 +56,7 @@ int s2 (int x)\n>>\n>>   int ss2 (int x)\n>>   {\n>> -  return sat2 (x >> 5, -64, 63);\n>> +  return sat2 (x ^ 0xFF, -64, 63);\n>>   }\n>>\n>>   /* { dg-final { scan-assembler-times \"usat\" 4 } } */\n>> diff --git a/gcc/testsuite/gcc.target/i386/pr104479.c b/gcc/testsuite/gcc.target/i386/pr104479.c\n>> index 4ca4c482542..ff5603aae7b 100644\n>> --- a/gcc/testsuite/gcc.target/i386/pr104479.c\n>> +++ b/gcc/testsuite/gcc.target/i386/pr104479.c\n>> @@ -12,7 +12,7 @@ cond_shr (unsigned int* __restrict dst,\n>>     for(int x = 0; x < i_width; x++)\n>>       {\n>>         unsigned int temp = src[x] >> 3;\n>> -      dst[x] =  temp > 255 ? temp : y[x];\n>> +      dst[x] =  temp != 255 ? temp : y[x];\n>>       }\n>>   }\n>>\n>> --\n>> 2.43.0\n>>","headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=XfW0u8wq;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=KRk8AwOx;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=XfW0u8wq;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=KRk8AwOx","sourceware.org; dmarc=none (p=none dis=none)\n header.from=oss.qualcomm.com","sourceware.org;\n spf=pass smtp.mailfrom=oss.qualcomm.com","server2.sourceware.org;\n arc=none smtp.remote-ip=205.220.180.131"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fww1L19lFz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 16 Apr 2026 07:55:16 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id E2F264BA2E32\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 21:55:14 +0000 (GMT)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n [205.220.180.131])\n by sourceware.org (Postfix) with ESMTPS id 4E2464BA2E0A\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 21:54:43 +0000 (GMT)","from pps.filterd (m0279871.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 63FGEp7n506783\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 21:54:42 GMT","from mail-qv1-f71.google.com (mail-qv1-f71.google.com\n [209.85.219.71])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dje1e101r-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 21:54:42 +0000 (GMT)","by mail-qv1-f71.google.com with SMTP id\n 6a1803df08f44-8a22dbeeb96so162262836d6.3\n for <gcc-patches@gcc.gnu.org>; Wed, 15 Apr 2026 14:54:42 -0700 (PDT)","from [192.168.68.100] ([179.135.35.92])\n by smtp.gmail.com with ESMTPSA id\n 6a1803df08f44-8ae6c93b7e2sm21469786d6.8.2026.04.15.14.54.39\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Wed, 15 Apr 2026 14:54:40 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org E2F264BA2E32","OpenDKIM Filter v2.11.0 sourceware.org 4E2464BA2E0A"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 4E2464BA2E0A","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 4E2464BA2E0A","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776290083; cv=none;\n b=jCQRZ5BUy83DWa5owDIGVuQrMdFmaeSCkw5nXL3TBRsnpJtefn1nC/AF6Mim9GF6MLpeYd7DsB3GojRDlw5TnuoSyfnbJz/KZmMryPVfzw7uzfY7k04gi9RoHmwhZu/6qLY9b0MjL9yh0iMLrl4sal5rCyuxy/3DKJL2kPIPyts=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776290083; c=relaxed/simple;\n bh=V9gaf60NrHRuei10DZdnElVz4SrdDljtkpkvxa12f8Y=;\n h=DKIM-Signature:DKIM-Signature:Message-ID:Date:MIME-Version:\n Subject:To:From;\n b=gEyvSxFQ5bWBglhlekfWdzpXwYKZulPwl3oSbwKLpEsoUrGPIcXebUrvpf8BI/57wa6BVRHMRVTD/RG07L1XwCYrHwUL5355OHHJ6qaqLlK1Xfhl75Wu04dqe+njaIfhkfQdw1UsAyCyRLm7kLfPnqcs62koiTtkFtcPQtZ+Rl0=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-transfer-encoding:content-type:date:from:in-reply-to\n :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n 4TnhZ+1vorLzcHhGvIvP62RpGIZR9tnXK0WDlJyEP5g=; b=XfW0u8wqCZeuTAxm\n /UJoKw4ZmtfRvbDvU5BYxAFNxSaXodmmSnDwD0VgbYX/vG1zibZsHRAiFLrE44Ah\n sfF0u3A+eHx+pKH/50N+XUcDfLYjZ96uC2ADXPJaDCqjTR3CnICaSFhaapwl/pa/\n BXr0ZbLdC9yZriCV/wn2GbiqJRak9glCIwFUt1uVpclV0u+XNRRBQtoug6xMjHGa\n 3pGtKWOMAN8GNqGh2+lKhkIwaZlP6HU+kzek+ocZpyp36MJtzF1UvvJMIYvLij76\n kk7R+QSP5gPbt3YJyE9eXIgV93YqLZtpTkRREa20a7zqS3JcBwnhIGFqctrDdtAX\n 9jVMbA==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1776290082; x=1776894882; darn=gcc.gnu.org;\n h=content-transfer-encoding:in-reply-to:content-language:from\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :from:to:cc:subject:date:message-id:reply-to;\n bh=4TnhZ+1vorLzcHhGvIvP62RpGIZR9tnXK0WDlJyEP5g=;\n b=KRk8AwOxvCttbKAjUz90P1D3POlUJZZbK4ZTGIdCr39XFcsVqMCDxjjqWN0z4uP28v\n x8yALJG56hCefvKqWDLwUV+QW5RxYnyIvtpy+CzA2VCfYWcmuAUInTpmUtjJxdOHyqew\n xpkTjGBYOJSOqDZDf46IgNWuMfLyVPyRmzMC4cnR6lXnAJtPX/vnTQG/c7sSbkHBextl\n W1qu5+ZWx0F4p0VEkdv+rQDzREHSfZhfLNdOWbKiqA60j1Wi7nAJTgvMcCJy8rjhSosu\n hqo1FbNJGg8oBMX/5R5AQLTKlcUYIK5NHY7SUWSX53NI112OxkdjioSUGhvvTNGbnhZ5\n OdVg=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776290082; x=1776894882;\n h=content-transfer-encoding:in-reply-to:content-language:from\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=4TnhZ+1vorLzcHhGvIvP62RpGIZR9tnXK0WDlJyEP5g=;\n b=hYN9OGUkbTWuxjXCEZeTJZFfMMiugMvqqoWjL8tHpUI8qt7967q/0JOaq7DnZ0Fstk\n GxTBVQqTVOsE/eGylikibVr0MQKP45K0b7GASI6KiI942U//Xsv9GGKh8lXM9qGz1nPk\n B/bI8aVd4BUUPfMashkQow7FSoVdBphW5hzCuA/A3j9ZHDDmx0P8MAMEKyMFjTUwiC8I\n eYGaNm9yowf12g71ArfcUKR9wvdmCaDUdyk0WeDnNjLgLQVHsQRKahuvnCP+jx/6JglV\n XWrx+C1mONXrN7Q0mSZo7C444V/AMETJwBdYtrZgRyKAbkf9alam/qajgvLEOen7F1g0\n rYlw==","X-Gm-Message-State":"AOJu0Yx5+cqTFfHK2OurD09f3VPXvgd0nnNsU2hV1rYVbCA4YK4hav7q\n DhLRevtYt7fd5dZCrPn5iXELZ+U0bD7Xg6WEdqXpVqmieUHN5w3C1L9/ru2JE7lyiFhc4+FXiKT\n a76ZylGYNRrn+ol8bRko6vJJw0Kw70kaM3FLssFNswQ0lJFcMVjEV7B+kJZ6X","X-Gm-Gg":"AeBDieueqyNaQUb3ZtoA/DQDwBzYkz/0zFJcKqc7Hmskf1ZX88pw6rQN2k72OMUVK+0\n Uno3PynQQUBV8I+PFH3+8bM+az1yWqg0LdMzhgrSnEBq9W7eAbZqR+XLNwE78deU69DxAncC5OH\n Y3a6+5YjB/58hojLtz0fwufRempJtILIeCroprbFrvZClHzI9tKxxe768nBIde6wkOH88F8ppmc\n il2dfeb2AL5nwidb3rSfQ8wLWyLt5QCAY4SBftQUAyqCZPY0qFs4jL75kmus6btu/FACMa0nTbj\n XWmZsxGooOw8HpB5YeH0S6vjwEbeLJVgZvtK8Sy9oOpI9ZFMD4gqLmOY+Tcv2OvspBtSk+WEhIV\n kALg+7/nzSskP9vPFFTQiVRYIlUJIbNoXqEtrGC5Jp3h+g7JEOJZRfe2CXVbTlh9IsEw=","X-Received":["by 2002:a05:6214:808f:b0:8ac:801d:c3dc with SMTP id\n 6a1803df08f44-8ac860ba87emr361500396d6.9.1776290081624;\n Wed, 15 Apr 2026 14:54:41 -0700 (PDT)","by 2002:a05:6214:808f:b0:8ac:801d:c3dc with SMTP id\n 6a1803df08f44-8ac860ba87emr361499866d6.9.1776290081015;\n Wed, 15 Apr 2026 14:54:41 -0700 (PDT)"],"Message-ID":"<935e37fa-ad98-4218-b68a-08b6a31302aa@oss.qualcomm.com>","Date":"Wed, 15 Apr 2026 18:54:38 -0300","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2] match.pd: right shift compare canonicalization\n [PR124808]","To":"Andrew Pinski <andrew.pinski@oss.qualcomm.com>","Cc":"gcc-patches@gcc.gnu.org, jeffrey.law@oss.qualcomm.com","References":"<20260415175748.2714868-1-daniel.barboza@oss.qualcomm.com>\n <CALvbMcAs3i6KUrm4EhKDiH=fm2QBDWznCyOHGS1mmVCNfreHGA@mail.gmail.com>","From":"Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com>","Content-Language":"en-US","In-Reply-To":"\n <CALvbMcAs3i6KUrm4EhKDiH=fm2QBDWznCyOHGS1mmVCNfreHGA@mail.gmail.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-Authority-Analysis":"v=2.4 cv=HZwkiCE8 c=1 sm=1 tr=0 ts=69e00922 cx=c_pps\n a=UgVkIMxJMSkC9lv97toC5g==:117 a=KyJ3S0LjDRcVxFrLRjekIg==:17\n a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10\n a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22\n a=mDV3o1hIAAAA:8 a=EUspDBNiAAAA:8 a=tcFOILPosDSM4VDIFHwA:9 a=3ZKOabzyN94A:10\n a=QEXdDO2ut3YA:10 a=1HOtulTD9v-eNWfpl4qZ:22","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDE1MDIwNCBTYWx0ZWRfX9HYKqvhEFDqP\n Xu7coffe6wsKw7dliQyh+KB3k1BmmOK0Gq0Y/UwHku7OCP+j11VZGwkl6m7tRxcsSD0BcdWwx47\n KeEhmr9NWKL47sAcLll5suJXoPDCtKlePzwRwYiCJkHChlYqWRkN8MOPJoqXiqPHwa4e0Whei4q\n Lj4GlXD78WcVtKEv9T7Q7bON/SXio5Cl0doFipdWrQn7oFfKmLhsEr2UZ4AlAOYf6nJOw9VJIqK\n 4GtaacS1AOD+EHcf++468SGi/MXUcJD0oD6ddOL8r4SnJ6DM7DWU9xXvxgugR/LbofK0KtK2VDx\n pF7Ics1PHE5JtKRt3GIaokzCrBqykGp1oNeB94sBa6CCMCHo9xsx9mw4JJ+ia3p/6je++EPxy8z\n TooS9Gtaog5cY6kUirLnTS+jTbEXxwUNrSS1QG2B2OyNtbqUcvBEXy2J7YFU4clbOoGYHX09b6g\n 0V6pDtZB54n0eT/aFTg==","X-Proofpoint-ORIG-GUID":"M_c-rIXBln8vS0jdPKrC48iMQsdZH4dT","X-Proofpoint-GUID":"M_c-rIXBln8vS0jdPKrC48iMQsdZH4dT","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-15_01,2026-04-13_04,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0\n clxscore=1015 malwarescore=0 priorityscore=1501 spamscore=0 phishscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2604070000 definitions=main-2604150204","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"}}]