From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6984 invoked by alias); 18 Dec 2012 13:04:53 -0000 Received: (qmail 6976 invoked by uid 22791); 18 Dec 2012 13:04:53 -0000 X-SWARE-Spam-Status: No, hits=-6.1 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_HI,TW_LX,TW_TM,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 18 Dec 2012 13:04:43 +0000 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 72B51A329D for ; Tue, 18 Dec 2012 14:04:41 +0100 (CET) Date: Tue, 18 Dec 2012 13:04:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: Re: [PATCH] Fix PR55555 In-Reply-To: Message-ID: References: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII 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 X-SW-Source: 2012-12/txt/msg01107.txt.bz2 On Mon, 17 Dec 2012, Richard Biener wrote: > On Mon, 17 Dec 2012, Richard Biener wrote: > > > > > The following patch fixes a miscompilation due to bogus loop iteration > > bound derived from array accesses in an inner loop. idx_infer_loop_bounds > > analyzes the evoultion of an SSA name with respect to a loop it is not > > defined in - which seems to lead to random weird behavior. The correct > > thing to do (as documented) is to analyze the evolution with respect > > to the loop the stmt we are interested in is in. > > > > Bootstrap and regtest ongoing on x86_64-unknown-linux-gnu. > > Which shows that the very old fix for PR40281 isn't complete > (the patch regresses PR55687 again). So the following extends > that fix. I wonder whether we instead want to pass down > CHREC_VARIABLE and avoid doing the instantiation in the first > place ... So I revisited this and reworked it so that it avoids doing the instantiation in the first place. Which makes SCEV stronger so I need to fixup gcc.dg/vect/vect-iv-11.c (now two vectorized locations, one in the inlined copy in main). Also with this patch I see FAIL: gcc.dg/tree-ssa/reassoc-19.c scan-tree-dump-times reassoc2 " \\\\+ " 0 as we now have : goto ; : _7 = (sizetype) element_6(D); _8 = -_7; rite_9 = rite_1 + _8; bar (left_5(D), rite_9, element_6(D)); : # rite_1 = PHI if (left_5(D) <= rite_1) goto ; else goto ; while before we had : goto ; : D.1716_5 = (long unsigned int) element_4(D); D.1717_6 = -D.1716_5; D.1733_12 = (sizetype) rite_1; D.1734_11 = (long unsigned int) element_4(D); D.1735_13 = -D.1734_11; D.1736_14 = D.1733_12 - D.1734_11; D.1737_15 = (char *) D.1736_14; rite_7 = D.1737_15; bar (left_3(D), rite_7, element_4(D)); : # rite_1 = PHI if (left_3(D) <= rite_1) goto ; else goto ; I will investigate what the original bug was about and come up with a fix (likely to the testcase) as a followup. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2012-12-18 Richard Biener PR tree-optimization/55555 * tree-ssa-loop-niter.c (idx_infer_loop_bounds): Properly analyze evolution of the index for the loop it is used in. * tree-scalar-evolution.c (instantiate_scev_name): Take inner loop we will be creating a chrec for. Generalize fix for PR40281 and prune invalid SCEVs. (instantiate_scev_poly): Likewise - pass down inner loop we will be creating a chrec for. (instantiate_scev_binary): Take and pass through inner loop. (instantiate_array_ref): Likewise. (instantiate_scev_convert): Likewise. (instantiate_scev_not): Likewise. (instantiate_scev_3): Likewise. (instantiate_scev_2): Likewise. (instantiate_scev_1): Likewise. (instantiate_scev_r): Likewise. (resolve_mixers): Adjust. (instantiate_scev): Likewise. * gcc.dg/torture/pr55555.c: New testcase. * gcc.dg/vect/vect-iv-11.c: Adjust. Index: gcc/tree-ssa-loop-niter.c =================================================================== *** gcc/tree-ssa-loop-niter.c (revision 194552) --- gcc/tree-ssa-loop-niter.c (working copy) *************** idx_infer_loop_bounds (tree base, tree * *** 2671,2677 **** upper = false; } ! ev = instantiate_parameters (loop, analyze_scalar_evolution (loop, *idx)); init = initial_condition (ev); step = evolution_part_in_loop_num (ev, loop->num); --- 2671,2682 ---- upper = false; } ! struct loop *dloop = loop_containing_stmt (data->stmt); ! if (!dloop) ! return true; ! ! ev = analyze_scalar_evolution (dloop, *idx); ! ev = instantiate_parameters (loop, ev); init = initial_condition (ev); step = evolution_part_in_loop_num (ev, loop->num); Index: gcc/tree-scalar-evolution.c =================================================================== *** gcc/tree-scalar-evolution.c (revision 194552) --- gcc/tree-scalar-evolution.c (working copy) *************** loop_closed_phi_def (tree var) *** 2147,2154 **** return NULL_TREE; } ! static tree instantiate_scev_r (basic_block, struct loop *, tree, bool, ! htab_t, int); /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW and EVOLUTION_LOOP, that were left under a symbolic form. --- 2147,2154 ---- return NULL_TREE; } ! static tree instantiate_scev_r (basic_block, struct loop *, struct loop *, ! tree, bool, htab_t, int); /* Analyze all the parameters of the chrec, between INSTANTIATE_BELOW and EVOLUTION_LOOP, that were left under a symbolic form. *************** static tree instantiate_scev_r (basic_bl *** 2166,2172 **** static tree instantiate_scev_name (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree res; --- 2166,2173 ---- static tree instantiate_scev_name (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree res; *************** instantiate_scev_name (basic_block insta *** 2225,2231 **** loop_p loop = loop_containing_stmt (SSA_NAME_DEF_STMT (chrec)); res = analyze_scalar_evolution (loop, chrec); res = compute_overall_effect_of_inner_loop (loop, res); ! res = instantiate_scev_r (instantiate_below, evolution_loop, res, fold_conversions, cache, size_expr); } else if (!dominated_by_p (CDI_DOMINATORS, instantiate_below, --- 2226,2233 ---- loop_p loop = loop_containing_stmt (SSA_NAME_DEF_STMT (chrec)); res = analyze_scalar_evolution (loop, chrec); res = compute_overall_effect_of_inner_loop (loop, res); ! res = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, res, fold_conversions, cache, size_expr); } else if (!dominated_by_p (CDI_DOMINATORS, instantiate_below, *************** instantiate_scev_name (basic_block insta *** 2234,2241 **** } else if (res != chrec_dont_know) ! res = instantiate_scev_r (instantiate_below, evolution_loop, res, ! fold_conversions, cache, size_expr); /* Store the correct value to the cache. */ set_instantiated_value (cache, instantiate_below, chrec, res); --- 2236,2251 ---- } else if (res != chrec_dont_know) ! { ! if (inner_loop ! && !flow_loop_nested_p (def_bb->loop_father, inner_loop)) ! /* ??? We could try to compute the overall effect of the loop here. */ ! res = chrec_dont_know; ! else ! res = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, res, ! fold_conversions, cache, size_expr); ! } /* Store the correct value to the cache. */ set_instantiated_value (cache, instantiate_below, chrec, res); *************** instantiate_scev_name (basic_block insta *** 2258,2274 **** static tree instantiate_scev_poly (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op1; tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, CHREC_LEFT (chrec), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; op1 = instantiate_scev_r (instantiate_below, evolution_loop, CHREC_RIGHT (chrec), fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) --- 2268,2287 ---- static tree instantiate_scev_poly (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *, ! tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op1; tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, + get_chrec_loop (chrec), CHREC_LEFT (chrec), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; op1 = instantiate_scev_r (instantiate_below, evolution_loop, + get_chrec_loop (chrec), CHREC_RIGHT (chrec), fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) *************** instantiate_scev_poly (basic_block insta *** 2277,2295 **** if (CHREC_LEFT (chrec) != op0 || CHREC_RIGHT (chrec) != op1) { - unsigned var = CHREC_VARIABLE (chrec); - - /* When the instantiated stride or base has an evolution in an - innermost loop, return chrec_dont_know, as this is not a - valid SCEV representation. In the reduced testcase for - PR40281 we would have {0, +, {1, +, 1}_2}_1 that has no - meaning. */ - if ((tree_is_chrec (op0) && CHREC_VARIABLE (op0) > var) - || (tree_is_chrec (op1) && CHREC_VARIABLE (op1) > var)) - return chrec_dont_know; - op1 = chrec_convert_rhs (chrec_type (op0), op1, NULL); ! chrec = build_polynomial_chrec (var, op0, op1); } return chrec; --- 2290,2297 ---- if (CHREC_LEFT (chrec) != op0 || CHREC_RIGHT (chrec) != op1) { op1 = chrec_convert_rhs (chrec_type (op0), op1, NULL); ! chrec = build_polynomial_chrec (CHREC_VARIABLE (chrec), op0, op1); } return chrec; *************** instantiate_scev_poly (basic_block insta *** 2311,2328 **** static tree instantiate_scev_binary (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, enum tree_code code, tree type, tree c0, tree c1, bool fold_conversions, htab_t cache, int size_expr) { tree op1; ! tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, c0, fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; ! op1 = instantiate_scev_r (instantiate_below, evolution_loop, c1, fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) --- 2313,2331 ---- static tree instantiate_scev_binary (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, enum tree_code code, tree type, tree c0, tree c1, bool fold_conversions, htab_t cache, int size_expr) { tree op1; ! tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, inner_loop, c0, fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; ! op1 = instantiate_scev_r (instantiate_below, evolution_loop, inner_loop, c1, fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) *************** instantiate_scev_binary (basic_block ins *** 2370,2381 **** static tree instantiate_array_ref (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree res; tree index = TREE_OPERAND (chrec, 1); ! tree op1 = instantiate_scev_r (instantiate_below, evolution_loop, index, fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) --- 2373,2386 ---- static tree instantiate_array_ref (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree res; tree index = TREE_OPERAND (chrec, 1); ! tree op1 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, index, fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) *************** instantiate_array_ref (basic_block insta *** 2406,2416 **** static tree instantiate_scev_convert (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, tree type, tree op, bool fold_conversions, htab_t cache, int size_expr) { ! tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, op, fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) --- 2411,2423 ---- static tree instantiate_scev_convert (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, tree type, tree op, bool fold_conversions, htab_t cache, int size_expr) { ! tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, op, fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) *************** instantiate_scev_convert (basic_block in *** 2453,2463 **** static tree instantiate_scev_not (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, enum tree_code code, tree type, tree op, bool fold_conversions, htab_t cache, int size_expr) { ! tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, op, fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) --- 2460,2472 ---- static tree instantiate_scev_not (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, enum tree_code code, tree type, tree op, bool fold_conversions, htab_t cache, int size_expr) { ! tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, op, fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) *************** instantiate_scev_not (basic_block instan *** 2501,2524 **** static tree instantiate_scev_3 (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op1, op2; tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; op1 = instantiate_scev_r (instantiate_below, evolution_loop, ! TREE_OPERAND (chrec, 1), fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) return chrec_dont_know; op2 = instantiate_scev_r (instantiate_below, evolution_loop, ! TREE_OPERAND (chrec, 2), fold_conversions, cache, size_expr); if (op2 == chrec_dont_know) return chrec_dont_know; --- 2510,2534 ---- static tree instantiate_scev_3 (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op1, op2; tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; op1 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, TREE_OPERAND (chrec, 1), fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) return chrec_dont_know; op2 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, TREE_OPERAND (chrec, 2), fold_conversions, cache, size_expr); if (op2 == chrec_dont_know) return chrec_dont_know; *************** instantiate_scev_3 (basic_block instanti *** 2548,2565 **** static tree instantiate_scev_2 (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op1; tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; op1 = instantiate_scev_r (instantiate_below, evolution_loop, ! TREE_OPERAND (chrec, 1), fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) return chrec_dont_know; --- 2558,2576 ---- static tree instantiate_scev_2 (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op1; tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) return chrec_dont_know; op1 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, TREE_OPERAND (chrec, 1), fold_conversions, cache, size_expr); if (op1 == chrec_dont_know) return chrec_dont_know; *************** instantiate_scev_2 (basic_block instanti *** 2587,2597 **** static tree instantiate_scev_1 (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) --- 2598,2609 ---- static tree instantiate_scev_1 (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, bool fold_conversions, htab_t cache, int size_expr) { tree op0 = instantiate_scev_r (instantiate_below, evolution_loop, ! inner_loop, TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); if (op0 == chrec_dont_know) *************** instantiate_scev_1 (basic_block instanti *** 2619,2625 **** static tree instantiate_scev_r (basic_block instantiate_below, ! struct loop *evolution_loop, tree chrec, bool fold_conversions, htab_t cache, int size_expr) { /* Give up if the expression is larger than the MAX that we allow. */ --- 2631,2638 ---- static tree instantiate_scev_r (basic_block instantiate_below, ! struct loop *evolution_loop, struct loop *inner_loop, ! tree chrec, bool fold_conversions, htab_t cache, int size_expr) { /* Give up if the expression is larger than the MAX that we allow. */ *************** instantiate_scev_r (basic_block instanti *** 2634,2664 **** switch (TREE_CODE (chrec)) { case SSA_NAME: ! return instantiate_scev_name (instantiate_below, evolution_loop, chrec, fold_conversions, cache, size_expr); case POLYNOMIAL_CHREC: ! return instantiate_scev_poly (instantiate_below, evolution_loop, chrec, fold_conversions, cache, size_expr); case POINTER_PLUS_EXPR: case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: ! return instantiate_scev_binary (instantiate_below, evolution_loop, chrec, TREE_CODE (chrec), chrec_type (chrec), TREE_OPERAND (chrec, 0), TREE_OPERAND (chrec, 1), fold_conversions, cache, size_expr); CASE_CONVERT: ! return instantiate_scev_convert (instantiate_below, evolution_loop, chrec, TREE_TYPE (chrec), TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); case NEGATE_EXPR: case BIT_NOT_EXPR: ! return instantiate_scev_not (instantiate_below, evolution_loop, chrec, TREE_CODE (chrec), TREE_TYPE (chrec), TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); --- 2647,2682 ---- switch (TREE_CODE (chrec)) { case SSA_NAME: ! return instantiate_scev_name (instantiate_below, evolution_loop, ! inner_loop, chrec, fold_conversions, cache, size_expr); case POLYNOMIAL_CHREC: ! return instantiate_scev_poly (instantiate_below, evolution_loop, ! inner_loop, chrec, fold_conversions, cache, size_expr); case POINTER_PLUS_EXPR: case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: ! return instantiate_scev_binary (instantiate_below, evolution_loop, ! inner_loop, chrec, TREE_CODE (chrec), chrec_type (chrec), TREE_OPERAND (chrec, 0), TREE_OPERAND (chrec, 1), fold_conversions, cache, size_expr); CASE_CONVERT: ! return instantiate_scev_convert (instantiate_below, evolution_loop, ! inner_loop, chrec, TREE_TYPE (chrec), TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); case NEGATE_EXPR: case BIT_NOT_EXPR: ! return instantiate_scev_not (instantiate_below, evolution_loop, ! inner_loop, chrec, TREE_CODE (chrec), TREE_TYPE (chrec), TREE_OPERAND (chrec, 0), fold_conversions, cache, size_expr); *************** instantiate_scev_r (basic_block instanti *** 2671,2677 **** return chrec_known; case ARRAY_REF: ! return instantiate_array_ref (instantiate_below, evolution_loop, chrec, fold_conversions, cache, size_expr); default: --- 2689,2696 ---- return chrec_known; case ARRAY_REF: ! return instantiate_array_ref (instantiate_below, evolution_loop, ! inner_loop, chrec, fold_conversions, cache, size_expr); default: *************** instantiate_scev_r (basic_block instanti *** 2684,2698 **** switch (TREE_CODE_LENGTH (TREE_CODE (chrec))) { case 3: ! return instantiate_scev_3 (instantiate_below, evolution_loop, chrec, fold_conversions, cache, size_expr); case 2: ! return instantiate_scev_2 (instantiate_below, evolution_loop, chrec, fold_conversions, cache, size_expr); case 1: ! return instantiate_scev_1 (instantiate_below, evolution_loop, chrec, fold_conversions, cache, size_expr); case 0: --- 2703,2720 ---- switch (TREE_CODE_LENGTH (TREE_CODE (chrec))) { case 3: ! return instantiate_scev_3 (instantiate_below, evolution_loop, ! inner_loop, chrec, fold_conversions, cache, size_expr); case 2: ! return instantiate_scev_2 (instantiate_below, evolution_loop, ! inner_loop, chrec, fold_conversions, cache, size_expr); case 1: ! return instantiate_scev_1 (instantiate_below, evolution_loop, ! inner_loop, chrec, fold_conversions, cache, size_expr); case 0: *************** instantiate_scev (basic_block instantiat *** 2729,2736 **** fprintf (dump_file, ")\n"); } ! res = instantiate_scev_r (instantiate_below, evolution_loop, chrec, false, ! cache, 0); if (dump_file && (dump_flags & TDF_SCEV)) { --- 2751,2758 ---- fprintf (dump_file, ")\n"); } ! res = instantiate_scev_r (instantiate_below, evolution_loop, ! NULL, chrec, false, cache, 0); if (dump_file && (dump_flags & TDF_SCEV)) { *************** tree *** 2753,2760 **** resolve_mixers (struct loop *loop, tree chrec) { htab_t cache = htab_create (10, hash_scev_info, eq_scev_info, del_scev_info); ! tree ret = instantiate_scev_r (block_before_loop (loop), loop, chrec, true, ! cache, 0); htab_delete (cache); return ret; } --- 2775,2782 ---- resolve_mixers (struct loop *loop, tree chrec) { htab_t cache = htab_create (10, hash_scev_info, eq_scev_info, del_scev_info); ! tree ret = instantiate_scev_r (block_before_loop (loop), loop, NULL, ! chrec, true, cache, 0); htab_delete (cache); return ret; } Index: gcc/testsuite/gcc.dg/torture/pr55555.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr55555.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr55555.c (working copy) *************** *** 0 **** --- 1,34 ---- + /* { dg-do run } */ + + double s[4] = { 1.0, 2.0, 3.0, 4.0 }, pol_x[2] = { 5.0, 6.0 }; + + __attribute__((noinline)) int + foo (void) + { + double coef_x[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + int lxp = 0; + if (lxp <= 1) + do + { + double t = pol_x[lxp]; + long S; + long l = lxp * 4L - 1; + for (S = 1; S <= 4; S++) + coef_x[S + l] = coef_x[S + l] + s[S - 1] * t; + } + while (lxp++ != 1); + asm volatile ("" : : "r" (coef_x) : "memory"); + for (lxp = 0; lxp < 8; lxp++) + if (coef_x[lxp] != ((lxp & 3) + 1) * (5.0 + (lxp >= 4))) + __builtin_abort (); + return 1; + } + + int + main () + { + asm volatile ("" : : : "memory"); + if (!foo ()) + __builtin_abort (); + return 0; + } Index: gcc/testsuite/gcc.dg/vect/vect-iv-11.c =================================================================== *** gcc/testsuite/gcc.dg/vect/vect-iv-11.c (revision 194552) --- gcc/testsuite/gcc.dg/vect/vect-iv-11.c (working copy) *************** *** 3,9 **** #include #include "tree-vect.h" ! int main1 (int len) { int s = 0; int i = len; --- 3,10 ---- #include #include "tree-vect.h" ! int __attribute__((noinline,noclone)) ! main1 (int len) { int s = 0; int i = len;