{"id":2233435,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2233435/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260506123845.339938-1-eikansh.gupta@oss.qualcomm.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.1/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},"msgid":"<20260506123845.339938-1-eikansh.gupta@oss.qualcomm.com>","date":"2026-05-06T12:38:45","name":"[v3] MATCH: Add simplification for MAX<a&CST0, a&CST1> and MIN<a&CST0, a&CST1> to match.pd [PR109878]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"4f915126e480abe1f4283332cf9bad91452f3c0f","submitter":{"id":92956,"url":"http://patchwork.ozlabs.org/api/1.1/people/92956/?format=json","name":"Eikansh Gupta","email":"eikansh.gupta@oss.qualcomm.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20260506123845.339938-1-eikansh.gupta@oss.qualcomm.com/mbox/","series":[{"id":502981,"url":"http://patchwork.ozlabs.org/api/1.1/series/502981/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=502981","date":"2026-05-06T12:38:45","name":"[v3] MATCH: Add simplification for MAX<a&CST0, a&CST1> and MIN<a&CST0, a&CST1> to match.pd [PR109878]","version":3,"mbox":"http://patchwork.ozlabs.org/series/502981/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2233435/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2233435/checks/","tags":{},"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=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=D2vNcRDk;\n\tdkim=fail reason=\"signature verification failed\" (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=XXUtsThF;\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=fail reason=\"signature verification failed\" (2048-bit key,\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=D2vNcRDk;\n\tdkim=fail reason=\"signature verification failed\" (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=XXUtsThF","sourceware.org; dmarc=none (p=none dis=none)\n header.from=oss.qualcomm.com","sourceware.org;\n spf=pass smtp.mailfrom=oss.qualcomm.com","sourceware.org;\n arc=none 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 4g9Zln415zz1yJV\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 06 May 2026 22:42:29 +1000 (AEST)","from vm01.sourceware.org (localhost [IPv6:::1])\n\tby sourceware.org (Postfix) with ESMTP id 7C20A4BA23DD\n\tfor <incoming@patchwork.ozlabs.org>; Wed,  6 May 2026 12:42:27 +0000 (GMT)","from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com\n [205.220.180.131])\n by sourceware.org (Postfix) with ESMTPS id 311FB4BA7999\n for <gcc-patches@gcc.gnu.org>; Wed,  6 May 2026 12:39:17 +0000 (GMT)","from pps.filterd (m0279870.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 646CV2Gr1527742\n for <gcc-patches@gcc.gnu.org>; Wed, 6 May 2026 12:38:58 GMT","from mail-pf1-f198.google.com (mail-pf1-f198.google.com\n [209.85.210.198])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e01289757-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <gcc-patches@gcc.gnu.org>; Wed, 06 May 2026 12:38:58 +0000 (GMT)","by mail-pf1-f198.google.com with SMTP id\n d2e1a72fcca58-836d0184333so3140445b3a.0\n for <gcc-patches@gcc.gnu.org>; Wed, 06 May 2026 05:38:57 -0700 (PDT)","from hu-eikagupt-hyd.qualcomm.com ([202.46.22.19])\n by smtp.gmail.com with ESMTPSA id\n d2e1a72fcca58-83965c30ddasm6859103b3a.21.2026.05.06.05.38.54\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 06 May 2026 05:38:55 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 7C20A4BA23DD","OpenDKIM Filter v2.11.0 sourceware.org 311FB4BA7999"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 311FB4BA7999","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 311FB4BA7999","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1778071162; cv=none;\n b=X8n13EejQU0OnNexVvc3Fkhn18utalCSjQh+H2+xy5nz6OZLbg7J+0VlBtkomEIE4agV2EezTqcDoopl/5Iy1Ap4mWcvWFQ05ZoUVL9ZJu36Kh9EVGS/RjnaI6BNO+fUMLN2j40fNXKRvFSat2YMfaTJfZkg0yksHV1JBlXz660=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1778071162; c=relaxed/simple;\n bh=lTp7+9HCXqJ4kLimqxDjVjso2U8LCYgmMC+PnkF8DEs=;\n h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-Id:\n MIME-Version;\n b=VnuRaaFSpVo0b3AaeoMhS9IxXyp4vppx99iFLgKCkYqBlnlFeuOKhcRAI7Z7mm2Q7CoMx/XePMb7045n7JJf0rZoLadpGqpu/9/aUve0FJqDTVJF8BAfRCTOlDALfkB3j7/lidl7ndeGe/6vvVdC9oAx7yDDMEAdJd7YNFF7rrA=","ARC-Authentication-Results":"i=1; sourceware.org;\n dkim=pass (2048-bit key, unprotected)\n header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=D2vNcRDk;\n dkim=pass (2048-bit key, unprotected) header.d=oss.qualcomm.com\n header.i=@oss.qualcomm.com header.a=rsa-sha256 header.s=google\n header.b=XXUtsThF","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-transfer-encoding:date:from:message-id:mime-version\n :subject:to; s=qcppdkim1; bh=7+GpTB3XaOGG3RpsdC1uuaQW9oG5uqdkBqW\n 3cNiu1KM=; b=D2vNcRDk0irpppCrzssePjJEXGPXKrdzQKmyzddZYDv6ZrC2xiI\n 27T4p/pDvMpIN1b7hAgITQSyoDMpADFD3JpUpFlY9TZgZRT6Cvx8m479eWRkYSaD\n XGqF7SDJ2A1ojTl2sw59QVFUGC0vtc17z7PmwGRLbM2rtYXQ+gQB0i92mpiwLYMi\n zBJHh4fyxqMPvvzaXqXWshWFhnj8ENB4SX2flKovjWUsnyUPiVE7bMghPQ13WKZA\n r1WpSdaWlWVQUy5H64+BqQzxXmDn4YIhSkE/nyihlxs5KHHcj788HKTBWLqdR1ae\n Pc8V7e9RNSDw9UTVxgWk6z1Lr2Y8m+sVtdw==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1778071137; x=1778675937; 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=7+GpTB3XaOGG3RpsdC1uuaQW9oG5uqdkBqW3cNiu1KM=;\n b=XXUtsThF6DGEst33DlUIdrhOcMIVGNAzt3FiJX+SEV8Hutlo2zD4wr1VVeFqPwGijj\n MxwkcPGPWO0zvtJzX320QGFw5Qxll24CFxdtUoeZWh1OYqlJjTxnZF7s2WWeFxEp7Nus\n 0WpC1YDePwYg7YVTf3rhZS4ta/Lu1tBGsC3LUTFjMuO7NYqtu9FCxIx77djy04de7Eje\n mrvERmOPTwKde4p3Z54/n/ax6pJzkR9V0RKniH7MGNXfPWAqBO4orGFGKwGa7TW3nyia\n u6eoSdHtjtxjHRFrSASYADXctppbCLvu/U3zYFWFiTuO10w+lbXP8MZL7wRT/Ws+irO5\n 8LkQ=="],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1778071137; x=1778675937;\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=7+GpTB3XaOGG3RpsdC1uuaQW9oG5uqdkBqW3cNiu1KM=;\n b=EdLR+/Hcwx6i3eEyR0QTcNgN3Kdtz/+ldT5yNe4iwhRyAHCOFhhA9zAmEGhxRSoWmW\n mBJKNlN2JAE3C4UmZeP4QFUz4rVyAzWTrbdTPVuv1gjwFjt8CIUzULs3BFDZO9yt9Fdz\n UYJ81oILKfkSbSjZz+WWGWJYYfGWpbUemO2T3Zdx5pU+SzGJh+2nN6N0EYnJfCDq3Zyo\n /U+qRojjSlcbCbB+VAbYj0L/D/0XSKx2PesgVJnjIP2uGs41bFZYEcspZQZmsgyysM3q\n 5rILCj85ncpNfzftyoOVfcjYb9fbsi0hVHNg64V21mrgF/N3gLlriBwC8ZE8A7ccnJE2\n y7jA==","X-Gm-Message-State":"AOJu0YxFUP5xx006Mwq5udLev7OP4JnR+vwg8DkGB98i1aKvKulWTIpc\n WV/PJwkF+0FYGXHyT38pEyJ5VrnSKmok4MhCmwSGKtzPQZAqGvv8gsNAH/XhjPUo3G0mO8WulY1\n hLAT/6M/iDYcSNsOqOJIYVqmKJH12PP/kT4WwWu3HYbX82p30h+5hwPRB2RHgZ+G7/hcL","X-Gm-Gg":"AeBDieu1s6Wa6jRKkg7GW7FwanJ2x8fjnPMe2HzFlijNzzZm+PpwhSm81l1/dxuk2Av\n RwTdM7jRYjywxqA9+XjFSoYEbkfmkKuoRV7iPrMPUeRL+KnKbQg7TAh1cSeIyr6wse2dT7bgMmp\n zafefcjo2sgGHNPncaW1aPDUw8m0IHRE6UgpNamNm+yJ+/aXLn02QOJ6SI6eD9RehWOK5YXXsRG\n 3YuHmDr0cTuIBtMnKfWgVUj4Y0oCULhB5FZle7Ze1NrCfRkl1DTtuFaTFtHGQEpUOVUDchRithK\n pAJfRs67EvRaDCSHEx7mrLnW6kx9nOlN1lh/2qYkJD6S5DA+qNX1MkLiDTvASfLcCBNj1ACbCra\n r7Imv08SfJhOuXKKEHGvuiW2Ps+vBKLd7mYzSuO1xb3ojE3kX4c/2cJoN/0RTuqhZqQ==","X-Received":["by 2002:a05:6a00:2e87:b0:82f:5034:77a4 with SMTP id\n d2e1a72fcca58-83a5c4be2eemr3127332b3a.21.1778071136709;\n Wed, 06 May 2026 05:38:56 -0700 (PDT)","by 2002:a05:6a00:2e87:b0:82f:5034:77a4 with SMTP id\n d2e1a72fcca58-83a5c4be2eemr3127286b3a.21.1778071136058;\n Wed, 06 May 2026 05:38:56 -0700 (PDT)"],"From":"Eikansh Gupta <eikansh.gupta@oss.qualcomm.com>","To":"gcc-patches@gcc.gnu.org","Cc":"Eikansh Gupta <eikansh.gupta@oss.qualcomm.com>","Subject":"[PATCH v3] MATCH: Add simplification for MAX<a&CST0,\n a&CST1> and MIN<a&CST0, a&CST1> to match.pd [PR109878]","Date":"Wed,  6 May 2026 18:08:45 +0530","Message-Id":"<20260506123845.339938-1-eikansh.gupta@oss.qualcomm.com>","X-Mailer":"git-send-email 2.34.1","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Proofpoint-GUID":"Vme7NfOS4OUE05SYEN-UQ7hHeM38ryRr","X-Proofpoint-ORIG-GUID":"Vme7NfOS4OUE05SYEN-UQ7hHeM38ryRr","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNTA2MDEyNCBTYWx0ZWRfX0hzt22GZAILI\n rD+tVMoNrj5mAzEIBvv7n80ivCvv8zmVwBQXHtuYW8b27UBgSPb8uEACWZsK/yfHB/7J+z/0c/R\n tqcwpkakt8z/ouwtzUd4qPfMGiIMK591kZ0PO+RwMsBqKIZJ9uOzFKK/CeNk9ygWz+jxEAGZp/W\n Rg76Sd91QsXMTrixULT2J8Qjr6bNnfETKYY4i7NvrBXvhQdyyjx9tENJOrbMHNtNOYPOZsCZwB+\n eMvcAHnJt+B3acHL8QRIuxnEqcURwTLh/AGq1YLFxeDAOag83k94Hf+EeozEMK54MNiuc4qegWa\n XvFC7DiBmdntfkTld9jHGIiJ1sILD5SpH/E39o5qWNLdwdBk+weT8dXUHv0t8Cf71MIIULX6R0V\n kYrmcEVUqPzso31ZKtFPhCpXqpbUASUlMKcyKYObur3d/fAF/s7yvfVkwAxp4GY9ZrutknZVZow\n 7q9Xo4ZSzNZF9UJ3GEA==","X-Authority-Analysis":"v=2.4 cv=A8xc+aWG c=1 sm=1 tr=0 ts=69fb3662 cx=c_pps\n a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=fChuTYTh2wq5r3m49p7fHw==:17\n a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=mDV3o1hIAAAA:8\n a=EUspDBNiAAAA:8 a=mj1iFhW2GvWuiO5ymLwA:9 a=IoOABgeZipijB_acs4fv:22","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-05-05_03,2026-05-06_01,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n priorityscore=1501 spamscore=0 phishscore=0 bulkscore=0 clxscore=1015\n lowpriorityscore=0 malwarescore=0 adultscore=0 impostorscore=0 suspectscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605060124","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":"Min and max could be optimized if both operands are defined by\n(same) variable restricted by an and(&). For signed types,\noptimization can be done when both constant have same sign bit.\nThe patch also adds optimization for specific case of min/max(a, a&CST).\n\nThis patch adds match pattern for:\n\nmax (a & CST0, a & CST1) -> a & CST0 IFF CST0 & CST1 == CST1\nmin (a & CST0, a & CST1) -> a & CST0 IFF CST0 & CST1 == CST0\nmin (a, a & CST) --> a & CST\nmax (a, a & CST) --> a\n\nThe v2 of the patch has been approved. Patch link:\nhttps://gcc.gnu.org/pipermail/gcc-patches/2024-July/657801.html\n\n\tPR tree-optimization/109878\n\ngcc/ChangeLog:\n\n\t* match.pd min/max (a & CST0, a & CST1): New pattern.\n\tmin/max (a, a & CST): New pattern.\n\ngcc/testsuite/ChangeLog:\n\n\t* gcc.dg/tree-ssa/pr109878-1.c: New test.\n\t* gcc.dg/tree-ssa/pr109878-2.c: New test.\n\t* gcc.dg/tree-ssa/pr109878-3.c: New test.\n        * gcc.dg/tree-ssa/pr109878.c: New test.\n\nSigned-off-by: Eikansh Gupta <eikansh.gupta@oss.qualcomm.com>\n---\n gcc/match.pd                               | 26 +++++++++\n gcc/testsuite/gcc.dg/tree-ssa/pr109878-1.c | 64 ++++++++++++++++++++++\n gcc/testsuite/gcc.dg/tree-ssa/pr109878-2.c | 31 +++++++++++\n gcc/testsuite/gcc.dg/tree-ssa/pr109878-3.c | 42 ++++++++++++++\n gcc/testsuite/gcc.dg/tree-ssa/pr109878.c   | 64 ++++++++++++++++++++++\n 5 files changed, 227 insertions(+)\n create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr109878-1.c\n create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr109878-2.c\n create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr109878-3.c\n create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr109878.c","diff":"diff --git a/gcc/match.pd b/gcc/match.pd\nindex 7db8ce7580f..2333fb72fd2 100644\n--- a/gcc/match.pd\n+++ b/gcc/match.pd\n@@ -5052,6 +5052,32 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)\n   (if (!HONOR_NANS (@0))\n    (neeq @0 @1))))\n \n+/* min (a & CST0, a & CST1) -> a & CST0 IFF CST0 & CST1 == CST0 */\n+/* max (a & CST0, a & CST1) -> a & CST0 IFF CST0 & CST1 == CST1 */\n+/* If signed a, then both the constants should have same sign. */\n+(for minmax (min max)\n+ (simplify\n+  (minmax (bit_and@3 @0 INTEGER_CST@1) (bit_and@4 @0 INTEGER_CST@2))\n+   (if (TYPE_UNSIGNED (type)\n+        || (tree_int_cst_sgn (@1) == tree_int_cst_sgn (@2)))\n+    (with { auto andvalue = wi::to_wide (@1) & wi::to_wide (@2); }\n+     (if (andvalue == ((minmax == MIN_EXPR)\n+\t\t        ? wi::to_wide (@1) : wi::to_wide (@2)))\n+      @3\n+      (if (andvalue == ((minmax != MIN_EXPR)\n+\t\t\t ? wi::to_wide (@1) : wi::to_wide (@2)))\n+       @4))))))\n+\n+/* min (a, a & CST) --> a & CST */\n+/* max (a, a & CST) --> a */\n+(for minmax (min max)\n+ (simplify\n+  (minmax @0 (bit_and@1 @0 INTEGER_CST@2))\n+   (if (TYPE_UNSIGNED(type))\n+    (if (minmax == MIN_EXPR)\n+     @1\n+     @0))))\n+\n /* Simplify min (&var[off0], &var[off1]) etc. depending on whether\n    the addresses are known to be less, equal or greater.  */\n (for minmax (min max)\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109878-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109878-1.c\nnew file mode 100644\nindex 00000000000..509e59adea1\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109878-1.c\n@@ -0,0 +1,64 @@\n+/* PR tree-optimization/109878 */\n+/* { dg-do compile } */\n+/* { dg-options \"-O1 -fdump-tree-optimized\" } */\n+\n+/* All the constant pair <cst0, cst1> used here satisfy the condition:\n+   (cst0 & cst1 == cst0) || (cst0 & cst1 == cst1).\n+   If the above condition is true, then MIN_EXPR is not needed. */\n+int min_and(int a, int b) {\n+  b = a & 3;\n+  a = a & 1;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+int min_and1(int a, int b) {\n+  b = a & 3;\n+  a = a & 15;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+int min_and2(int a, int b) {\n+  b = a & -7;\n+  a = a & -3;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+int min_and3(int a, int b) {\n+  b = a & -5;\n+  a = a & -13;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* When constants are of opposite signs, the simplification will only\n+   work for unsigned types. */\n+unsigned int min_and4(unsigned int a, unsigned int b) {\n+  b = a & 3;\n+  a = a & -5;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+unsigned int min_and5(unsigned int a, unsigned int b) {\n+  b = a & -3;\n+  a = a & 5;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* { dg-final { scan-tree-dump-not \" MIN_EXPR \" \"optimized\" } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109878-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109878-2.c\nnew file mode 100644\nindex 00000000000..1503dcde1cb\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109878-2.c\n@@ -0,0 +1,31 @@\n+/* PR tree-optimization/109878 */\n+/* { dg-do compile } */\n+/* { dg-options \"-O1 -fdump-tree-optimized\" } */\n+\n+/* The testcases here should not get optimized with the patch.\n+   For constant pair <cst0, cst1>, the condition:\n+   (cst0 & cst1 == cst0) || (cst0 & cst1 == cst1)\n+   is false for the constants used here. */\n+int max_and(int a, int b) {\n+\n+  b = a & 3;\n+  a = a & 5;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* The constants in this function satisfy the condition but a is signed.\n+   For signed types both the constants should have same sign. */\n+int min_and(int a, int b) {\n+  b = a & 1;\n+  a = a & -3;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* { dg-final { scan-tree-dump \" MIN_EXPR \" \"optimized\" } } */\n+/* { dg-final { scan-tree-dump \" MAX_EXPR \" \"optimized\" } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109878-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109878-3.c\nnew file mode 100644\nindex 00000000000..65966e1ebf3\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109878-3.c\n@@ -0,0 +1,42 @@\n+/* PR tree-optimization/109878 */\n+/* { dg-do compile } */\n+/* { dg-options \"-O1 -fdump-tree-optimized\" } */\n+\n+/* For unsigned types, min(a, a&CST) should be simplified to a&CST and\n+   should not generate MIN_EXPR. */\n+unsigned int min_1(unsigned int a, unsigned int b) {\n+  b = a & 1;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+unsigned int min_2(unsigned int a, unsigned int b) {\n+  b = a & 3;\n+  if (b < a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* For unsigned types, max(a, a&CST) should be simplified to a and\n+   should not generate MAX_EXPR. */\n+unsigned int max_1(unsigned int a, unsigned int b) {\n+  b = a & 1;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+unsigned int max_2(unsigned int a, unsigned int b) {\n+  b = a & 3;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* { dg-final { scan-tree-dump-not \" MIN_EXPR \" \"optimized\" } } */\n+/* { dg-final { scan-tree-dump-not \" MAX_EXPR \" \"optimized\" } } */\ndiff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr109878.c b/gcc/testsuite/gcc.dg/tree-ssa/pr109878.c\nnew file mode 100644\nindex 00000000000..6f13bafcf14\n--- /dev/null\n+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr109878.c\n@@ -0,0 +1,64 @@\n+/* PR tree-optimization/109878 */\n+/* { dg-do compile } */\n+/* { dg-options \"-O1 -fdump-tree-optimized\" } */\n+\n+/* All the constant pair <cst0, cst1> used here satisfy the condition:\n+   (cst0 & cst1 == cst0) || (cst0 & cst1 == cst1).\n+   If the above condition is true, then MAX_EXPR is not needed. */\n+int max_and(int a, int b) {\n+  b = a & 3;\n+  a = a & 1;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+int max_and1(int a, int b) {\n+  b = a & 3;\n+  a = a & 15;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+int max_and2(int a, int b) {\n+  b = a & -7;\n+  a = a & -3;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+int max_and3(int a, int b) {\n+  b = a & -5;\n+  a = a & -13;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* When constants are of opposite signs, the simplification will only\n+   work for unsigned types. */\n+unsigned int max_and4(unsigned int a, unsigned int b) {\n+  b = a & 3;\n+  a = a & -5;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+unsigned int max_and5(unsigned int a, unsigned int b) {\n+  b = a & -3;\n+  a = a & 5;\n+  if (b > a)\n+    return b;\n+  else\n+    return a;\n+}\n+\n+/* { dg-final { scan-tree-dump-not \" MAX_EXPR \" \"optimized\" } } */\n","prefixes":["v3"]}