From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2082.outbound.protection.outlook.com [40.107.21.82]) by sourceware.org (Postfix) with ESMTPS id D3D763854811 for ; Mon, 31 Oct 2022 11:47:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D3D763854811 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Seal: i=2; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=pass; b=d/5Pf/4atZnEWoktFpD4RLLVdM8nEQOa1U/6vRldB0VK2/6pvXAylylNVhiadAuHCx0s/AGa3GuaKf/SUCN0V6LUj+fX8Q/sJzUnz4pBSt62Tc/BaTw4ZXHzRDBiW5o20sR//3y1c8gQbXhUcT1GyDZIo9z9N7/uEZ5wpymiB6utQt3IbpVMUr679wDd2Yah15lvkqOS8LnID9Zfh4FI5UUo06Bu18TEKaPuCcu4M13YkKN+8AVW1DRlDT1XgMgKGhdUBz/xTWEw5uFD8m5h3jIpEL48OD7ouTJsA1oPZsMDJGYKzfW7EG0rmcy/fMc7Wd+AyRUxsh2sqrYxOPKjqg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c1TBWWqJWMlP+bfkBVISjdbfuIYq/GLQLelwn+25qDA=; b=n/NUBnsJIRuVtfe6beU12od5MihB3C6Ov/oSyK5H6HNEXxZz1OBAGffvtP3Gqt40BU6M/9wWDR7OqfT6sTW/fHBne6XicgpKlfJVnKSSDcdfRAc+dYEAxgKLn60FkcaNiTVoM5XqiDC4KNAG42NiOijtxNxFhskwxO1LBqpeMAJ4AlaIK85+iM7R/Yzx6IJzzqYggSoN2t4Fuyh5wPSf27DIkwLNc+fC/CHr4iUbXG6Z9AXLengNupsgzH31CwauNZcsJvBdiArImgp6RfZasxir7chg/SDI6yVLXiV5JkWyUYSegjnnn5POkxBA4/SEuELlcoYmTnHs1AqpIhGoGA== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=pass (sender ip is 63.35.35.123) smtp.rcpttodomain=gcc.gnu.org smtp.mailfrom=arm.com; dmarc=pass (p=none sp=none pct=100) action=none header.from=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=arm.com] dkim=[1,1,header.d=arm.com] dmarc=[1,1,header.from=arm.com]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c1TBWWqJWMlP+bfkBVISjdbfuIYq/GLQLelwn+25qDA=; b=D9f7HUAFvLAwXhvqDhVWk2xN4XkhATUFcMTKTJX57h4M0oiw4hU0FSgUmgJPafTx8xd45oVIb95U8u4axg6eXNCrSyOOpjf29LY87xx0mRp9bMoxWnsL+UttwFN3K0pb/J0H4fr4XOx2am97LsLIHhBw8dZF5PynYTL+T+qlPJw= Received: from AS8PR04CA0050.eurprd04.prod.outlook.com (2603:10a6:20b:312::25) by PA4PR08MB5888.eurprd08.prod.outlook.com (2603:10a6:102:e8::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.19; Mon, 31 Oct 2022 11:47:15 +0000 Received: from AM7EUR03FT046.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:312:cafe::42) by AS8PR04CA0050.outlook.office365.com (2603:10a6:20b:312::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.15 via Frontend Transport; Mon, 31 Oct 2022 11:47:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; pr=C Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM7EUR03FT046.mail.protection.outlook.com (100.127.140.78) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.14 via Frontend Transport; Mon, 31 Oct 2022 11:47:15 +0000 Received: ("Tessian outbound 58faf9791229:v130"); Mon, 31 Oct 2022 11:47:14 +0000 X-CR-MTA-TID: 64aa7808 Received: from 35e1a48e9748.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 5D7D0240-7515-4699-9378-3FFA19491390.1; Mon, 31 Oct 2022 11:47:08 +0000 Received: from EUR04-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 35e1a48e9748.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 31 Oct 2022 11:47:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RG5q6dMo8gsRU1+tQkoo1WtKJz9pJxTPFxhwtgr4XeBnfH4/yQHgVmRBDtQEZFvkB9NrsW2BsBeooxU/bC7/FLMXMlF8TnQDPBPthPR+dFfZ2uaqazUMr17rt+Rnde/hD0Cws/4ZQitWuEwGqlb+kteUdDTbJI6bEiRqqSqdRHs5z7x3pImmToo4c25X0wpt2FDOSKCI9Wk24RCQSv6kOhqFX4Oiqrsa1bYF1SsDjsYqCqaVM4VkZsJ+CZ57zCndOWLao339of6EmvgbQOKy6y/JLZmIPYIGkaeN0OlyC/7JPbCYQhUSL3hj/PmH8yppzgS+hNDz6RxdoulePu0eRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c1TBWWqJWMlP+bfkBVISjdbfuIYq/GLQLelwn+25qDA=; b=JNH/LiJFQQgrVo3t7f6QS3RH9I4w1G9fD0W6GM0wzAN6w/CO99hrzo4+MFHYtNYHcGtP+xuTubqgaXRyMdmcUdo4FplfTDYzIiUrptOj8OY2wUGg/C6izD4da4TRuqxncUziPKv6ozfW23s+LxtEUPiBngyAjpJA3sLOFf8PkGkEQbB4m7E/sgB7zSed4KaZhjqo3FccqoFOXvYD9WstVnEHKOZ3B0hJzGkHdWNf07y9DdmRZdx/HQY8iZ/Xfa3Wng3WLoX33kAMfWFmQ+H4Q/nvoSJ+i6bY/7O2OXo5g8GZIhpjWyxxbPzmaJTd5o9ReDGluMQ3Qvxpg1J9BgQmNg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c1TBWWqJWMlP+bfkBVISjdbfuIYq/GLQLelwn+25qDA=; b=D9f7HUAFvLAwXhvqDhVWk2xN4XkhATUFcMTKTJX57h4M0oiw4hU0FSgUmgJPafTx8xd45oVIb95U8u4axg6eXNCrSyOOpjf29LY87xx0mRp9bMoxWnsL+UttwFN3K0pb/J0H4fr4XOx2am97LsLIHhBw8dZF5PynYTL+T+qlPJw= Received: from VI1PR08MB5325.eurprd08.prod.outlook.com (2603:10a6:803:13e::17) by AS8PR08MB9931.eurprd08.prod.outlook.com (2603:10a6:20b:563::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5769.15; Mon, 31 Oct 2022 11:47:04 +0000 Received: from VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::c57d:50c2:3502:a52]) by VI1PR08MB5325.eurprd08.prod.outlook.com ([fe80::c57d:50c2:3502:a52%4]) with mapi id 15.20.5769.019; Mon, 31 Oct 2022 11:47:04 +0000 From: Tamar Christina To: Richard Biener CC: "gcc-patches@gcc.gnu.org" , nd , "jeffreyalaw@gmail.com" Subject: RE: [PATCH]middle-end Recognize more conditional comparisons idioms. Thread-Topic: [PATCH]middle-end Recognize more conditional comparisons idioms. Thread-Index: AQHYzy1qkob2PsMyvEiQ1cvdASOCe63xgvyAgDcaghA= Date: Mon, 31 Oct 2022 11:47:04 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ts-tracking-id: C1771B8C3FE2324BA61AD6E9D85D896B.0 x-checkrecipientchecked: true Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; x-ms-traffictypediagnostic: VI1PR08MB5325:EE_|AS8PR08MB9931:EE_|AM7EUR03FT046:EE_|PA4PR08MB5888:EE_ X-MS-Office365-Filtering-Correlation-Id: 6798a020-7227-4841-31a8-08dabb35a7e9 x-checkrecipientrouted: true nodisclaimer: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: SE5/2CIb3UYpjOca6pXqZYqBPEghPuEbRsKzjo0iT6acF5dAUFUgvjUG+mS+cuL9ps7Agx5rjvkUEaSrm3gmq3a3p0/GbCElz6jT49AgRLkR9tq65xFRcwcl2NyKS6vJrtUkRZM1Y1Hh8zPbjM2htvW4fws7/g/93w0ablt2wHdDLgxRsodRavec0JEQisEvgTpEikDqsKjYSZ84FzOGvBwSLRlZBP//6bSQY7xrNVOkvpkZRehj9im69uIZO76boHjyHIQVCNfHEDSVkx3OUrWz75IdXdKQf/wg/5OQ9UKWUUgTLd4UpXqsgO4wT651TUHztp9gUlsutW6STtvgh3uw+kOPBxVavd2uh8XGztuafPsZd9GsF+MCqdIEUrMKr0WIO3h7GZba0+CWPTDRM2v31nDW+RWlItuYbRvroAMrE3lZ5cL1JgztSXXQ3xILj/hviPSJWPM0heIWiawZc/4khNGj2gwbbO7ozEMiDt9XvTfIbEJvSN9x/OkGHUR/mHEVw2gbUiS6U+mEnSEvxIiMkRzB/C5Vb/E9vUUDwJ/jnCK7ggZW30VG5PN7/Zk6nMDgPza6+CYUV7Mb3owwbVqme7KsR//aDTVRbXcKHcrDi2sQvbLXkzfAMvGRs4Z6czCWQ8/o2CRA0qUfgVhfhqdCVKalCQQ6fKKVZ/peVq21QhKbWk+gW/USPbd6t0eesONJpL6KHaSplXkx2ZD/INQN1u9C12AGNNN19WwS3vCPQjzdqXpQin8CFiPXA7LZhX2MGqZbptPwje2EzX0Ls2orDrZWS16olt+j62IBI96QDs9HiDxI2X1nejPZC4ILfgsLngqIx9225wtJ5u+W0w== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI1PR08MB5325.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(376002)(39860400002)(366004)(396003)(346002)(136003)(451199015)(26005)(9686003)(7696005)(478600001)(186003)(30864003)(83380400001)(55016003)(2906002)(316002)(71200400001)(6916009)(54906003)(8936002)(6506007)(4326008)(66446008)(66556008)(8676002)(41300700001)(76116006)(5660300002)(66476007)(66946007)(64756008)(52536014)(33656002)(38070700005)(86362001)(38100700002)(99936003)(122000001)(84970400001);DIR:OUT;SFP:1101; Content-Type: multipart/mixed; boundary="_002_VI1PR08MB5325A2C8533E529F5E3C16ADFF379VI1PR08MB5325eurp_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB9931 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM7EUR03FT046.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 3b902478-c465-4bdf-e4a8-08dabb35a180 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: PGPFinY/+WwA5P2NUYoepry5WV7Z4LtJyGYv+6YsMFUvnI/m9IqXhRlc3G/I96nQFRTMBpvkjt0yKec2beOnyW2Dyuc9C0ZWxid4q4rim5H9xmSGflkI82lK9eIJnFxTMRMmbiWjDJYD5/unW7HUZ5Om8/fVyZ5omLgT/ONNxd3SNsF6hcdRBcWY/a3f5QxdCzqjIFz+A/L3tPV0S/2y8LSSUsIIxvA3jeUYemMTORzaZtMm8bwyRyl8wPOEEGhWbYSi7aiS46DcsCQuGtg9RYyOtDK/UzYYPq6FxbJLslYNZa3ySUIUW8W412+f6TeZz0KjZ7EsnOiKifJpk40Fc8ssATkj7b1lMSb40DEzun8HlQ9YrQp4kFpXjYlayD6pa3iHiJIzjXCIuYRnfHzgmFgBof3DS1LSidXuxAYiL1huPxOKqFChUA0wpUPdjwvuZZpTpFxlut8s82Uj4Z+LpjhP230isGEjXwkihHa2Qm/ju/r74sbLonFCEzdS8ZvdI4m+E9+TVjb1YhVN7mDQhR8rTjsknjEUhqE1o9ayLLrRCTHYbufREOlJnjyx0/N+cQSjv+vKFZp154dkPED2R3q1RPDrk6x4W2A1xgQ8244of7rxu92urz9vZRyQTNkdEfthrP7mVzW/51idIA1BGoeUftiX8xtAIEOhwTJO6hVL07a3D+TOjEfv16FgaHZNxdEBwJJ7fCNrCVuH+Ww/eUX/xQOqDhmDMH+GzlNx+vLbws05LD5vQvfmdysE+yBot8Fow1FXHcvmr5bUXKkhNqEnkMsXvkcNJpDMoSVl6uUtjSS/3FImFyJtFkONHgyxvEOMipYbkyc2IUSux9mz6bjzoDZANTQcufOg/fXmxyk= X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFS:(13230022)(4636009)(136003)(39860400002)(346002)(396003)(376002)(451199015)(40470700004)(36840700001)(46966006)(4326008)(54906003)(8676002)(41300700001)(52536014)(8936002)(70206006)(70586007)(5660300002)(235185007)(84970400001)(30864003)(107886003)(478600001)(2906002)(81166007)(356005)(336012)(9686003)(7696005)(26005)(186003)(6506007)(47076005)(83380400001)(6862004)(316002)(82310400005)(33656002)(36860700001)(40480700001)(82740400003)(99936003)(86362001)(40460700003)(55016003);DIR:OUT;SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Oct 2022 11:47:15.0303 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6798a020-7227-4841-31a8-08dabb35a7e9 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: AM7EUR03FT046.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR08MB5888 X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,FORGED_SPF_HELO,GIT_PATCH_0,KAM_DMARC_NONE,KAM_LOTSOFHASH,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_NONE,TXREP,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --_002_VI1PR08MB5325A2C8533E529F5E3C16ADFF379VI1PR08MB5325eurp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > > This moves the pattern detection to match.pd instead. >=20 > where's the other copy and is it possible to remove it with this patch? >=20 It looks like it's spread over various passes. Starting with forwardprop. >=20 > > + (simplify > > + (bit_ior:c > > + (mult:c @0 (convert (convert2? (op@4 @2 @3)))) > > + (bit_and:c @1 (convert (plus:c integer_minus_onep (convert (op@4 > > + @2 @3)))))) >=20 > can you add a comment with what you match here as well? You are using > (op@4 @2 @3) twice, the point of the @4 capture is that the second > occurance could be just @4. I wonder how we arrived at the multiplicatio= n > here? That seems somewhat premature :/ That's being done by forwardprop. To remove the various converts I broke down the operations into several Smaller steps that on their own are sound optimizations. When taken all together it reduced the versions with casts down to the final optimized ver= sion. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Ok for master? Thanks, Tamar gcc/ChangeLog: * match.pd: New cond select pattern. (inverted_simple_comparison): New. gcc/testsuite/ChangeLog: * gcc.dg/select_cond_1.c: New test. * gcc.dg/select_cond_2.c: New test. * gcc.dg/select_cond_3.c: New test. --- inline copy of patch --- diff --git a/gcc/match.pd b/gcc/match.pd index 45f8941396ffd843f1bb23ab638c3b8c6d0d54b6..84d931c5d559ef1a605ea1121fb= e655fcf870195 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -51,8 +51,9 @@ along with GCC; see the file COPYING3. If not see unge ungt ne eq unlt unle ordered unordered ge gt le lt ltgt u= neq) (define_operator_list swapped_tcc_comparison gt ge eq ne le lt unordered ordered ungt unge unlt unle uneq l= tgt) -(define_operator_list simple_comparison lt le eq ne ge gt) -(define_operator_list swapped_simple_comparison gt ge eq ne le lt) +(define_operator_list simple_comparison lt le eq ne ge gt) +(define_operator_list inverted_simple_comparison ge gt ne eq lt le) +(define_operator_list swapped_simple_comparison gt ge eq ne le lt) =20 #include "cfn-operators.pd" =20 @@ -2081,7 +2082,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (!canonicalize_math_p ()) (for cmp (gt lt ge le) (simplify - (mult (convert (cmp @0 @1)) @2) + (mult:c (convert (cmp @0 @1)) @2) (cond (cmp @0 @1) @2 { build_zero_cst (type); })))) =20 /* For integral types with undefined overflow and C !=3D 0 fold @@ -3551,6 +3552,63 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (cond (le @0 integer_zerop@1) (negate@2 @0) integer_zerop@1) (max @2 @1)) =20 +/* (a & ((c `cmp` d) - 1)) | (b & ~((c `cmp` d) - 1)) -> c `cmp` d ? a : = b. + by matching the canonicanized xor form. This relies on: 0 ^ a =3D=3D a= and + (a ^ b) ^ a =3D=3D b. So (((a ^ b) & -((unsigned T)(c `cmp` d))) ^ b) = into + c `cmp` d ? a : b. */ +(for cmp (simple_comparison) + icmp (inverted_simple_comparison) + (simplify + (bit_xor:c + @0 + (bit_and:c + (bit_xor:c @1 @0) + (negate (cmp@4 @2 @3)))) + (if (INTEGRAL_TYPE_P (type) && tree_zero_one_valued_p (@4)) + (convert:type (cond @4 @1 @0)))) + /* ((unsigned T)(((signed T) (a `cmp` b)) + -1)) -> a `icmp` b ? -1 : 0. = */ + (simplify + (convert (plus:c integer_minus_onep (convert2?@1 (cmp@2 @3 @4)))) + (if (tree_zero_one_valued_p (@2) + && INTEGRAL_TYPE_P (type) + && TYPE_UNSIGNED (type) + && !TYPE_UNSIGNED (TREE_TYPE (@1)) + && useless_type_conversion_p (unsigned_type_for (TREE_TYPE (@1)), t= ype)) + (cond (icmp @3 @4) { build_all_ones_cst (type); } + { build_zero_cst (type); }))) + /* ((-(unsigned T)(a `cmp` b)) & c) -> a `cmp` b ? c : 0. */ + (simplify + (bit_and:c + (convert2?@5 (negate@4 (convert (cmp@0 @1 @2)))) @3) + (if (tree_zero_one_valued_p (@0) + && INTEGRAL_TYPE_P (type) + && TYPE_UNSIGNED (TREE_TYPE (@4)) + && useless_type_conversion_p (unsigned_type_for (TREE_TYPE (@5)), + TREE_TYPE (@4))) + (cond (cmp @1 @2) @3 { build_zero_cst (type); }))) + /* (a `cmp` b) ? d : (a `icmp` b) ? c : e -> a `cmp` b ? d : c. */ + (simplify + (cond (cmp@0 @1 @2) @4 + (cond (icmp @1 @2) @3 @5)) + (cond @0 @4 @3)) + + /* (a `cmp` b) ? ((a `icmp` b) ? : c) : d -> a `cmp` b ? c : d. *= / + (simplify + (cond (cmp@0 @1 @2) + (cond (icmp @1 @2) @3 @4) @5) + (cond @0 @4 @5))) + +(for op (bit_ior bit_and bit_xor) + /* (a `op` (b ? 0 : c) -> b ? a `op` 0 : a `op` c + and (a `op` (b ? c : 0) -> b ? a `op` c : a `op` 0 + we only fold 0 because one operand is guaranteed to simplify. */ + (simplify + (op:c (cond @0 zerop@3 @1) @2) + (cond @0 (op @3 @2) (op @1 @2))) + (simplify + (op:c (cond @0 @1 zerop@3) @2) + (cond @0 (op @1 @2) (op @3 @2)))) + /* Simplifications of shift and rotates. */ =20 (for rotate (lrotate rrotate) diff --git a/gcc/testsuite/gcc.dg/select_cond_1.c b/gcc/testsuite/gcc.dg/se= lect_cond_1.c new file mode 100644 index 0000000000000000000000000000000000000000..9eb9959baafe5fffeec24e4e3ae= 656f8fcfe943c --- /dev/null +++ b/gcc/testsuite/gcc.dg/select_cond_1.c @@ -0,0 +1,97 @@ +/* { dg-do run } */ +/* { dg-additional-options "-O2 -std=3Dc99 -fdump-tree-optimized -save-tem= ps" } */ + +#include + +__attribute__((noipa, noinline)) +uint32_t min1_32u(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t max1_32u(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a <=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min2_32u(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a > b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t max2_32u(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a < b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min3_32u(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a =3D=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t max3_32u(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a !=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +/* { dg-final { scan-tree-dump-times {_[0-9]+ \? c_[0-9]+\(D\) : d_[0-9]+\= (D\)} 6 "optimized" } } */ + +extern void abort (); + +int main () { + + if (min1_32u (3, 5, 7 , 8) !=3D 7) + abort (); + + if (max1_32u (3, 5, 7 , 8) !=3D 8) + abort (); + + if (min1_32u (5, 3, 7 , 8) !=3D 8) + abort (); + + if (max1_32u (5, 3, 7 , 8) !=3D 7) + abort (); + + if (min2_32u (3, 5, 7 , 8) !=3D 7) + abort (); + + if (max2_32u (3, 5, 7 , 8) !=3D 8) + abort (); + + if (min2_32u (5, 3, 7 , 8) !=3D 8) + abort (); + + if (max2_32u (5, 3, 7 , 8) !=3D 7) + abort (); + + if (min3_32u (3, 5, 7 , 8) !=3D 7) + abort (); + + if (max3_32u (3, 5, 7 , 8) !=3D 8) + abort (); + + if (min3_32u (5, 3, 7 , 8) !=3D 7) + abort (); + + if (max3_32u (5, 3, 7 , 8) !=3D 8) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/select_cond_2.c b/gcc/testsuite/gcc.dg/se= lect_cond_2.c new file mode 100644 index 0000000000000000000000000000000000000000..623b2272ee7b4b00130d5e9fb8c= 781dbc5d4189e --- /dev/null +++ b/gcc/testsuite/gcc.dg/select_cond_2.c @@ -0,0 +1,99 @@ +/* { dg-do run } */ +/* { dg-additional-options "-O2 -std=3Dc99 -fdump-tree-optimized -save-tem= ps" } */ + +#include + +__attribute__((noipa, noinline)) +uint32_t min1_32u(uint32_t a, uint32_t b) { + uint32_t result; + uint32_t m =3D (a >=3D b) - 1; + result =3D (a & m) | (b & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t max1_32u(uint32_t a, uint32_t b) { + uint32_t result; + uint32_t m =3D (a <=3D b) - 1; + result =3D (a & m) | (b & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min2_32u(uint32_t a, uint32_t b) { + uint32_t result; + uint32_t m =3D (a > b) - 1; + result =3D (a & m) | (b & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t max2_32u(uint32_t a, uint32_t b) { + uint32_t result; + uint32_t m =3D (a < b) - 1; + result =3D (a & m) | (b & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min3_32u(uint32_t a, uint32_t b) { + uint32_t result; + uint32_t m =3D (a =3D=3D b) - 1; + result =3D (a & m) | (b & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t max3_32u(uint32_t a, uint32_t b) { + uint32_t result; + uint32_t m =3D (a !=3D b) - 1; + result =3D (a & m) | (b & ~m); + return result; +} + +/* { dg-final { scan-tree-dump-not {_[0-9]+ \? c_[0-9]+\(D\) : d_[0-9]+\(D= \)} "optimized" } } */ +/* { dg-final { scan-tree-dump-times {MIN_EXPR} 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-times {MAX_EXPR} 2 "optimized" } } */ + +extern void abort (); + +int main () { + + if (min1_32u (7 , 8) !=3D 7) + abort (); + + if (max1_32u (7 , 8) !=3D 8) + abort (); + + if (min1_32u (7 , 8) !=3D 7) + abort (); + + if (max1_32u (7, 8) !=3D 8) + abort (); + + if (min2_32u (7 , 8) !=3D 7) + abort (); + + if (max2_32u (7 , 8) !=3D 8) + abort (); + + if (min2_32u (7 , 8) !=3D 7) + abort (); + + if (max2_32u (7 , 8) !=3D 8) + abort (); + + if (min3_32u (7 , 8) !=3D 7) + abort (); + + if (max3_32u (7 , 8) !=3D 8) + abort (); + + if (min3_32u (7 , 8) !=3D 7) + abort (); + + if (max3_32u (7 , 8) !=3D 8) + abort (); + + return 0; +} diff --git a/gcc/testsuite/gcc.dg/select_cond_3.c b/gcc/testsuite/gcc.dg/se= lect_cond_3.c new file mode 100644 index 0000000000000000000000000000000000000000..80087d4a0bd37066dbd44335aa3= d1bf13fe3fa95 --- /dev/null +++ b/gcc/testsuite/gcc.dg/select_cond_3.c @@ -0,0 +1,101 @@ +/* { dg-do run } */ +/* { dg-additional-options "-O2 -std=3Dc99 -fdump-tree-optimized -save-tem= ps" } */ + +#include + +__attribute__((noipa, noinline)) +int32_t min1_32u1(int32_t a, int32_t b, int32_t c, int32_t d) { + uint32_t result; + uint32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min1_32u2(uint32_t a, uint32_t b, int32_t c, int32_t d) { + uint32_t result; + uint32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min1_32u3(uint32_t a, uint32_t b, uint32_t c, int32_t d) { + uint32_t result; + uint32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min1_32u4(uint32_t a, uint32_t b, int32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min1_32u5(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + uint32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min1_32u6(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { + uint32_t result; + int32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min1_32u7(uint8_t a, uint16_t b, uint32_t c, uint32_t d) { + uint32_t result; + int32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +__attribute__((noipa, noinline)) +uint32_t min1_32u8(uint32_t a, uint64_t b, uint32_t c, uint32_t d) { + uint32_t result; + int32_t m =3D (a >=3D b) - 1; + result =3D (c & m) | (d & ~m); + return result; +} + +/* { dg-final { scan-tree-dump-times {_[0-9]+ \? [^ ]+ : [^ ]+;} 8 "optimi= zed" } } */ + +extern void abort (); + +int main () { + + if (min1_32u1 (3, 5, 7 , 8) !=3D 7) + abort (); + + if (min1_32u2 (3, 5, 7 , 8) !=3D 7) + abort (); + + if (min1_32u3 (3, 5, 7 , 8) !=3D 7) + abort (); + + if (min1_32u4 (3, 5, 7 , 8) !=3D 7) + abort (); + + if (min1_32u5 (3, 5, 7 , 8) !=3D 7) + abort (); + + if (min1_32u6 (3, 5, 7 , 8) !=3D 7) + abort (); + + if (min1_32u7 (3, 5, 7 , 8) !=3D 7) + abort (); + + if (min1_32u8 (3, 5, 7 , 8) !=3D 7) + abort (); + + return 0; +} --_002_VI1PR08MB5325A2C8533E529F5E3C16ADFF379VI1PR08MB5325eurp_ Content-Type: application/octet-stream; name="rb16259.patch" Content-Description: rb16259.patch Content-Disposition: attachment; filename="rb16259.patch"; size=10980; creation-date="Mon, 31 Oct 2022 11:46:24 GMT"; modification-date="Mon, 31 Oct 2022 11:47:04 GMT" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9tYXRjaC5wZCBiL2djYy9tYXRjaC5wZAppbmRleCA0NWY4OTQxMzk2 ZmZkODQzZjFiYjIzYWI2MzhjM2I4YzZkMGQ1NGI2Li44NGQ5MzFjNWQ1NTllZjFhNjA1ZWExMTIx ZmJlNjU1ZmNmODcwMTk1IDEwMDY0NAotLS0gYS9nY2MvbWF0Y2gucGQKKysrIGIvZ2NjL21hdGNo LnBkCkBAIC01MSw4ICs1MSw5IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlO RzMuICBJZiBub3Qgc2VlCiAgIHVuZ2UgdW5ndCBuZSBlcSB1bmx0IHVubGUgb3JkZXJlZCAgIHVu b3JkZXJlZCBnZSAgIGd0ICAgbGUgICBsdCAgIGx0Z3QgdW5lcSkKIChkZWZpbmVfb3BlcmF0b3Jf bGlzdCBzd2FwcGVkX3RjY19jb21wYXJpc29uCiAgIGd0ICAgZ2UgICBlcSBuZSBsZSAgIGx0ICAg dW5vcmRlcmVkIG9yZGVyZWQgICB1bmd0IHVuZ2UgdW5sdCB1bmxlIHVuZXEgbHRndCkKLShkZWZp bmVfb3BlcmF0b3JfbGlzdCBzaW1wbGVfY29tcGFyaXNvbiAgICAgICAgIGx0ICAgbGUgICBlcSBu ZSBnZSAgIGd0KQotKGRlZmluZV9vcGVyYXRvcl9saXN0IHN3YXBwZWRfc2ltcGxlX2NvbXBhcmlz b24gZ3QgICBnZSAgIGVxIG5lIGxlICAgbHQpCisoZGVmaW5lX29wZXJhdG9yX2xpc3Qgc2ltcGxl X2NvbXBhcmlzb24gICAgICAgICAgbHQgICBsZSAgIGVxIG5lIGdlICAgZ3QpCisoZGVmaW5lX29w ZXJhdG9yX2xpc3QgaW52ZXJ0ZWRfc2ltcGxlX2NvbXBhcmlzb24gZ2UgICBndCAgIG5lIGVxIGx0 ICAgbGUpCisoZGVmaW5lX29wZXJhdG9yX2xpc3Qgc3dhcHBlZF9zaW1wbGVfY29tcGFyaXNvbiAg Z3QgICBnZSAgIGVxIG5lIGxlICAgbHQpCiAKICNpbmNsdWRlICJjZm4tb3BlcmF0b3JzLnBkIgog CkBAIC0yMDgxLDcgKzIwODIsNyBAQCBERUZJTkVfSU5UX0FORF9GTE9BVF9ST1VORF9GTiAoUklO VCkKIChpZiAoIWNhbm9uaWNhbGl6ZV9tYXRoX3AgKCkpCiAgKGZvciBjbXAgKGd0IGx0IGdlIGxl KQogICAoc2ltcGxpZnkKLSAgIChtdWx0IChjb252ZXJ0IChjbXAgQDAgQDEpKSBAMikKKyAgICht dWx0OmMgKGNvbnZlcnQgKGNtcCBAMCBAMSkpIEAyKQogICAgKGNvbmQgKGNtcCBAMCBAMSkgQDIg eyBidWlsZF96ZXJvX2NzdCAodHlwZSk7IH0pKSkpCiAKIC8qIEZvciBpbnRlZ3JhbCB0eXBlcyB3 aXRoIHVuZGVmaW5lZCBvdmVyZmxvdyBhbmQgQyAhPSAwIGZvbGQKQEAgLTM1NTEsNiArMzU1Miw2 MyBAQCBERUZJTkVfSU5UX0FORF9GTE9BVF9ST1VORF9GTiAoUklOVCkKICAgKGNvbmQgKGxlIEAw IGludGVnZXJfemVyb3BAMSkgKG5lZ2F0ZUAyIEAwKSBpbnRlZ2VyX3plcm9wQDEpCiAgIChtYXgg QDIgQDEpKQogCisvKiAoYSAmICgoYyBgY21wYCBkKSAtIDEpKSB8IChiICYgfigoYyBgY21wYCBk KSAtIDEpKSAtPiAgYyBgY21wYCBkID8gYSA6IGIuCisgICBieSBtYXRjaGluZyB0aGUgY2Fub25p Y2FuaXplZCB4b3IgZm9ybS4gIFRoaXMgcmVsaWVzIG9uOiAwIF4gYSA9PSBhIGFuZAorICAgKGEg XiBiKSBeIGEgPT0gYi4gIFNvICgoKGEgXiBiKSAmIC0oKHVuc2lnbmVkIFQpKGMgYGNtcGAgZCkp KSBeIGIpIGludG8KKyAgIGMgYGNtcGAgZCA/IGEgOiBiLiAgKi8KKyhmb3IgY21wIChzaW1wbGVf Y29tcGFyaXNvbikKKyAgICAgaWNtcCAoaW52ZXJ0ZWRfc2ltcGxlX2NvbXBhcmlzb24pCisgKHNp bXBsaWZ5CisgIChiaXRfeG9yOmMKKyAgIEAwCisgICAoYml0X2FuZDpjCisgICAgKGJpdF94b3I6 YyBAMSBAMCkKKyAgICAobmVnYXRlIChjbXBANCBAMiBAMykpKSkKKyAgKGlmIChJTlRFR1JBTF9U WVBFX1AgKHR5cGUpICYmIHRyZWVfemVyb19vbmVfdmFsdWVkX3AgKEA0KSkKKyAgIChjb252ZXJ0 OnR5cGUgKGNvbmQgQDQgQDEgQDApKSkpCisgLyogKCh1bnNpZ25lZCBUKSgoKHNpZ25lZCBUKSAo YSBgY21wYCBiKSkgKyAtMSkpIC0+IGEgYGljbXBgIGIgPyAtMSA6IDAuICAqLworIChzaW1wbGlm eQorICAoY29udmVydCAocGx1czpjIGludGVnZXJfbWludXNfb25lcCAoY29udmVydDI/QDEgKGNt cEAyIEAzIEA0KSkpKQorICAoaWYgKHRyZWVfemVyb19vbmVfdmFsdWVkX3AgKEAyKQorICAgICAg ICYmIElOVEVHUkFMX1RZUEVfUCAodHlwZSkKKyAgICAgICAmJiBUWVBFX1VOU0lHTkVEICh0eXBl KQorICAgICAgICYmICFUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKEAxKSkKKyAgICAgICAmJiB1 c2VsZXNzX3R5cGVfY29udmVyc2lvbl9wICh1bnNpZ25lZF90eXBlX2ZvciAoVFJFRV9UWVBFIChA MSkpLCB0eXBlKSkKKyAgIChjb25kIChpY21wIEAzIEA0KSB7IGJ1aWxkX2FsbF9vbmVzX2NzdCAo dHlwZSk7IH0KKwkJICAgICAgeyBidWlsZF96ZXJvX2NzdCAodHlwZSk7IH0pKSkKKyAvKiAoKC0o dW5zaWduZWQgVCkoYSBgY21wYCBiKSkgJiBjKSAtPiBhIGBjbXBgIGIgPyBjIDogMC4gICovCisg KHNpbXBsaWZ5CisgIChiaXRfYW5kOmMKKyAgIChjb252ZXJ0Mj9ANSAobmVnYXRlQDQgKGNvbnZl cnQgKGNtcEAwIEAxIEAyKSkpKSBAMykKKyAgKGlmICh0cmVlX3plcm9fb25lX3ZhbHVlZF9wIChA MCkKKyAgICAgICAmJiBJTlRFR1JBTF9UWVBFX1AgKHR5cGUpCisgICAgICAgJiYgVFlQRV9VTlNJ R05FRCAoVFJFRV9UWVBFIChANCkpCisgICAgICAgJiYgdXNlbGVzc190eXBlX2NvbnZlcnNpb25f cCAodW5zaWduZWRfdHlwZV9mb3IgKFRSRUVfVFlQRSAoQDUpKSwKKwkJCQkJCQlUUkVFX1RZUEUg KEA0KSkpCisgICAoY29uZCAoY21wIEAxIEAyKSBAMyB7IGJ1aWxkX3plcm9fY3N0ICh0eXBlKTsg fSkpKQorIC8qIChhIGBjbXBgIGIpID8gZCA6IChhIGBpY21wYCBiKSA/IGMgOiBlIC0+IGEgYGNt cGAgYiA/IGQgOiBjLiAgKi8KKyAoc2ltcGxpZnkKKyAgKGNvbmQgKGNtcEAwIEAxIEAyKSBANAor ICAgKGNvbmQgKGljbXAgQDEgQDIpIEAzIEA1KSkKKyAgKGNvbmQgQDAgQDQgQDMpKQorCisgLyog KGEgYGNtcGAgYikgPyAoKGEgYGljbXBgIGIpID8gPGRlYWQ+IDogYykgOiBkIC0+IGEgYGNtcGAg YiA/IGMgOiBkLiAgKi8KKyAoc2ltcGxpZnkKKyAgKGNvbmQgKGNtcEAwIEAxIEAyKQorICAgKGNv bmQgKGljbXAgQDEgQDIpIEAzIEA0KSBANSkKKyAgKGNvbmQgQDAgQDQgQDUpKSkKKworKGZvciBv cCAoYml0X2lvciBiaXRfYW5kIGJpdF94b3IpCisgLyogKGEgYG9wYCAoYiA/IDAgOiBjKSAtPiBi ID8gYSBgb3BgIDAgOiBhIGBvcGAgYworICAgIGFuZCAoYSBgb3BgIChiID8gYyA6IDApIC0+IGIg PyBhIGBvcGAgYyA6IGEgYG9wYCAwCisgICAgd2Ugb25seSBmb2xkIDAgYmVjYXVzZSBvbmUgb3Bl cmFuZCBpcyBndWFyYW50ZWVkIHRvIHNpbXBsaWZ5LiAgKi8KKyAoc2ltcGxpZnkKKyAgKG9wOmMg KGNvbmQgQDAgemVyb3BAMyBAMSkgQDIpCisgIChjb25kIEAwIChvcCBAMyBAMikgKG9wIEAxIEAy KSkpCisgKHNpbXBsaWZ5CisgIChvcDpjIChjb25kIEAwIEAxIHplcm9wQDMpIEAyKQorICAoY29u ZCBAMCAob3AgQDEgQDIpIChvcCBAMyBAMikpKSkKKwogLyogU2ltcGxpZmljYXRpb25zIG9mIHNo aWZ0IGFuZCByb3RhdGVzLiAgKi8KIAogKGZvciByb3RhdGUgKGxyb3RhdGUgcnJvdGF0ZSkKZGlm ZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3NlbGVjdF9jb25kXzEuYyBiL2djYy90ZXN0 c3VpdGUvZ2NjLmRnL3NlbGVjdF9jb25kXzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45ZWI5OTU5YmFhZmU1ZmZm ZWVjMjRlNGUzYWU2NTZmOGZjZmU5NDNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvc2VsZWN0X2NvbmRfMS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIHsgZGctZG8gcnVu IH0gKi8KKy8qIHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItTzIgLXN0ZD1jOTkgLWZkdW1wLXRy ZWUtb3B0aW1pemVkIC1zYXZlLXRlbXBzIiB9ICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwor X19hdHRyaWJ1dGVfXygobm9pcGEsIG5vaW5saW5lKSkKK3VpbnQzMl90IG1pbjFfMzJ1KHVpbnQz Ml90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMsIHVpbnQzMl90IGQpIHsKKyAgdWludDMyX3Qg cmVzdWx0OworICB1aW50MzJfdCBtID0gKGEgPj0gYikgLSAxOworICByZXN1bHQgPSAoYyAmIG0p IHwgKGQgJiB+bSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK19fYXR0cmlidXRlX18oKG5vaXBh LCBub2lubGluZSkpCit1aW50MzJfdCBtYXgxXzMydSh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1 aW50MzJfdCBjLCB1aW50MzJfdCBkKSB7CisgIHVpbnQzMl90IHJlc3VsdDsKKyAgdWludDMyX3Qg bSA9IChhIDw9IGIpIC0gMTsKKyAgcmVzdWx0ID0gKGMgJiBtKSB8IChkICYgfm0pOworICByZXR1 cm4gcmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lwYSwgbm9pbmxpbmUpKQordWludDMy X3QgbWluMl8zMnUodWludDMyX3QgYSwgdWludDMyX3QgYiwgdWludDMyX3QgYywgdWludDMyX3Qg ZCkgeworICB1aW50MzJfdCByZXN1bHQ7CisgIHVpbnQzMl90IG0gPSAoYSA+IGIpIC0gMTsKKyAg cmVzdWx0ID0gKGMgJiBtKSB8IChkICYgfm0pOworICByZXR1cm4gcmVzdWx0OworfQorCitfX2F0 dHJpYnV0ZV9fKChub2lwYSwgbm9pbmxpbmUpKQordWludDMyX3QgbWF4Ml8zMnUodWludDMyX3Qg YSwgdWludDMyX3QgYiwgdWludDMyX3QgYywgdWludDMyX3QgZCkgeworICB1aW50MzJfdCByZXN1 bHQ7CisgIHVpbnQzMl90IG0gPSAoYSA8IGIpIC0gMTsKKyAgcmVzdWx0ID0gKGMgJiBtKSB8IChk ICYgfm0pOworICByZXR1cm4gcmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lwYSwgbm9p bmxpbmUpKQordWludDMyX3QgbWluM18zMnUodWludDMyX3QgYSwgdWludDMyX3QgYiwgdWludDMy X3QgYywgdWludDMyX3QgZCkgeworICB1aW50MzJfdCByZXN1bHQ7CisgIHVpbnQzMl90IG0gPSAo YSA9PSBiKSAtIDE7CisgIHJlc3VsdCA9IChjICYgbSkgfCAoZCAmIH5tKTsKKyAgcmV0dXJuIHJl c3VsdDsKK30KKworX19hdHRyaWJ1dGVfXygobm9pcGEsIG5vaW5saW5lKSkKK3VpbnQzMl90IG1h eDNfMzJ1KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMsIHVpbnQzMl90IGQpIHsK KyAgdWludDMyX3QgcmVzdWx0OworICB1aW50MzJfdCBtID0gKGEgIT0gYikgLSAxOworICByZXN1 bHQgPSAoYyAmIG0pIHwgKGQgJiB+bSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIHsgZGct ZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyB7X1swLTldKyBcPyBjX1swLTldK1woRFwpIDog ZF9bMC05XStcKERcKX0gNiAib3B0aW1pemVkIiB9IH0gKi8KKworZXh0ZXJuIHZvaWQgYWJvcnQg KCk7CisKK2ludCBtYWluICgpIHsKKworICBpZiAobWluMV8zMnUgKDMsIDUsIDcgLCA4KSAhPSA3 KQorICAgIGFib3J0ICgpOworCisgIGlmIChtYXgxXzMydSAoMywgNSwgNyAsIDgpICE9IDgpCisg ICAgYWJvcnQgKCk7CisKKyAgaWYgKG1pbjFfMzJ1ICg1LCAzLCA3ICwgOCkgIT0gOCkKKyAgICBh Ym9ydCAoKTsKKworICBpZiAobWF4MV8zMnUgKDUsIDMsIDcgLCA4KSAhPSA3KQorICAgIGFib3J0 ICgpOworCisgIGlmIChtaW4yXzMydSAoMywgNSwgNyAsIDgpICE9IDcpCisgICAgYWJvcnQgKCk7 CisKKyAgaWYgKG1heDJfMzJ1ICgzLCA1LCA3ICwgOCkgIT0gOCkKKyAgICBhYm9ydCAoKTsKKwor ICBpZiAobWluMl8zMnUgKDUsIDMsIDcgLCA4KSAhPSA4KQorICAgIGFib3J0ICgpOworCisgIGlm IChtYXgyXzMydSAoNSwgMywgNyAsIDgpICE9IDcpCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKG1p bjNfMzJ1ICgzLCA1LCA3ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWF4M18z MnUgKDMsIDUsIDcgLCA4KSAhPSA4KQorICAgIGFib3J0ICgpOworCisgIGlmIChtaW4zXzMydSAo NSwgMywgNyAsIDgpICE9IDcpCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKG1heDNfMzJ1ICg1LCAz LCA3ICwgOCkgIT0gOCkKKyAgICBhYm9ydCAoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdp dCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3NlbGVjdF9jb25kXzIuYyBiL2djYy90ZXN0c3VpdGUv Z2NjLmRnL3NlbGVjdF9jb25kXzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MjNiMjI3MmVlN2I0YjAwMTMwZDVl OWZiOGM3ODFkYmM1ZDQxODllCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu ZGcvc2VsZWN0X2NvbmRfMi5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIHsgZGctZG8gcnVuIH0gKi8K Ky8qIHsgZGctYWRkaXRpb25hbC1vcHRpb25zICItTzIgLXN0ZD1jOTkgLWZkdW1wLXRyZWUtb3B0 aW1pemVkIC1zYXZlLXRlbXBzIiB9ICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworX19hdHRy aWJ1dGVfXygobm9pcGEsIG5vaW5saW5lKSkKK3VpbnQzMl90IG1pbjFfMzJ1KHVpbnQzMl90IGEs IHVpbnQzMl90IGIpIHsKKyAgdWludDMyX3QgcmVzdWx0OworICB1aW50MzJfdCBtID0gKGEgPj0g YikgLSAxOworICByZXN1bHQgPSAoYSAmIG0pIHwgKGIgJiB+bSk7CisgIHJldHVybiByZXN1bHQ7 Cit9CisKK19fYXR0cmlidXRlX18oKG5vaXBhLCBub2lubGluZSkpCit1aW50MzJfdCBtYXgxXzMy dSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7CisgIHVpbnQzMl90IHJlc3VsdDsKKyAgdWludDMy X3QgbSA9IChhIDw9IGIpIC0gMTsKKyAgcmVzdWx0ID0gKGEgJiBtKSB8IChiICYgfm0pOworICBy ZXR1cm4gcmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lwYSwgbm9pbmxpbmUpKQordWlu dDMyX3QgbWluMl8zMnUodWludDMyX3QgYSwgdWludDMyX3QgYikgeworICB1aW50MzJfdCByZXN1 bHQ7CisgIHVpbnQzMl90IG0gPSAoYSA+IGIpIC0gMTsKKyAgcmVzdWx0ID0gKGEgJiBtKSB8IChi ICYgfm0pOworICByZXR1cm4gcmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lwYSwgbm9p bmxpbmUpKQordWludDMyX3QgbWF4Ml8zMnUodWludDMyX3QgYSwgdWludDMyX3QgYikgeworICB1 aW50MzJfdCByZXN1bHQ7CisgIHVpbnQzMl90IG0gPSAoYSA8IGIpIC0gMTsKKyAgcmVzdWx0ID0g KGEgJiBtKSB8IChiICYgfm0pOworICByZXR1cm4gcmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9f KChub2lwYSwgbm9pbmxpbmUpKQordWludDMyX3QgbWluM18zMnUodWludDMyX3QgYSwgdWludDMy X3QgYikgeworICB1aW50MzJfdCByZXN1bHQ7CisgIHVpbnQzMl90IG0gPSAoYSA9PSBiKSAtIDE7 CisgIHJlc3VsdCA9IChhICYgbSkgfCAoYiAmIH5tKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwor X19hdHRyaWJ1dGVfXygobm9pcGEsIG5vaW5saW5lKSkKK3VpbnQzMl90IG1heDNfMzJ1KHVpbnQz Ml90IGEsIHVpbnQzMl90IGIpIHsKKyAgdWludDMyX3QgcmVzdWx0OworICB1aW50MzJfdCBtID0g KGEgIT0gYikgLSAxOworICByZXN1bHQgPSAoYSAmIG0pIHwgKGIgJiB+bSk7CisgIHJldHVybiBy ZXN1bHQ7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3Qge19bMC05XSsg XD8gY19bMC05XStcKERcKSA6IGRfWzAtOV0rXChEXCl9ICJvcHRpbWl6ZWQiIH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wLXRpbWVzIHtNSU5fRVhQUn0gMiAib3B0aW1pemVk IiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC10aW1lcyB7TUFYX0VYUFJ9 IDIgIm9wdGltaXplZCIgfSB9ICovCisKK2V4dGVybiB2b2lkIGFib3J0ICgpOworCitpbnQgbWFp biAoKSB7CisKKyAgaWYgKG1pbjFfMzJ1ICg3ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKwor ICBpZiAobWF4MV8zMnUgKDcgLCA4KSAhPSA4KQorICAgIGFib3J0ICgpOworCisgIGlmIChtaW4x XzMydSAoNyAsIDgpICE9IDcpCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKG1heDFfMzJ1ICg3LCA4 KSAhPSA4KQorICAgIGFib3J0ICgpOworCisgIGlmIChtaW4yXzMydSAoNyAsIDgpICE9IDcpCisg ICAgYWJvcnQgKCk7CisKKyAgaWYgKG1heDJfMzJ1ICg3ICwgOCkgIT0gOCkKKyAgICBhYm9ydCAo KTsKKworICBpZiAobWluMl8zMnUgKDcgLCA4KSAhPSA3KQorICAgIGFib3J0ICgpOworCisgIGlm IChtYXgyXzMydSAoNyAsIDgpICE9IDgpCisgICAgYWJvcnQgKCk7CisKKyAgaWYgKG1pbjNfMzJ1 ICg3ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWF4M18zMnUgKDcgLCA4KSAh PSA4KQorICAgIGFib3J0ICgpOworCisgIGlmIChtaW4zXzMydSAoNyAsIDgpICE9IDcpCisgICAg YWJvcnQgKCk7CisKKyAgaWYgKG1heDNfMzJ1ICg3ICwgOCkgIT0gOCkKKyAgICBhYm9ydCAoKTsK KworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3NlbGVj dF9jb25kXzMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL3NlbGVjdF9jb25kXzMuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwLi44MDA4N2Q0YTBiZDM3MDY2ZGJkNDQzMzVhYTNkMWJmMTNmZTNmYTk1Ci0tLSAvZGV2L251 bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvc2VsZWN0X2NvbmRfMy5jCkBAIC0wLDAgKzEs MTAxIEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLWFkZGl0aW9uYWwtb3B0aW9ucyAi LU8yIC1zdGQ9Yzk5IC1mZHVtcC10cmVlLW9wdGltaXplZCAtc2F2ZS10ZW1wcyIgfSAqLworCisj aW5jbHVkZSA8c3RkaW50Lmg+CisKK19fYXR0cmlidXRlX18oKG5vaXBhLCBub2lubGluZSkpCitp bnQzMl90IG1pbjFfMzJ1MShpbnQzMl90IGEsIGludDMyX3QgYiwgaW50MzJfdCBjLCBpbnQzMl90 IGQpIHsKKyAgdWludDMyX3QgcmVzdWx0OworICB1aW50MzJfdCBtID0gKGEgPj0gYikgLSAxOwor ICByZXN1bHQgPSAoYyAmIG0pIHwgKGQgJiB+bSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK19f YXR0cmlidXRlX18oKG5vaXBhLCBub2lubGluZSkpCit1aW50MzJfdCBtaW4xXzMydTIodWludDMy X3QgYSwgdWludDMyX3QgYiwgaW50MzJfdCBjLCBpbnQzMl90IGQpIHsKKyAgdWludDMyX3QgcmVz dWx0OworICB1aW50MzJfdCBtID0gKGEgPj0gYikgLSAxOworICByZXN1bHQgPSAoYyAmIG0pIHwg KGQgJiB+bSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK19fYXR0cmlidXRlX18oKG5vaXBhLCBu b2lubGluZSkpCit1aW50MzJfdCBtaW4xXzMydTModWludDMyX3QgYSwgdWludDMyX3QgYiwgdWlu dDMyX3QgYywgaW50MzJfdCBkKSB7CisgIHVpbnQzMl90IHJlc3VsdDsKKyAgdWludDMyX3QgbSA9 IChhID49IGIpIC0gMTsKKyAgcmVzdWx0ID0gKGMgJiBtKSB8IChkICYgfm0pOworICByZXR1cm4g cmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lwYSwgbm9pbmxpbmUpKQordWludDMyX3Qg bWluMV8zMnU0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIGludDMyX3QgYywgdWludDMyX3QgZCkg eworICB1aW50MzJfdCByZXN1bHQ7CisgIHVpbnQzMl90IG0gPSAoYSA+PSBiKSAtIDE7CisgIHJl c3VsdCA9IChjICYgbSkgfCAoZCAmIH5tKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworX19hdHRy aWJ1dGVfXygobm9pcGEsIG5vaW5saW5lKSkKK3VpbnQzMl90IG1pbjFfMzJ1NSh1aW50MzJfdCBh LCB1aW50MzJfdCBiLCB1aW50MzJfdCBjLCB1aW50MzJfdCBkKSB7CisgIHVpbnQzMl90IHJlc3Vs dDsKKyAgdWludDMyX3QgbSA9IChhID49IGIpIC0gMTsKKyAgcmVzdWx0ID0gKGMgJiBtKSB8IChk ICYgfm0pOworICByZXR1cm4gcmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9fKChub2lwYSwgbm9p bmxpbmUpKQordWludDMyX3QgbWluMV8zMnU2KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQz Ml90IGMsIHVpbnQzMl90IGQpIHsKKyAgdWludDMyX3QgcmVzdWx0OworICBpbnQzMl90IG0gPSAo YSA+PSBiKSAtIDE7CisgIHJlc3VsdCA9IChjICYgbSkgfCAoZCAmIH5tKTsKKyAgcmV0dXJuIHJl c3VsdDsKK30KKworX19hdHRyaWJ1dGVfXygobm9pcGEsIG5vaW5saW5lKSkKK3VpbnQzMl90IG1p bjFfMzJ1Nyh1aW50OF90IGEsIHVpbnQxNl90IGIsIHVpbnQzMl90IGMsIHVpbnQzMl90IGQpIHsK KyAgdWludDMyX3QgcmVzdWx0OworICBpbnQzMl90IG0gPSAoYSA+PSBiKSAtIDE7CisgIHJlc3Vs dCA9IChjICYgbSkgfCAoZCAmIH5tKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworX19hdHRyaWJ1 dGVfXygobm9pcGEsIG5vaW5saW5lKSkKK3VpbnQzMl90IG1pbjFfMzJ1OCh1aW50MzJfdCBhLCB1 aW50NjRfdCBiLCB1aW50MzJfdCBjLCB1aW50MzJfdCBkKSB7CisgIHVpbnQzMl90IHJlc3VsdDsK KyAgaW50MzJfdCBtID0gKGEgPj0gYikgLSAxOworICByZXN1bHQgPSAoYyAmIG0pIHwgKGQgJiB+ bSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVt cC10aW1lcyB7X1swLTldKyBcPyBbXiBdKyA6IFteIF0rO30gOCAib3B0aW1pemVkIiB9IH0gKi8K KworZXh0ZXJuIHZvaWQgYWJvcnQgKCk7CisKK2ludCBtYWluICgpIHsKKworICBpZiAobWluMV8z MnUxICgzLCA1LCA3ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluMV8zMnUy ICgzLCA1LCA3ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluMV8zMnUzICgz LCA1LCA3ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluMV8zMnU0ICgzLCA1 LCA3ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluMV8zMnU1ICgzLCA1LCA3 ICwgOCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluMV8zMnU2ICgzLCA1LCA3ICwg OCkgIT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluMV8zMnU3ICgzLCA1LCA3ICwgOCkg IT0gNykKKyAgICBhYm9ydCAoKTsKKworICBpZiAobWluMV8zMnU4ICgzLCA1LCA3ICwgOCkgIT0g NykKKyAgICBhYm9ydCAoKTsKKworICByZXR1cm4gMDsKK30K --_002_VI1PR08MB5325A2C8533E529F5E3C16ADFF379VI1PR08MB5325eurp_--