The optimization was almost immediately disabled accidentally by:
  https://gcc.gnu.org/ml/gcc-cvs/2012-06/msg00577.html
Of course I should have added a testcase in the first place...

Tested on x86_64-suse-linux, applied on all active branches as obvious (this 
only affects the Ada compiler).


2014-07-10  Eric Botcazou  <ebotca...@adacore.com>

        PR middle-end/53590
        * function.c (allocate_struct_function): Revert r188667 change.


2014-07-10  Eric Botcazou  <ebotca...@adacore.com>

        * gnat.dg/opt39.adb: New test.


-- 
Eric Botcazou
Index: function.c
===================================================================
--- function.c	(revision 212420)
+++ function.c	(working copy)
@@ -4549,6 +4549,7 @@ allocate_struct_function (tree fndecl, b
       /* ??? This could be set on a per-function basis by the front-end
          but is this worth the hassle?  */
       cfun->can_throw_non_call_exceptions = flag_non_call_exceptions;
+      cfun->can_delete_dead_exceptions = flag_delete_dead_exceptions;
     }
 }
 
-- { dg-do compile }
-- { dg-options "-O2 -fno-inline -fdump-tree-optimized" }

procedure Opt39 (I : Integer) is

  type Rec is record
    I1 : Integer;
    I2 : Integer;
    I3 : Integer;
    I4 : Integer;
    I5 : Integer;
  end record;

  procedure Set (A : access Rec; I : Integer) is
    Tmp : Rec := A.all;
  begin
    Tmp.I1 := I;
    A.all := Tmp;
  end;

  R : aliased Rec;

begin
  Set (R'Access, I);
  if R.I1 /= I then
    raise Program_Error;
  end if;
end;

-- { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } }
-- { dg-final { cleanup-tree-dump "optimized" } }

Reply via email to