{"id":2232115,"url":"http://patchwork.ozlabs.org/api/patches/2232115/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260502180223.410876-1-avinal.xlvii@gmail.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260502180223.410876-1-avinal.xlvii@gmail.com>","list_archive_url":null,"date":"2026-05-02T18:02:23","name":"match: Optimize `A > B ? ABS(A) : B` to `MAX(A, B)` when B >= 0 [PR116700]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"7804b0269090dae9defad32420bffba27292bddf","submitter":{"id":88549,"url":"http://patchwork.ozlabs.org/api/people/88549/?format=json","name":"Avinal Kumar","email":"avinal.xlvii@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20260502180223.410876-1-avinal.xlvii@gmail.com/mbox/","series":[{"id":502544,"url":"http://patchwork.ozlabs.org/api/series/502544/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=502544","date":"2026-05-02T18:02:23","name":"match: Optimize `A > B ? ABS(A) : B` to `MAX(A, B)` when B >= 0 [PR116700]","version":1,"mbox":"http://patchwork.ozlabs.org/series/502544/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2232115/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2232115/checks/","tags":{},"related":[],"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=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=ffIihG+P;\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=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=ffIihG+P","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=none smtp.remote-ip=2607:f8b0:4864:20::1031"],"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 4g7G3d6MF8z1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 03 May 2026 04:03:08 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 2C3494AA6FC9\n\tfor <incoming@patchwork.ozlabs.org>; Sat,  2 May 2026 18:03:06 +0000 (GMT)","from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com\n [IPv6:2607:f8b0:4864:20::1031])\n by sourceware.org (Postfix) with ESMTPS id A0D384BB5880\n for <gcc-patches@gcc.gnu.org>; Sat,  2 May 2026 18:02:39 +0000 (GMT)","by mail-pj1-x1031.google.com with SMTP id\n 98e67ed59e1d1-3567e2b4159so2261334a91.0\n for <gcc-patches@gcc.gnu.org>; Sat, 02 May 2026 11:02:39 -0700 (PDT)","from fedoraemon.neon-universe.ts.net\n ([2406:7400:11d:a9dc:9a14:72eb:1a60:868a])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-364f44ddee2sm2902456a91.1.2026.05.02.11.02.35\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sat, 02 May 2026 11:02:36 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 2C3494AA6FC9","OpenDKIM Filter v2.11.0 sourceware.org A0D384BB5880"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org A0D384BB5880","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org A0D384BB5880","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777744959; cv=none;\n b=LArik+aadjk6El3jbD00ArPNIOMedfqsFYAGQMBJiJJUyTerRYRG8YitzoG+epZv7cDbEI2wKbJPJO4lULeZAe5Opw02lH0rXSUf1PD7cn5eUKNYjF0oMls2LfI2zoV4UBLsqGI1cN94dbqn3tX66LlrL52JeDuLJDvnTaVgnr8=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777744959; c=relaxed/simple;\n bh=IfwVuieVOGJ68AgGowmQrWkVLxZvdj/kKpWMU6vnLMI=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=EAAck8rKHFBiLgMZEz378+zP4xjeQikbsAXHyL8eG8Zi29S2scbbvuINpBvtZezlZQ4ZPuhlmdrLyHEjdDFUd+Gi1oVAxvW9H66UOp2ErjFeSmWpcZS7yGjPn+JHzflydbAMSMap0mEpmrAVPWwtxo+U8vVXpafNDhx2iWvoRNY=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1777744958; x=1778349758; darn=gcc.gnu.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=07HaaUB5FjiyCr3TsxHjDqoKvJQ581/dumcxtMuwWyg=;\n b=ffIihG+PzCLCP9dKPkjVx/G8XMVfddA1m6rzQfvuIcBLcdASbRYLaM5pI/fj0HaOZR\n W6BQkmC8AJjiQyS6IxUHb/6JAzxefan7gOEvv5raSL/phyPSJ8YVQ99BD2jDqTatbZ53\n Dn8jYEqnG5Rt/bzRxmFDvxPth7/1OJSjxWMc1lyybnt8RnFj+rZMox4aRZP7eY+9fEGH\n t7PQWN+2DX7tMoCEjHazcTyz/vntN/kZLaSCDdlFyDHE12qWReubwbyUk8SPjr6LmlOd\n dBx88Tcs1wmO5DFgqGHdzAivcMMHIEWF25hm/ZWM2s2hR9WpXedaWQQWrtoXAn4yQ377\n KAhw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777744958; x=1778349758;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=07HaaUB5FjiyCr3TsxHjDqoKvJQ581/dumcxtMuwWyg=;\n b=OQG3YvRGAaIlivhYpewyiRgo3MpX1EwPQbAenXFYVUzkv8+GRz2EoKgBtsP7fPh83d\n ingOjKQ0/IPoqwtClo3/89RGFAT6rTDCACSFnfz90dy///cjSV/ColVNqDWKMG2rJErd\n WVQahHUP7gruGweuLgmupjpiDOMCGEaVcHWTIand1SSa9XUlW7QanYFq2oK/PD8tlBew\n 7uyIqD00UoZYuI6hoTsLj1z7nljYEY5s2dFbn0268u30Cb4lm3fXji/nGDKobXr+kiUh\n Fw/paYi9wWLHhprqo0tJTJbtcvhFENY0Knc0Iu+mL3w8GLIQzH6XOFyuVNNQjh5BjYZG\n C11A==","X-Gm-Message-State":"AOJu0YyWhbzWZfWmceZ/g0gMsT/VwnYnpjBsl5oHrkkZ1YycvJPHCVGh\n iwh6QU1KNuHyfg2KhHmOMptTM9jYmkSN8YHDoWn7CYfs+524bwpRtfHoo1VeeQ==","X-Gm-Gg":"AeBDietSy7+bkXjEMhCAzR1KYi1CmsU/ROZaU/coefHCfShWJqgDyh3+hfqjueEC3bV\n B4fdvnp+oYbQmj9gDxnQmQEjcjKZiGl12IvtjAtlG0/+nglLWFRJ8YJtZfCZyFgonrBG8EwTSLg\n lxoSaPdNd3RA85Rpza8d5o6tto2DqrHslQV/eNhA90hs2Q4r5tJJCpF/ZWjtFUF27o9+KHswM0p\n 6Cfq5jFZ+GFXvmfOE+7m23abYN0VokLCgqx7T23W1Q3eGqnzjwg8FFycTD8ksAaVkGdOBB+fUgs\n h5b7j50aLPrRmE1U51njNX3US3actJcIp7IkTIBUNqbBp1ViW93PF5+ZmyqvFa2qHFE6CasODS6\n 85+xrjtAOcEvTYHyjfvHGob2/64kwmZQsaXKXKRnidR32Z97mLM+gvzNu97i09dVkUseXO7KzjR\n TqwEuKGFtccL2yvwBbUXQmeMIXyzHsQYnjbN6ZAl96cThEM1UNpENz//DPLLEfBm+f8kaJujcNt\n 8rt","X-Received":"by 2002:a17:90a:f945:b0:35f:b9ea:8fa5 with SMTP id\n 98e67ed59e1d1-3650ce4ab61mr4201618a91.20.1777744957975;\n Sat, 02 May 2026 11:02:37 -0700 (PDT)","From":"Avinal Kumar <avinal.xlvii@gmail.com>","To":"gcc-patches@gcc.gnu.org","Cc":"andrew.pinski@oss.qualcomm.com","Subject":"[PATCH] match: Optimize `A > B ? ABS(A) : B` to `MAX(A,\n B)` when B >= 0 [PR116700]","Date":"Sat,  2 May 2026 23:32:23 +0530","Message-ID":"<20260502180223.410876-1-avinal.xlvii@gmail.com>","X-Mailer":"git-send-email 2.54.0","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","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"},"content":"When B is known to be non-negative and A > B, A must be positive,\nso ABS(A) == A.  The whole expression (A > B ? ABS(A) : B) then\nsimplifies to MAX(A, B).  This is caught at -O2 via VRP, but at\n-O1 phiopt1 produces ABS_EXPR and no later pass simplifies it.\n\n        PR tree-optimization/116700\n\ngcc/ChangeLog:\n\n        * match.pd: (A > B ? ABS(A) : B -> MAX(A, B)): New pattern\n        for non-negative B.\n\ngcc/testsuite/ChangeLog:\n\n        * gcc.dg/pr116700.c: New test.\n        * gcc.dg/tree-ssa/phi-opt-48.c: New test.\n\nSigned-off-by: Avinal Kumar <avinal.xlvii@gmail.com>\n---\nI compared the changes in the suggested patch on bugzilla, understood patterns\nand tried to adapt them. The actual mechanism is still not completely understood\nto me. The tests are running fine but I think I am missing some cases.\n\nHere is how I ran the tests:\n\nmake -j$(nproc)\nmake check-gcc RUNTESTFLAGS=\"tree-ssa.exp=phi-opt-48.c\"\nmake check-gcc RUNTESTFLAGS=\"dg.exp=pr116700.c\"\n\nOn a side note, is there any trick/tips for building faster? I have a decent\nsystem (8C 16T and 64GB RAM) and it takes almost an hour.\n\n gcc/match.pd                               |  9 ++++++++\n gcc/testsuite/gcc.dg/pr116700.c            | 13 +++++++++++\n gcc/testsuite/gcc.dg/tree-ssa/phi-opt-48.c | 25 ++++++++++++++++++++++\n 3 files changed, 47 insertions(+)\n create mode 100644 gcc/testsuite/gcc.dg/pr116700.c\n create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/phi-opt-48.c","diff":"diff --git a/gcc/match.pd b/gcc/match.pd\nindex dd9efb82c59..928f75c5a44 100644\n--- a/gcc/match.pd\n+++ b/gcc/match.pd\n@@ -7276,6 +7276,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)\n  (if (INTEGRAL_TYPE_P (type))\n   @3))\n \n+/* A > B ? ABS(A) : B -> MAX(A, B) when B is non-negative.\n+   When A > B >= 0, A is positive so ABS(A) = A = MAX(A, B).\n+   When A <= B, the result is B = MAX(A, B).  */\n+(for cmp (gt ge)\n+ (simplify\n+  (cond (cmp:c @0 tree_expr_nonnegative_p@1) (abs @0) @1)\n+  (if (INTEGRAL_TYPE_P (type))\n+   (max @0 @1))))\n+\n /* (X + 1) > Y ? -X : 1 simplifies to X >= Y ? -X : 1 when\n    X is unsigned, as when X + 1 overflows, X is -1, so -X == 1.  */\n (simplify\ndiff --git a/gcc/testsuite/gcc.dg/pr116700.c b/gcc/testsuite/gcc.dg/pr116700.c\nnew file mode 100644\nindex 00000000000..a52388249a3\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/pr116700.c\n@@ -0,0 +1,13 @@\n+/* PR tree-optimization/116700 */\n+/* { dg-do compile } */\n+/* { dg-options \"-O1 -fdump-tree-phiopt1\" } */\n+\n+int f(unsigned char a, int b, int c)\n+{\n+  int t = a;\n+  if (c > t) t = (c > 0 ? c : -c);\n+  return t;\n+}\n+\n+/* { dg-final { scan-tree-dump \"MAX_EXPR\" \"phiopt1\" } } */\n+/* { dg-final { scan-tree-dump-not \"ABS_EXPR\" \"phiopt1\" } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-48.c b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-48.c\nnew file mode 100644\nindex 00000000000..06317766457\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-48.c\n@@ -0,0 +1,25 @@\n+/* { dg-do compile } */\n+/* { dg-options \"-O1 -fdump-tree-phiopt1\" } */\n+\n+/* Test that (A > B) ? ABS(A) : B is simplified to MAX(A, B)\n+   when B is known to be non-negative. */\n+\n+int f(unsigned char a, int b, int c)\n+{\n+  int t = a;\n+  if (c > t)\n+    t = (c > 0 ? c : -c);\n+  return t;\n+}\n+\n+int f1(unsigned char a, int b, int c)\n+{\n+  int t = a;\n+  if (c > t) return (c > 0 ? c : -c);\n+  return t;\n+}\n+\n+/* Both functions should be converted to MAX_EXPR by phiopt1.  */\n+/* { dg-final { scan-tree-dump-times \"MAX_EXPR\" 2 \"phiopt1\" } } */\n+/* { dg-final { scan-tree-dump-not \"ABS_EXPR\" \"phiopt1\" } } */\n+/* { dg-final { scan-tree-dump-not \"if \" \"phiopt1\" } } */\n","prefixes":[]}