From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 110052 invoked by alias); 14 Sep 2015 08:59:55 -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 110031 invoked by uid 89); 14 Sep 2015 08:59:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.1 required=5.0 tests=AWL,BAYES_00,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Mon, 14 Sep 2015 08:59:54 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id ACDF5AAC8; Mon, 14 Sep 2015 08:59:50 +0000 (UTC) Date: Mon, 14 Sep 2015 09:00:00 -0000 From: Richard Biener To: Eric Botcazou cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH][20/n] Remove GENERIC stmt combining from SCCVN In-Reply-To: Message-ID: References: <8641521.JK1D07Utdj@polaris> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2015-09/txt/msg00909.txt.bz2 On Mon, 14 Sep 2015, Richard Biener wrote: > On Sat, 12 Sep 2015, Eric Botcazou wrote: > > > > * fold-const.c (fold_binary_loc): Move simplifying of comparisons > > > against the highest or lowest possible integer ... > > > * match.pd: ... as patterns here. > > > > This incorrectly dropped the calls to omit_one_operand_loc, resulting in the > > failure of the attached Ada test: if the operand has side effects, you cannot > > replace the entire comparison with just 'true' or 'false'. > > Still trying to reproduce, but I suppose you hit > > /* Comparisons with the highest or lowest possible integer of > the specified precision will have known values. */ > (simplify > (cmp (convert?@2 @0) INTEGER_CST@1) > (if ((INTEGRAL_TYPE_P (TREE_TYPE (@1)) || POINTER_TYPE_P (TREE_TYPE > (@1))) > && tree_nop_conversion_p (TREE_TYPE (@2), TREE_TYPE (@0))) > (with > { > tree arg1_type = TREE_TYPE (@1); > unsigned int prec = TYPE_PRECISION (arg1_type); > wide_int max = wi::max_value (arg1_type); > wide_int signed_max = wi::max_value (prec, SIGNED); > wide_int min = wi::min_value (arg1_type); > } > (switch > (if (wi::eq_p (@1, max)) > (switch > (if (cmp == GT_EXPR) > { constant_boolean_node (false, type); }) > (if (cmp == GE_EXPR) > (eq @2 @1)) > (if (cmp == LE_EXPR) > { constant_boolean_node (true, type); }) > > this which should handle side-effects in @0 just fine: > > /* #line 2019 "/space/rguenther/src/svn/trunk/gcc/match.pd" */ > if (cmp == LE_EXPR) > { > if (dump_file && (dump_flags & TDF_DETAILS)) > fprintf (dump_file, "Applying pattern match.pd:2020, %s:%d\n", __FILE__, > __LINE__); > tree res; > res = constant_boolean_node (true, type); > if (TREE_SIDE_EFFECTS (captures[0])) > res = build2_loc (loc, COMPOUND_EXPR, type, > fold_ignored_result (captures[0]), res); > return res; > > note that genmatch "inlines" omit_one_operand, so you only see > fold_ignored_result here. > > So maybe the issue is with some other pattern or was latent > elsewehere. I'll have a closer look once I manage to reproduce > the issue. Ok, so it's folding x == 127 ? .gnat_rcheck_CE_Overflow_Check ("overflow_sum3.adb", 14);, 0 : (short_short_integer) x + 1 <= 127 where op0 (the COND_EXPR) does not have TREE_SIDE_EFFECTS set but its operand 1 has: (gdb) p debug_tree (op0) unit size align 8 symtab 0 alias set -1 canonical type 0x7ffff6572dc8 precision 8 min max context RM size chain > arg 0 side-effects ... arg 2 ... that's unexpected to the code generated by genmatch and I don't see how omit_one_operand would handle that either. The COND_EXPR is originally built with TREE_SIDE_EFFECTS set but: Hardware watchpoint 7: *$43 Old value = 65595 New value = 59 emit_check (gnu_cond=, gnu_expr=, reason=10, gnat_node=2320) at /space/rguenther/src/svn/trunk/gcc/ada/gcc-interface/trans.c:8823 8823 return gnu_result; $45 = 0 so the Ada frontend resets the flag (improperly?): emit_check (gnu_cond=, gnu_expr=, reason=10, gnat_node=2320) at /space/rguenther/src/svn/trunk/gcc/ada/gcc-interface/trans.c:8823 8823 return gnu_result; $45 = 0 (gdb) l 8818 8819 /* GNU_RESULT has side effects if and only if GNU_EXPR has: 8820 we don't need to evaluate it just for the check. */ 8821 TREE_SIDE_EFFECTS (gnu_result) = TREE_SIDE_EFFECTS (gnu_expr); 8822 8823 return gnu_result; 8824 } Richard.