From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 47607 invoked by alias); 17 Nov 2016 16:26:32 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 47584 invoked by uid 89); 17 Nov 2016 16:26:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=Aarch64, 8184 X-HELO: EUR01-HE1-obe.outbound.protection.outlook.com Received: from mail-he1eur01on0059.outbound.protection.outlook.com (HELO EUR01-HE1-obe.outbound.protection.outlook.com) (104.47.0.59) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 17 Nov 2016 16:26:21 +0000 Received: from VI1PR0801CA0018.eurprd08.prod.outlook.com (10.167.193.156) by DB5PR08MB1223.eurprd08.prod.outlook.com (10.166.174.156) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.734.8; Thu, 17 Nov 2016 16:26:17 +0000 Received: from DB3FFO11FD005.protection.gbl (2a01:111:f400:7e04::179) by VI1PR0801CA0018.outlook.office365.com (2603:10a6:800:32::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.721.10 via Frontend Transport; Thu, 17 Nov 2016 16:26:17 +0000 Authentication-Results: spf=permerror (sender IP is 217.140.96.140) smtp.mailfrom=arm.com; gcc.gnu.org; dkim=none (message not signed) header.d=none;gcc.gnu.org; dmarc=none action=none header.from=arm.com; Received-SPF: PermError (protection.outlook.com: domain of arm.com used an invalid SPF mechanism) Received: from nebula.arm.com (217.140.96.140) by DB3FFO11FD005.mail.protection.outlook.com (10.47.216.94) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.721.5 via Frontend Transport; Thu, 17 Nov 2016 16:26:16 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:;UpperCasedChecksum:;SizeAsReceived:844;Count:14 Received: from arm.com (10.1.2.79) by mail.arm.com (10.1.106.66) with Microsoft SMTP Server id 14.3.294.0; Thu, 17 Nov 2016 16:26:04 +0000 Date: Thu, 17 Nov 2016 16:26:00 -0000 From: James Greenhalgh To: Michael Collison CC: "gcc-patches@gcc.gnu.org" , nd Subject: Re: [Aarch64][PATCH] Improve Logical And Immediate Expressions Message-ID: <20161117162603.GB14894@arm.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-IncomingHeaderCount: 14 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:217.140.96.140;IPV:CAL;SCL:-1;CTRY:GB;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(448002)(24454002)(199003)(189002)(87936001)(450100001)(104016004)(305945005)(7846002)(46406003)(50466002)(2906002)(4326007)(83506001)(85326001)(47776003)(77096005)(92566002)(86362001)(2950100002)(575784001)(5660300001)(8936002)(7696004)(36756003)(110136003)(6636002)(26826002)(8676002)(4001350100001)(76176999)(106466001)(33656002)(356003)(5890100001)(50986999)(246002)(23726003)(229853002)(54356999)(626004)(97756001)(1076002)(189998001)(14773001)(18370500001);DIR:OUT;SFP:1101;SCL:1;SRVR:DB5PR08MB1223;H:nebula.arm.com;FPR:;SPF:PermError;PTR:fw-tnat.cambridge.arm.com;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;DB3FFO11FD005;1:M8MywkGstag5zs25938WxTlKoa2wv1Hkx2WDJTSJ7aoDlX69z9mL6QFnZmy8xIqDGHnIBk9lELgC2G/6D/9qNeu3wrkHMkhGBW5OzmJiBS40PLmvJXl5+tflf/d9ZB7W6EyGcO9DAKnBYqQw/vettf45bqDVBGx+SJL/kxzj3tW49MwbeQN/q7nLgzzzy+BNW5vT4iAvdT+AUzAi9XUPa8I87DJoVJbLLgGfDK4LKV7kispqC/phK7E1mI7ZCXkd8JCAHRJTEPuRn7JMCiydUh+uIq8UniGZzYV7rk8IOFyIwUtVXyZSGh45HRLqsTFUrhypoTl/hun7tn70jwXYEuBKV0J5HFUd8upTNi8L2fP8iURqOG5TQnh/WO2qTaSBr3LzbQJ0NYtngSdwxx7EV6zNdrbVIaQHxlp87tgnA7FWV9Go7jjhmOnh48Xc9GxMZg2T7NrkA/GcD4d9FIEOWTEfp9PiHLnAYLLi6JaocRqSnQ+jADOjQR0dlAW53ixMTp3fM5Az5L9KvUM06+gQVrFb40IFgA+5Pb0J9g8riq4S+xAQQGMRHt1bPN9LsUc1yZ7em3YMopD/kWsErOhT60Te+t7jAmx2lB4yLgqeqKI= X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB1223;2:gMBKXMYWp6vFrQGRedpceaUkSew1uDkYkCYX+7m8ZUxVlr3w7/WDCizn1UL+SuZaQztQw7OYty1f9cwxim4doVGyo0oCoHdLtr0nsF9pS+nSDx+S/RiTvTfJzdD8K7L6QSOGugUhJPWEyMyJXfw/Wh/UVShxVY5Mf2A7Ilj/uAw=;3:BPPzbwxuIM6if4iMJYN8vaQCS2U5DSgnwVmYmWn9yi41xmOlvOqDiFs6irTE0g4AVoP3YGbCtatitc4LYItw3WGSdh39TJ7eGhBv9LdhF+Ws3wQym33tDElPVCoZW3PpytL3iy3whhGaZrlO4HXSDUX236II9xU4QFdakcm4mtaWW2/nV33YDL3qQ4HZxXJyFniSAIR8W74qeMUO3XZIhMX97OrOKtHBwXruOAO2A3U5kT08DXDpe7als7OPGHyXzbCDReXnSu2BCDcQ2S37gg==;25:ZRbyv5cSWWZj2PMJPcwkWPEvOT3cojcN9wRKIzzeWQYl4f6eFx7CMKLwQ/SoZSld9sg3KY2yyxuQISRZwJrogr1EWzEq6uuGwcKp9u82HOh1p07pXIGiLnsGmuwfQGjY4mlgo70cCU9DlFXX+wDWUwrDo7IsKbOxyWzD4FnX/aZNT9OlIcvBdVdzYXJbjW3LpwB86UFR61rhJf9Mj7/V4+cMzl2eCghPWsF5ErU2Wp4WSlQioypu7xpRXCQhHxEwFqKV5qcFxbDFsSb5+4O7C9d+w+WQ3pbsJFWiyCDdPASXyWackm0qfTZA1Kow6AsaEz67cz6FzV91y562SAgraVvZW9Jh0jJbWShO8bUkqUAC49UycmW/JDIhLgN68RGb8Owk9pSN87cdLmoKWrGmzB7HdVAIe1rhSxmRw/1k68QRc85udGkHRVVa0Qp+HK+ZEpGBMpuXng51bHaaVc9wGw== X-MS-Office365-Filtering-Correlation-Id: f0426de6-ddbb-4b5b-3b11-08d40f0674dc X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:DB5PR08MB1223; X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB1223;31:IQdtbPucHPZOJsEEv8QAeuNFrJb2R1ywAD0bfmgd6Zbf6ynWebxK0/bn6ENw8dSQnZ35IRBp/vUpwu6zJnpXOI6FV1dU3G9I/D60ZkVPF07/cDJpnnLrPvdqCCrTSF9TFZI8vw9iIRAG4dv1fWSAU4gA3TllMgpAW4i0SA/AaqyUi1rpVQX/IMnTiaJV8cUrR4l08do07VE3sPFoeilK8i/EABa0WlJ+xNkL3tMrp9hN58k6IfWhS+phEmKsE2ykHLwv4DV9+Z5dGZ17vzH3JA==;20:wGB0YZfBDS5Yk1IKO4FlIX89quWCyP5B39a4zFOMtuFQKR7n5fvE9Sox7rlpJLYnfANqkDnBJfTyP6p8BepOyFvMRi10b+PHFItxMmwQq1sFFdlnMCPK/NwebCOn1gW6yUnJec14ryy2xEL2c0JBEFHEdvXn0lHJa5KwKucuiIwY6iocHMoJ5Z4elQuOgruv82MnWeV5X6TNPzYLsiupl6eKsN/BgMer3y46+jazHYv7IwwKRfwkqT8EoeaMQkQq NoDisclaimer: True X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6060326)(6040281)(601004)(2401047)(8121501046)(13023025)(13013025)(13020025)(5005006)(13024025)(10201501046)(3002001)(6055026)(6041223)(6061324);SRVR:DB5PR08MB1223;BCL:0;PCL:0;RULEID:;SRVR:DB5PR08MB1223; X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB1223;4:BkcEOqbhQxZvstpRNb7hnwrWGVaUZlSJfA8Suz6au+rgFhCVq68adGM75UJNHxsNKeeqIS4oAmnONJuVIbo6eeeUVjvSXgpwCiNhyD+srojZjAhGdz92Eqbm0vNbELYF4x3j8EYpA95Og/+r8CQkVv2scialeiTmUcUo3992hvOxDnaGDNfR4o09uF737M17H0jCNvYUoOUjpmQjL+sB87x7D/FO0YOYnivJcMYCrgTuUs8Sn5nWZlhXupwdh7XTfV3wqOilbyvd6S4NUTEg69liHBNWRZDh9qJnrg3NO8VVftHMJehUv1VraZXw4upSSjYOEkyAr3Jd6Lq/DspemnolfGtrS5UGqe4DXjytm5buLCxm2ntuPL7HV1jIrgTChwlGWd0vVK6dcfddYsWmlnHut/5tswYQXTOSmz+eW77PAXf8xF0iY3dyXCnGBAedsKZjZDlgAykPKlczL2jmw7brlfHxcWdPDXdCx/K85oJdYUu+WTyZYXZCmGw8F3uFPyw6vSo1EG6jweAfLoSX09qChhfrcWiBof4SXwkQ51LTKnfHQ7QiI4gQQpsrSWMEmnOxDzRpQQk30ZNchtyoWg== X-Forefront-PRVS: 01294F875B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB5PR08MB1223;23:qyL+9GuhUHYYVBwXGeeDgjTX2/W4vx3bxnfGan5pn?= =?us-ascii?Q?SEKJpQKyddFPaERCmt3sw1p5vPl78jllr3rQDxq+4OgDHJZukDjokI0vPJ23?= =?us-ascii?Q?WTB2eiXKmV3IYcyaroyyBTcN0zwKlM2oqcXnRO9lqZ8a/eMPzLu7BfqxWFNV?= =?us-ascii?Q?N5WTedofxBY8yty5tO56VtNw1TwWk5Vph+JdwazAgP7v07CxyAhmSsyWR8Qo?= =?us-ascii?Q?1fm3BK4XjDmMNqyAxbj3smJAF5yXjCI+8IG37HzCbfFcC3pWxbOQsrXxHUUa?= =?us-ascii?Q?JJGqyago7eXsoe/MsTopzI5t7LXL6QytqGb+UKnJqfKd1203RXYO60BRVyB2?= =?us-ascii?Q?wNsJi7rakNZlyQnJAM6ZYu1IGfPw0tig4WYehR9JdPDIB1UnZOblBFb5fyMP?= =?us-ascii?Q?9ckc56Wap+3fqxfDkUoR26ciUfbtmPyP5tYTw7z+WHK/nKAPGA7ue5n5/eQT?= =?us-ascii?Q?AqdXjCbG3G79nx1uI7E5CpLWO9SL3+GQeWEKosQyFkwiV0KsfaHI3b/VZFlk?= =?us-ascii?Q?yd/qBmefTCQpQxwncvqFVdyxT8HtaXNVpYWIVGV0RL4x5dj/2+i+TRpQuUSF?= =?us-ascii?Q?3eBsxKK/dSrnkU6GUmqEzahTtGZ0fG9q1YO8Y25pTUQQqVUtY9wpCicF/gk2?= =?us-ascii?Q?DF3LtT+m+OHfYzFZ9uCzcOgBcQWA9FjC0pnyLkil1x2mLu3QFITZ2OCjsqxG?= =?us-ascii?Q?VGKekkuxE8MTcrWF8t5bU7jSJdFcbNZikaSzveBzSQGzYMazW48bLR9OtMcv?= =?us-ascii?Q?89IfQHPYoc22uc/ix/uDjzOlX458EGCI+DN7ux2m8iBuHp9LTxsce8UcJEh6?= =?us-ascii?Q?rA5GpT+cRA8D/LaI2gXbD9dThjAPqv73ImTgzcjDxU61qoXNumakbVwF1o82?= =?us-ascii?Q?rgB85+eng58Qp7CUFxhboNCYLz6AhlA9ZU2kkwmUhsmOoHYcbWoZL5NeBUbE?= =?us-ascii?Q?jw+sBWR8wnG676w9Nm7eNXE0Y9vkd05bIth+TnDJFi9WB6YP1aqC0Q85aNhu?= =?us-ascii?Q?3ZjEgWVdw5VqhNeDD5A8+0zzRd9JOxK1iMAnPkUzVa8OQ5fNuP5BQg3S2f9i?= =?us-ascii?Q?IjAxC+mbZFyCcmlwpRKuDgjOOC3Puib5uEVNcmkdbB9YnN/xPhOKChqpfues?= =?us-ascii?Q?2gTs9Qtvhfk0EYScnd0RGWHWrn3cJlazl/b9jBPXeh05XTshmX2BQi2v48Zk?= =?us-ascii?Q?FxsBaPtzuYWhc7pUFjak7c1zr4f2Co9m7iN?= X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB1223;6:Vthln1lfjtwxqgHJK3k/suZRYF3gZZ9/LbbtTgm7r5O26L/TYs2rKnJrMCWUyw4AvmZvr4E22Wf9JTaNeh6z8sw5P52tQevJJEUSzOPYvsd8NbdUelInLbsZ7M4/idgImZ2CBNKH0DqyWaTsVhlvQriHFVkE3HfMFmRDmw44Li+l0O0M1fSe6vS4hPG15/u5DmZCHfY8t2kW1PIhUM4RcEm0ZmAFc4IaWkqjlw7WR2irYh4w70gHdKHxEFNQ9PbhVHbUdy7HBc/RccVNXc0OyLzRGHdGq1UYgJrAe9qLNInQ7aFOaGi9bmIM+9S9kmgaxjLgVZfS977GwRyPW7p2r74LQl8sz9WK7P8V9y4/gBkbBd06gPyJpUKi9sW2OsBH;5:s/oD8u0Mg1c59VHoYORsNIvwPpmNoveYvzkctoZYsQR/o9yQmSzLy3YlxTXgunxydo74iJnulGi1l9dUjlCztr/GVD1YTFlluXQoUemPaGCuwpi/LNhyqUBSKeU0NgpM97BSATqfic8fUI3IcxJiFA==;24:bvYAVTlpaGXy+IDqhyqWXDqf2Oi1+mSvC6/2NqmraTc109SckVY7qGN678p1RIT4V3utrRHYZyQjxCXi791NscB3VPoqS2fs29Cf0FQmSQE= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB5PR08MB1223;7:KCKrl6uX1egVgUF9AR4N1rfrUikNsLP+e8ANIfUe0dLpRLi8wb+kaXfQcKsW4YZCtMCgXM3kMohXtQzBF7n/FKQamoQkH8ZExXWBpgF1F0p8TlR0UK2HcBiFBQ/SKdOqHobw//rPHknyXR3/DtprGrQNkkff8kqU0zaofReZ0zWsco1aH2+nlL2ejiNprTzLB513BPNrL9JRohJQT93FGQj4OmR73G5Qhq3ynXWUBuvdZfs0DYwFDoYO6FJ3aIFk9oinXwEH/W5O63NRCpjOkmijm3ZCkjhIk9UVqG/VhRLc1l9330TzYSu4ql73gjrB1OZ4ShPdFdzlAqNP51GjnHKuuumGJe1JCLkcJCgWhPI= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Nov 2016 16:26:16.8397 (UTC) X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[217.140.96.140];Helo=[nebula.arm.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR08MB1223 X-IsSubscribed: yes X-SW-Source: 2016-11/txt/msg01826.txt.bz2 On Thu, Oct 27, 2016 at 08:44:02PM +0000, Michael Collison wrote: > This patch is designed to improve code generation for "and" instructions with > certain immediate operands. > > For the following test case: > > int f2(int x) > { > x &= 0x0ffffff8; > > x &= 0xff001fff; > > return x; > } > > the trunk aarch64 compiler generates: > > mov w1, 8184 > movk w1, 0xf00, lsl 16 > and w0, w0, w1 > > We can generate one fewer instruction if we recognize certain constants. With > the attached patch the current trunk compiler generates: > > and w0, w0, 268435448 > and w0, w0, -16769025 > > Bootstrapped and make check successfully completed with no regressions on > aarch64-linux-gnu. > > Okay for trunk? Hi Michael, I have some minor comments in line. > diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h > index 3cdd69b..7ef8cdf 100644 > --- a/gcc/config/aarch64/aarch64-protos.h > +++ b/gcc/config/aarch64/aarch64-protos.h > @@ -300,6 +300,9 @@ extern struct tune_params aarch64_tune_params; > HOST_WIDE_INT aarch64_initial_elimination_offset (unsigned, unsigned); > int aarch64_get_condition_code (rtx); > bool aarch64_bitmask_imm (HOST_WIDE_INT val, machine_mode); > +unsigned HOST_WIDE_INT aarch64_and_split_imm1 (HOST_WIDE_INT val_in); > +unsigned HOST_WIDE_INT aarch64_and_split_imm2 (HOST_WIDE_INT val_in); > +bool aarch64_and_bitmask_imm (unsigned HOST_WIDE_INT val_in, machine_mode mode); > int aarch64_branch_cost (bool, bool); > enum aarch64_symbol_type aarch64_classify_symbolic_expression (rtx); > bool aarch64_const_vec_all_same_int_p (rtx, HOST_WIDE_INT); > diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c > index 3e663eb..db82c5c 100644 > --- a/gcc/config/aarch64/aarch64.c > +++ b/gcc/config/aarch64/aarch64.c > @@ -3600,6 +3600,46 @@ aarch64_bitmask_imm (HOST_WIDE_INT val_in, machine_mode mode) > return val == mask * bitmask_imm_mul[__builtin_clz (bits) - 26]; > } > > +/* Create mask of ones, covering the lowest to highest bits set in VAL_IN. */ > + > +unsigned HOST_WIDE_INT > +aarch64_and_split_imm1 (HOST_WIDE_INT val_in) > +{ > + int first_bit_set = ctz_hwi (val_in); > + int last_bit_set = floor_log2 (val_in); > + gcc_assert (first_bit_set < last_bit_set); This assert can never trigger (by definition) unless VAL_IN == 0 (in which case floor_log2 = -1, ctz_hwi = HOST_BITS_PER_WORD_SIZE). If that's the case you're testing for, then this assert would be more explicit as gcc_assert (val_in != 0) I'd suggest renaming these to lowest_bit_set and highest_bit_set, as first and last are ambiguous (you have them the opposite way round from what I'd consider first [highest, thus leading bits] and last [lowest/trailing bits]). > + > + return ((HOST_WIDE_INT_UC (2) << last_bit_set) - > + (HOST_WIDE_INT_1U << first_bit_set)); > +} > + > +/* Create constant with zero bits between first and last bit set and one > + bits elsewhere. */ I can't parse this comment in relation to what the code below does. Looking at the code, you're building a new constant where the bits between the first and last bits are unmodified, and all other bits are set to one. i.e. for 0000 1010 1000 you'd generate 1111 1010 1111. > +unsigned HOST_WIDE_INT > +aarch64_and_split_imm2 (HOST_WIDE_INT val_in) > +{ > + return val_in | ~aarch64_and_split_imm1 (val_in); > +} > + > +/* Return true if VAL_IN is a valid 'and' bitmask immediate. */ > + > +bool > +aarch64_and_bitmask_imm (unsigned HOST_WIDE_INT val_in, machine_mode mode) > +{ > + if (aarch64_bitmask_imm (val_in, mode)) > + return false; > + > + if (aarch64_move_imm (val_in, mode)) > + return false; > + > + unsigned HOST_WIDE_INT imm2 = aarch64_and_split_imm2 (val_in); > + > + if (!aarch64_bitmask_imm (imm2, mode)) > + return false; > + > + return true; You can replace these four lines with: return aarch64_bitmask_imm (imm2, mode); > +} > > /* Return true if val is an immediate that can be loaded into a > register in a single instruction. */ > diff --git a/gcc/testsuite/gcc.target/aarch64/and_const.c b/gcc/testsuite/gcc.target/aarch64/and_const.c > new file mode 100644 > index 0000000..9c377d7 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/and_const.c > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2" } */ > + > +int f2 (int x) > +{ > + x &= 0x0ffffff8; > + > + x &= 0xff001fff; > + > + return x; > +} It would be good to have a test for the DImode cases too (using long long). Thanks, James