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?


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
Index: tree-ssa-pre.c
===================================================================
--- tree-ssa-pre.c	(revision 171716)
+++ tree-ssa-pre.c	(working copy)
@@ -2874,8 +2874,10 @@ create_component_ref_by_pieces_1 (basic_
 	  return NULL_TREE;
 	if (genop2)
 	  {
-	    /* Drop zero minimum index.  */
-	    if (tree_int_cst_equal (genop2, integer_zero_node))
+	    tree domain_type = TYPE_DOMAIN (TREE_TYPE (genop0));
+	    /* Drop zero minimum index if redundant.  */
+	    if (integer_zerop (genop2)
+		&& integer_zerop (TYPE_MIN_VALUE (domain_type)))
 	      genop2 = NULL_TREE;
 	    else
 	      {
-- { dg-do compile }
-- { dg-options "-O2 -gnatws" }

procedure Opt16 is

   generic
      type T (<>) is private;
      V, V1 : T;
      with function F1 (X : T) return T;
   package GP is
      R : Boolean := F1 (V) = V1;
   end GP;

   type AB is array (Boolean range <>) of Boolean;

begin
   for I1 in Boolean loop
      for I2 in Boolean loop
         declare
            B1 : Boolean := I1;
            B2 : Boolean := I2;
            AB1 : AB (Boolean) := (I1, I2);
            T : AB (B1 .. B2) := (B1 .. B2 => True);
            F : AB (B1 .. B2) := (B1 .. B2 => False);

            package P is new GP (AB, AB1, NOT AB1, "NOT");

         begin
            null;
         end;
      end loop;
   end loop;
end;

Reply via email to