This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH RFA: PR 29286: Handle placement new aliasing issues
> > Sure, that is true, but nevertheless finalize_ref_all_pointers is
> > going to indicate that any REF_ALL pointer may point to any call
> > clobbered variable. I don't see what stops that.
>
> OK, I may have misunderstood.
No, I haven't. :-)
Testcase attached, compile at -O -gnatp -fno-inline. Excerpt from .alias1:
Flow-insensitive alias information for P.Func
Aliased symbols
SMT.54, UID 764, void, is addressable, direct reads: 0, direct writes: 0,
indirect reads: 0, indirect writes: 0, read frequency: 0, write frequency: 0,
may aliases: { a b c r }
a, UID 691, integer, is addressable, direct reads: 0, direct writes: 0,
indirect reads: 1, indirect writes: 0, read frequency: 9900, write frequency:
0
b, UID 692, integer, is addressable, direct reads: 0, direct writes: 0,
indirect reads: 2, indirect writes: 0, read frequency: 19800, write
frequency: 0
c, UID 693, integer, is addressable, direct reads: 0, direct writes: 0,
indirect reads: 1, indirect writes: 0, read frequency: 9900, write frequency:
0
r, UID 694, struct p__rec, is addressable, direct reads: 2, direct writes: 0,
indirect reads: 0, indirect writes: 2, read frequency: 20000, write
frequency: 0, call clobbered (passed to call)
NMT.55, UID 765, integer, is addressable, direct reads: 1, direct writes: 0,
indirect reads: 0, indirect writes: 0, read frequency: 0, write frequency: 0,
may aliases: { b c }
NMT.56, UID 766, integer, is addressable, direct reads: 1, direct writes: 0,
indirect reads: 0, indirect writes: 0, read frequency: 0, write frequency: 0,
may aliases: { a b }
Dereferenced pointers
p, UID 689, integer * {ref-all}, symbol memory tag: SMT.54
q, UID 690, integer * {ref-all}, symbol memory tag: SMT.54
Symbol memory tags
SMT.54, UID 764, void, is addressable, direct reads: 0, direct writes: 0,
indirect reads: 0, indirect writes: 0, read frequency: 0, write frequency: 0,
may aliases: { a b c r }
Flow-sensitive alias information for P.Func
SSA_NAME pointers
p_1, name memory tag: NMT.55, is dereferenced (R=1, W=0), points-to vars: { b
c }
q_2, name memory tag: NMT.56, is dereferenced (R=1, W=0), points-to vars: { a
b }
Name memory tags
NMT.55, UID 765, integer, is addressable, direct reads: 1, direct writes: 0,
indirect reads: 0, indirect writes: 0, read frequency: 0, write frequency: 0,
may aliases: { b c }
NMT.56, UID 766, integer, is addressable, direct reads: 1, direct writes: 0,
indirect reads: 0, indirect writes: 0, read frequency: 0, write frequency: 0,
may aliases: { a b }
Pointed-to sets for pointers in P.Func
p_1, name memory tag: NMT.55, is dereferenced (R=1, W=0), points-to vars: { b
c }
q_2, name memory tag: NMT.56, is dereferenced (R=1, W=0), points-to vars: { a
b }
<bb 8>:
# VUSE <b_18(D), c_19(D)>
D.697_12 = *p_1;
# VUSE <a_20(D), b_18(D)>
D.698_13 = *q_2;
D.696_14 = D.697_12 + D.698_13;
--
Eric Botcazou
package P is
function func (I : Integer) return Integer;
end P;
package body P is
type Rec is record
I : Integer;
F1, F2 : Float;
end record;
procedure Proc (I : Integer; R : out Rec) is
begin
R.I := I;
end;
function func (I : Integer) return Integer is
type Ref_All_Pointer is access all integer;
pragma No_Strict_Aliasing (Ref_All_Pointer);
P, Q : Ref_All_Pointer;
A, B, C : aliased Integer;
R : Rec;
begin
Proc (I, R);
if R.I = 1 then
P := C'Access;
else
P := B'Access;
end if;
if R.I = 0 then
Q := A'Access;
else
Q := B'Access;
end if;
if P = Q then
raise Program_Error;
end if;
return P.all + Q.all;
end;
end;