From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073039.outbound.protection.outlook.com [40.92.73.39]) by sourceware.org (Postfix) with ESMTPS id 7DFE53858025 for ; Wed, 26 May 2021 17:07:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7DFE53858025 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=hotmail.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=bernd.edlinger@hotmail.de ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dpme8sWzK6SeoJS332oWusYTCq++8MqY0w+0sMUAlND1EA5cbmTV6Lly3meUh1brLbDM4Xc0TqPvEBHy99Kh51tT0jEYwt4hVK2AiHGc5CiwTxfqtviHHfAzSk8l3Jb2eNhkJlgXFvTcGz3fMzlNnWTQ6nJBidd6RXWzSGwSveQLgwfEV4t0/oVvbRv0YrI+XUoYllb8SFAa4IJWYKdrvRijRtlf3UaRJdcdz7zkNwUDeN8xG2IdLt5bXe3y+RAmFfEKkOFYMqVE0IjpejSkL9i0hUmdpHDyvpOkOXLZjU8Xn37NF7JZO+a2MqZbSaV5nLnAB/y3zZwkyrOkJ5XhTQ== 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-SenderADCheck; bh=XEpC6blwMAO7DY0NfgB66DJrqjmFYzxIo3OBz1AngQU=; b=L3UpQX6ocgJMB7LgYLCxUYYvYXvL4hFPn+T7ms9H/RRIqBUbud2PHCykus+leiWmVR0O8xXH5Bcn8W9hM1p5dGTWwBNYn/7fPvG4HomL2wLDpr1MDyMvY5v+1FBpJPxvHREaapbRbZUERkv++0S6TiDrcuNw/5Bay16/0sUDU1DrZHR5PZH67jMPS9v4KYZYS2qJ+4Vl58iN3Lk+Kr20T8Ba9wZKdqKmziop0pbnSAJktxbmR/UzS3k8QSYcbfmPhRa4qs5Dh0ZONpMFkMQFLO6EZ0fQyxZZufAEcMHxrGEY+SHsVkDWHgsfD8/k9lxVyKgvzPDhPDmI9AHaLo/FLw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none Received: from VI1EUR04FT033.eop-eur04.prod.protection.outlook.com (2a01:111:e400:7e0e::4c) by VI1EUR04HT009.eop-eur04.prod.protection.outlook.com (2a01:111:e400:7e0e::142) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.25; Wed, 26 May 2021 17:07:34 +0000 Received: from AM8PR10MB4708.EURPRD10.PROD.OUTLOOK.COM (2a01:111:e400:7e0e::53) by VI1EUR04FT033.mail.protection.outlook.com (2a01:111:e400:7e0e::386) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4129.25 via Frontend Transport; Wed, 26 May 2021 17:07:34 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:7574B72BEF2348CD1B25DFE6877E1891B0905F199B8930FE93DC8ED5389683FE; UpperCasedChecksum:EFCBC3B6B468A00E2430781F47FF39CCA2CD683E413D46512F96294DC53A19FD; SizeAsReceived:9426; Count:48 Received: from AM8PR10MB4708.EURPRD10.PROD.OUTLOOK.COM ([fe80::ad12:6a2c:b949:f65d]) by AM8PR10MB4708.EURPRD10.PROD.OUTLOOK.COM ([fe80::ad12:6a2c:b949:f65d%5]) with mapi id 15.20.4173.020; Wed, 26 May 2021 17:07:34 +0000 Subject: Re: [PATCHv2] Add a couple of A?CST1:CST2 match and simplify optimizations From: Bernd Edlinger To: Richard Biener , Andrew Pinski Cc: Andrew MacLeod , Andrew Pinski , GCC Patches References: <1621762863-26665-1-git-send-email-apinski@marvell.com> Message-ID: Date: Wed, 26 May 2021 19:07:32 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-TMN: [kBfqeZ6v+KnPjfzXIaAlz1eG2l87/c/R] X-ClientProxiedBy: FR0P281CA0006.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:15::11) To AM8PR10MB4708.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:364::23) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.1.101] (84.57.61.94) by FR0P281CA0006.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:15::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.9 via Frontend Transport; Wed, 26 May 2021 17:07:33 +0000 X-MS-PublicTrafficType: Email X-IncomingHeaderCount: 48 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-Correlation-Id: d03adf9f-5993-47cc-c123-08d92068c12b X-MS-TrafficTypeDiagnostic: VI1EUR04HT009: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: mO827feaa8VfU/csyvrkH+7rWWbco83N97jR+eRUdcESWNlfRqkxMb5P5pv+I4nWwDQfiWL2cRBnGFIzxg66/r1hF7ZJjLV+gXOTgDamdZp3I78YUTADYYv4uuGny97/CCJDQxI8MN+zeQACn1uMqDqboQ3IFNrpSfDFh5jF0vDt599EjE91Ysovi79jwOSMTC+CWNwD45GGxLGn0u1m4foxpxcuSAhXUVygYjB/X5xTQ0j9RheWIOmThrSyuFlVYPKRu+HdR/NW93GZC0tFidCkT7TFFRmnvtP0e37s/vZMs7JuQf+ZAlNKLwpU0Imp13QU/vEgcngSqt8CPGCkTzNeBcWpM19GjuWC9lOGttOBhO5EyN/nNrCgWo4OWUBKby5++TptjJE1B75SD7zX7ll2DI9LEFuvL0LQLqNy1VjY/eOnLT3h9PxskHlMjfBVfdbA6bsUTJ4QPGDHEtKYAA== X-MS-Exchange-AntiSpam-MessageData: 9goGau5LMT+DLsQ0I+vr8NRHQoIt6CfGTagCnivP1ZbFzV2ME7fy/+KCNOHnPFCObPWGcA1yzYvO1XNkHrkLRwULn23u+cGjnRi7Kx03GB6SOGWtzgSBfnBzHO/xqjhjrJbN5S4i1wPqb129Lurd9A== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d03adf9f-5993-47cc-c123-08d92068c12b X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2021 17:07:34.1921 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-AuthSource: VI1EUR04FT033.eop-eur04.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: Internet X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1EUR04HT009 X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00, FORGED_MUA_MOZILLA, FREEMAIL_FROM, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, MSGID_FROM_MTA_HEADER, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 May 2021 17:07:39 -0000 On 5/26/21 7:03 PM, Bernd Edlinger wrote: > On 5/26/21 2:05 PM, Richard Biener wrote: >> On Wed, May 26, 2021 at 1:37 PM Andrew Pinski wrote: >>> >>> On Wed, May 26, 2021 at 4:28 AM Richard Biener >>> wrote: >>>> >>>> On Wed, May 26, 2021 at 1:07 PM Andrew Pinski wrote: >>>>> >>>>> On Wed, May 26, 2021 at 2:01 AM Andrew Pinski wrote: >>>>>> >>>>>> On Wed, May 26, 2021 at 1:43 AM Bernd Edlinger >>>>>> wrote: >>>>>>> >>>>>>> On 5/25/21 4:22 PM, Richard Biener via Gcc-patches wrote: >>>>>>>> On Sun, May 23, 2021 at 12:03 PM apinski--- via Gcc-patches >>>>>>>> wrote: >>>>>>>>> >>>>>>>>> From: Andrew Pinski >>>>>>>>> >>>>>>>>> Instead of some of the more manual optimizations inside phi-opt, >>>>>>>>> it would be good idea to do a lot of the heavy lifting inside match >>>>>>>>> and simplify instead. In the process, this moves the three simple >>>>>>>>> A?CST1:CST2 (where CST1 or CST2 is zero) simplifications. >>>>>>>>> >>>>>>>>> OK? Boostrapped and tested on x86_64-linux-gnu with no regressions. >>>>>>>>> >>>>>>>>> Differences from V1: >>>>>>>>> * Use bit_xor 1 instead of bit_not to fix the problem with boolean types >>>>>>>>> which are not 1 bit precision. >>>>>>>> >>>>>>>> OK. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Richard. >>>>>>>> >>>>>>> >>>>>>> Hmm, sorry, no luck. >>>>>>> >>>>>>> I think this caused: >>>>>> >>>>>> If anything it is a bad interaction with changes between r12-1046 and >>>>>> r12-1053; I am suspecting a bug in those changes rather than my >>>>>> changes causing the bug. Debugging it right now. >>>>> >>>>> (gdb) p debug_tree(name) >>>>> >>>> type >>>> size >>>>> unit-size >>>>> align:8 warn_if_not_align:0 symtab:0 alias-set -1 >>>>> canonical-type 0x7ffff6b45b28 precision:1 min >>>> 0x7ffff6b4a030 0> max > >>>>> >>>>> def_stmt _19 = ~_8; >>>>> version:19> >>>>> >>>>> So what is happening is evrp converted: >>>>> ct_12 = ct_5 + -1; >>>>> Into >>>>> ct_12 = ct_5 == 1 ? 0 : 1; >>>>> (this was done before my patch) >>>> >>>> Note this COND_EXPR is supposed to be combined >>>> with its single use in a GIMPLE_COND ... >>> >>> I Noticed it was not doing it (before my patch) inside evrp either. >> >> I think it is at most done in forwprop, but even then it likely >> lacks a fold pattern - we only seem to forward comparisons >> into GIMPLE_CONDs explicitely, leaving the rest to >> match.pd patterns. >> > > How about this for a quick fix: > > commit b71621f51bc2819bb7d202efabc17fec5cc92f8f > Author: Bernd Edlinger > Date: Wed May 26 18:45:09 2021 +0200 > > Fix gcc-bootstrap issue > > ... or at least try to. > > 2021-05-26 Bernd Edlinger > > * gimple-range-gori.cc (range_def_chain::register_dependency): > Resize m_def_chain when needed. > > diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc > index a4c4bf5..722bf5d 100644 > --- a/gcc/gimple-range-gori.cc > +++ b/gcc/gimple-range-gori.cc > @@ -177,6 +177,8 @@ range_def_chain::register_dependency (tree name, tree dep, basic_block bb) > > unsigned v = SSA_NAME_VERSION (name); > struct rdc &src = m_def_chain[v]; > + if (v >= m_def_chain.length ()) > + m_def_chain.safe_grow_cleared (num_ssa_names + 1);> gimple *def_stmt = SSA_NAME_DEF_STMT (dep); > unsigned dep_v = SSA_NAME_VERSION (dep); > bitmap b; > > > Should I push this? > Or has anyone a better idea? > Aehm, I meant of course: --- a/gcc/gimple-range-gori.cc +++ b/gcc/gimple-range-gori.cc @@ -176,6 +176,8 @@ range_def_chain::register_dependency (tree name, tree dep, b return; unsigned v = SSA_NAME_VERSION (name); + if (v >= m_def_chain.length ()) + m_def_chain.safe_grow_cleared (num_ssa_names + 1); struct rdc &src = m_def_chain[v]; gimple *def_stmt = SSA_NAME_DEF_STMT (dep); unsigned dep_v = SSA_NAME_VERSION (dep); > > Thanks > Bernd. > >>>> >>>>> And then it gets simplified to: >>>>> _8 = ct_5 == 1; >>>>> _19 = ~_8; >>>>> ct_12 = (int) _19; >>>>> (after my match.pd patch) >>>> >>>> which this one then breaks. I suppose instead of replacing >>>> ct_12 adjusting the GIMPLE_COND directly might be >>>> a better approach ... or not folding the generated COND_EXPR. >>> >>> I was going to try to see where COND_EXPR is created but it is late >>> and there seems to be other issues going on too. >>> For example, the above really should have been converted to: >>> _19 = ct_5 != 1; >>> ct_12 = (int) _19; >>> >>> This might be a gimple-match issue where the conditional part is >>> always emitted without being simplified with the ~ part; COND_EXPR has >>> those kind of issues :). >> >> No, we always re-simplify things, but there might be no >> (bit_not (eq @0 integer_onep)) simplifier. >> >> Oddly enough >> >> _Bool foo (int x) >> { >> _Bool tem = x == 1; >> return ~tem; >> } >> >> is simplified to return 1 via matching >> >> /* Fold ~X op C as X op' ~C, where op' is the swapped comparison. */ >> (for cmp (simple_comparison) >> scmp (swapped_simple_comparison) >> (simplify >> (cmp (bit_not@2 @0) CONSTANT_CLASS_P@1) >> (if (single_use (@2) >> && (TREE_CODE (@1) == INTEGER_CST || TREE_CODE (@1) == VECTOR_CST)) >> (scmp @0 (bit_not @1))))) >> >> Richard. >> >>> Thanks, >>> Andrew Pinski >>> >>> >>>> >>>>> Which is correct, but the range code is not expecting new SSA names to >>>>> be added ..... >>>>> It looks like the issue was introduced with r12-1048 (Add imports and >>>>> strengthen the export definition in range_def and gori_map). >>>>> I suspect there are other match.pd patterns which would also hit this >>>>> issue where a new ssa name is introduced. >>>>> >>>>> I have no idea how to get this fixed because gimple-range-* is new to >>>>> me; I tried looking into it but calling has_def_chain/get_def_chain >>>>> inside register_dependency seems wrong, maybe Andrew MacLeod can help >>>>> here. >>>>> This happens even with a stage 1 gcc so it is not miscompiling. >>>>> >>>>> Also sorry for the breakage, I was not expecting it this time around >>>>> as I ran bootstrap like three times and I did not expect an >>>>> interaction with other parts of the compiler like this. >>>>> >>>>> Thanks, >>>>> Andrew Pinski >>>>> >>>>> >>>>>> >>>>>> Thanks, >>>>>> Andrew >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>> >>>>>>> home/ed/gnu/gcc-build/./gcc/xgcc -B/home/ed/gnu/gcc-build/./gcc/ -B/home/ed/gnu/install/x86_64-pc-linux-gnu/bin/ -B/home/ed/gnu/install/x86_64-pc-linux-gnu/lib/ -isystem /home/ed/gnu/install/x86_64-pc-linux-gnu/include -isystem /home/ed/gnu/install/x86_64-pc-linux-gnu/sys-include -fchecking=1 -c -g -O2 -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wmissing-format-attribute -Wno-overlength-strings -pedantic -Wno-long-long -DHAVE_CONFIG_H -I. -I../../gcc-trunk/fixincludes -I../include -I../../gcc-trunk/fixincludes/../include ../../gcc-trunk/fixincludes/fixtests.c >>>>>>> during GIMPLE pass: evrp >>>>>>> ../../gcc-trunk/fixincludes/fixtests.c: In function ‘run_test’: >>>>>>> ../../gcc-trunk/fixincludes/fixtests.c:155:1: internal compiler error: in operator[], at vec.h:890 >>>>>>> 155 | } >>>>>>> | ^ >>>>>>> 0x824622 vec::operator[](unsigned int) >>>>>>> ../../gcc-trunk/gcc/vec.h:890 >>>>>>> 0x8247f0 vec::operator[](unsigned int) >>>>>>> ../../gcc-trunk/gcc/tree.h:3366 >>>>>>> 0x8247f0 vec::operator[](unsigned int) >>>>>>> ../../gcc-trunk/gcc/vec.h:1461 >>>>>>> 0x8247f0 range_def_chain::register_dependency(tree_node*, tree_node*, basic_block_def*) >>>>>>> ../../gcc-trunk/gcc/gimple-range-gori.cc:179 >>>>>>> 0x18639bc fold_using_range::range_of_range_op(irange&, gimple*, fur_source&) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:439 >>>>>>> 0x1866c85 fold_using_range::fold_stmt(irange&, gimple*, fur_source&, tree_node*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:376 >>>>>>> 0x1866fa2 gimple_ranger::fold_range_internal(irange&, gimple*, tree_node*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:1067 >>>>>>> 0x1866fa2 gimple_ranger::range_of_stmt(irange&, gimple*, tree_node*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:1097 >>>>>>> 0x186308a gimple_ranger::range_of_expr(irange&, tree_node*, gimple*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:980 >>>>>>> 0x18637c7 fold_using_range::range_of_range_op(irange&, gimple*, fur_source&) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:431 >>>>>>> 0x1866c85 fold_using_range::fold_stmt(irange&, gimple*, fur_source&, tree_node*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:376 >>>>>>> 0x1866fa2 gimple_ranger::fold_range_internal(irange&, gimple*, tree_node*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:1067 >>>>>>> 0x1866fa2 gimple_ranger::range_of_stmt(irange&, gimple*, tree_node*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:1097 >>>>>>> 0x186308a gimple_ranger::range_of_expr(irange&, tree_node*, gimple*) >>>>>>> ../../gcc-trunk/gcc/gimple-range.cc:980 >>>>>>> 0x1149961 range_query::value_of_expr(tree_node*, gimple*) >>>>>>> ../../gcc-trunk/gcc/value-query.cc:86 >>>>>>> 0x1871e51 hybrid_folder::value_of_expr(tree_node*, gimple*) >>>>>>> ../../gcc-trunk/gcc/gimple-ssa-evrp.c:235 >>>>>>> 0xff9573 substitute_and_fold_engine::replace_uses_in(gimple*) >>>>>>> ../../gcc-trunk/gcc/tree-ssa-propagate.c:575 >>>>>>> 0xff988c substitute_and_fold_dom_walker::before_dom_children(basic_block_def*) >>>>>>> ../../gcc-trunk/gcc/tree-ssa-propagate.c:845 >>>>>>> 0x183921f dom_walker::walk(basic_block_def*) >>>>>>> ../../gcc-trunk/gcc/domwalk.c:309 >>>>>>> 0xff8d15 substitute_and_fold_engine::substitute_and_fold(basic_block_def*) >>>>>>> ../../gcc-trunk/gcc/tree-ssa-propagate.c:987 >>>>>>> Please submit a full bug report, >>>>>>> with preprocessed source if appropriate. >>>>>>> Please include the complete backtrace with any bug report. >>>>>>> See for instructions. >>>>>>> make[2]: *** [Makefile:76: fixtests.o] Error 1 >>>>>>> make[2]: Leaving directory '/home/ed/gnu/gcc-build/fixincludes' >>>>>>> make[1]: *** [Makefile:3827: all-fixincludes] Error 2 >>>>>>> make[1]: Leaving directory '/home/ed/gnu/gcc-build' >>>>>>> make: *** [Makefile:1011: all] Error 2 >>>>>>> >>>>>>> >>>>>>> Bernd. >>>>>>> >>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Andrew Pinski >>>>>>>>> >>>>>>>>> gcc: >>>>>>>>> * match.pd (A?CST1:CST2): Add simplifcations for A?0:+-1, A?+-1:0, >>>>>>>>> A?POW2:0 and A?0:POW2. >>>>>>>>> --- >>>>>>>>> gcc/match.pd | 41 +++++++++++++++++++++++++++++++++++++++++ >>>>>>>>> 1 file changed, 41 insertions(+) >>>>>>>>> >>>>>>>>> diff --git a/gcc/match.pd b/gcc/match.pd >>>>>>>>> index 1fc6b7b1557..ad6b057c56d 100644 >>>>>>>>> --- a/gcc/match.pd >>>>>>>>> +++ b/gcc/match.pd >>>>>>>>> @@ -3711,6 +3711,47 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) >>>>>>>>> (if (integer_all_onesp (@1) && integer_zerop (@2)) >>>>>>>>> @0)))) >>>>>>>>> >>>>>>>>> +/* A few simplifications of "a ? CST1 : CST2". */ >>>>>>>>> +/* NOTE: Only do this on gimple as the if-chain-to-switch >>>>>>>>> + optimization depends on the gimple to have if statements in it. */ >>>>>>>>> +#if GIMPLE >>>>>>>>> +(simplify >>>>>>>>> + (cond @0 INTEGER_CST@1 INTEGER_CST@2) >>>>>>>>> + (switch >>>>>>>>> + (if (integer_zerop (@2)) >>>>>>>>> + (switch >>>>>>>>> + /* a ? 1 : 0 -> a if 0 and 1 are integral types. */ >>>>>>>>> + (if (integer_onep (@1)) >>>>>>>>> + (convert (convert:boolean_type_node @0))) >>>>>>>>> + /* a ? -1 : 0 -> -a. */ >>>>>>>>> + (if (integer_all_onesp (@1)) >>>>>>>>> + (negate (convert (convert:boolean_type_node @0)))) >>>>>>>>> + /* a ? powerof2cst : 0 -> a << (log2(powerof2cst)) */ >>>>>>>>> + (if (!POINTER_TYPE_P (type) && integer_pow2p (@1)) >>>>>>>>> + (with { >>>>>>>>> + tree shift = build_int_cst (integer_type_node, tree_log2 (@1)); >>>>>>>>> + } >>>>>>>>> + (lshift (convert (convert:boolean_type_node @0)) { shift; }))))) >>>>>>>>> + (if (integer_zerop (@1)) >>>>>>>>> + (with { >>>>>>>>> + tree booltrue = constant_boolean_node (true, boolean_type_node); >>>>>>>>> + } >>>>>>>>> + (switch >>>>>>>>> + /* a ? 0 : 1 -> !a. */ >>>>>>>>> + (if (integer_onep (@2)) >>>>>>>>> + (convert (bit_xor (convert:boolean_type_node @0) { booltrue; } ))) >>>>>>>>> + /* a ? -1 : 0 -> -(!a). */ >>>>>>>>> + (if (integer_all_onesp (@2)) >>>>>>>>> + (negate (convert (bit_xor (convert:boolean_type_node @0) { booltrue; } )))) >>>>>>>>> + /* a ? powerof2cst : 0 -> (!a) << (log2(powerof2cst)) */ >>>>>>>>> + (if (!POINTER_TYPE_P (type) && integer_pow2p (@2)) >>>>>>>>> + (with { >>>>>>>>> + tree shift = build_int_cst (integer_type_node, tree_log2 (@2)); >>>>>>>>> + } >>>>>>>>> + (lshift (convert (bit_xor (convert:boolean_type_node @0) { booltrue; } )) >>>>>>>>> + { shift; })))))))) >>>>>>>>> +#endif >>>>>>>>> + >>>>>>>>> /* Simplification moved from fold_cond_expr_with_comparison. It may also >>>>>>>>> be extended. */ >>>>>>>>> /* This pattern implements two kinds simplification: >>>>>>>>> -- >>>>>>>>> 2.17.1 >>>>>>>>> >>>>>>>>