On Thu, Mar 31, 2011 at 5:25 PM, Eric Botcazou <ebotca...@adacore.com> wrote: > Hi, > > the ACATS test cc3601a started to fail recently at -O2 after the various > tweaks > to the optimizer. This is an assertion failure in the gimplifier invoked from > PRE because of a dangling PLACEHOLDER_EXPR in operand #2 of an ARRAY_REF. > > CCP2 turns the ARRAY_REF: > > D.2774_394 = MEM[(boolean[(size_type) <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->LB0:<PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->UB0 >= <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->LB0 ? (size_type) <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->UB0 : (size_type) <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->LB0 + -1] *)&ab1][D.2776_392]{lb: D.2758_393 sz: > 1}; > > into: > > D.2774_394 = MEM[(boolean[(size_type) <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->LB0:<PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->UB0 >= <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->LB0 ? (size_type) <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->UB0 : (size_type) <PLACEHOLDER_EXPR struct > opt16__ab___XUP>.P_BOUNDS->LB0 + -1] *)&ab1][D.2776_392]{lb: 0 sz: 1}; > > i.e. it computes that operand #2 is 0. Later PRE re-creates the reference "by > pieces" and explicitly drops the 0: > > if (genop2) > { > /* Drop zero minimum index. */ > if (tree_int_cst_equal (genop2, integer_zero_node)) > genop2 = NULL_TREE; > > so the gimplifier re-populates it, bringing back the PLACEHOLDER_EXPR. > > Fixed by not dropping the 0 in PRE. Tested on i586-suse-linux, OK for the > mainline?
Ok. Thanks, Richard. > > 2011-03-31 Eric Botcazou <ebotca...@adacore.com> > > * tree-ssa-pre.c (create_component_ref_by_pieces_1) <ARRAY_REF>: > Drop a zero minimum index only if it is redundant. > > > 2011-03-31 Eric Botcazou <ebotca...@adacore.com> > > * gnat.dg/opt16.adb: New test. > > > -- > Eric Botcazou >