Hi, We're experiencing a memory explosion during PRE on several ACATS tests with mainline (+1 local patch, but it's very likely the same issue as PR 27937).
Excerpt from .067t.pre: Created value VH.26 for (struct cd5012i__genproc__cell *volatile & {ref-all}) VH.25 Created value VH.33 for *VH.26 vuses: (fcndecl__var0_49,HEAP.8_51,SMT.10_52) Created value VH.34 for *VH.26 vuses: (fcndecl__var0_49,HEAP.8_51,SMT.10_52) Created value VH.47 for *VH.26 vuses: (fcndecl__var0_49,HEAP.8_51,SMT.10_52) Created value VH.49 for *VH.26 vuses: (fcndecl__var0_49,HEAP.8_51,SMT.10_52) [...] and so on ad nauseam. The problem boils down to operand_equal_p returning false on operand_equal_p (arg0=0x93dc744, arg1=0x94d4724, flags=2) at /home/eric/gnat/gnat6/src/gcc/fold-const.c:2491 2491 if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK) (gdb) p debug_tree(arg0) <indirect_ref 0x93dc744 type <pointer_type 0x556f7ac8 cd5012i__genproc__pointer type <record_type 0x556f77e8 cd5012i__genproc__cell sizes-gimplified DI size <integer_cst 0x556a9528 constant invariant visited 64> unit size <integer_cst 0x556a9540 constant invariant 8> align 32 symtab 0 alias set 5 fields <field_decl 0x556f78a0 value> Ada size <integer_cst 0x556a9528 64> pointer_to_this <pointer_type 0x556f3d4c cd5012i__genproc__pointer>chain <type_decl 0x556bf208 D.619>> sizes-gimplified volatile public unsigned SI size <integer_cst 0x556a93f0 constant invariant 32> unit size <integer_cst 0x556a9180 constant invariant 4> user align 32 symtab 0 alias set -1 reference_to_this <reference_type 0x556f7b24>> side-effects volatile arg 0 <value_handle 0x55704160 type <reference_type 0x556f7b24 type <pointer_type 0x556f7ac8 cd5012i__genproc__pointer> sizes-gimplified static unsigned SI size <integer_cst 0x556a93f0 32> unit size <integer_cst 0x556a9180 4> align 32 symtab 0 alias set -1> > cd5012i.adb:27> $5 = void (gdb) p debug_tree(arg1) <indirect_ref 0x94d4724 type <pointer_type 0x556f7ac8 cd5012i__genproc__pointer type <record_type 0x556f77e8 cd5012i__genproc__cell sizes-gimplified DI size <integer_cst 0x556a9528 constant invariant visited 64> unit size <integer_cst 0x556a9540 constant invariant 8> align 32 symtab 0 alias set 5 fields <field_decl 0x556f78a0 value> Ada size <integer_cst 0x556a9528 64> pointer_to_this <pointer_type 0x556f3d4c cd5012i__genproc__pointer>chain <type_decl 0x556bf208 D.619>> sizes-gimplified volatile public unsigned SI size <integer_cst 0x556a93f0 constant invariant 32> unit size <integer_cst 0x556a9180 constant invariant 4> user align 32 symtab 0 alias set -1 reference_to_this <reference_type 0x556f7b24>> side-effects volatile arg 0 <value_handle 0x55704160 type <reference_type 0x556f7b24 type <pointer_type 0x556f7ac8 cd5012i__genproc__pointer> sizes-gimplified static unsigned SI size <integer_cst 0x556a93f0 32> unit size <integer_cst 0x556a9180 4> align 32 symtab 0 alias set -1> > cd5012i.adb:27> $6 = void i.e. 2 dereferences of the same volatile VALUE_HANDLE because of: case tcc_reference: /* If either of the pointer (or reference) expressions we are dereferencing contain a side effect, these cannot be equal. */ if (TREE_SIDE_EFFECTS (arg0) || TREE_SIDE_EFFECTS (arg1)) return 0; It seems to me that the volatility should be accounted for in the VALUE_HANDLE itself only, not in (de)references to it. Thoughts? -- Eric Botcazou