> I've committed (r183305) a slightly changed variant that merges the two
> outer bitmap loops again, like so:
>
> +             EXECUTE_IF_AND_COMPL_IN_BITMAP (work, old_conflicts, 0, i,
> bi) {
>                   unsigned j;
>                   bitmap_iterator bj;
> -                 EXECUTE_IF_SET_IN_BITMAP (work, i + 1, j, bj)
> +                 /* First the conflicts between new and old_conflicts.  */
> +                 EXECUTE_IF_SET_IN_BITMAP (old_conflicts, 0, j, bj)
> +                   add_stack_var_conflict (i, j);
> +                 /* Then the conflicts between only the new members.  */
> +                 EXECUTE_IF_AND_COMPL_IN_BITMAP (work, old_conflicts, i +
> 1, +                                                 j, bj)
>                     add_stack_var_conflict (i, j);
>                 }

Is it supposed to change the generated code or...?  Because it has introduced 
regressions in stack usage.  Compile the attached testcase (stack_test.adb)
with -fstack-usage on x86-64 and you'll get 496 bytes in the .su file.  If the 
patch is reverted, this goes back to the expected 64 bytes.

-- 
Eric Botcazou
package body Pack is

   function Ident_Int (X : Integer) return Integer is
   begin
      return X;
   end Ident_Int;

   procedure My_Proc (X : R) is
   begin
      null;
   end My_Proc;

end Pack;
with Pack; use Pack;
procedure Stack_Test is

   A : Integer := Ident_Int (123);

begin
   case A is
       when 0 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 1 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 2 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 3 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 4 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 5 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 6 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 7 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 8 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when 9 =>
          My_Proc (R'(Ident_Int(0), Ident_Int(1), Ident_Int(2), Ident_Int(3), Ident_Int(4), Ident_Int(5), Ident_Int(6), Ident_Int(7), Ident_Int(8), Ident_Int(9)));
       when others =>
          null;
   end case;
end Stack_Test;
package Pack is

   function Ident_Int (X : Integer) return Integer;

   type R is
       record
          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9 : Integer;
       end record;

   procedure My_Proc (X : R);

end Pack;

Reply via email to