> > Added and comitted now. > > Thanks. Now on to the wrong code issues. :-) > > Up to the change, the useless_type_conversion_p predicate was relying on > structural equivalence via the TYPE_CANONICAL check, now it only looks at the > outermost level (size, mode). Now some back-ends, most notably x86-64, do a > deep structural scan to determine the calling conventions (classify_argument) > instead of just looking at the size and the mode, so consistency dictates > that > the type of the argument and that of the parameter be structurally equivalent > and this sometimes can only be achieved by a VCE... which is now deleted. :-( > See the call to derivedIP in the attached testcase which now fails on x86-64. > > How do we get away from here?
Hmm, I noticed this in ipa-icf context and wrote checker that two functions are ABI compatile (did not pushed it out yet), but of course this is nastier. I think the problem exists before my patch with LTO - it is just matter of doing two types which will be considered equivalent by gimple_canonical_types_compatible_p but have different type conversion. An example of such type would be: struct a { int a[4]; }; struct b { int a[4]; } __attribute__ ((__aligned__(16))); I tried to turn this into an testcase, the problem is that I don't know of a way to obtain VIEW_CONVERT_EXPR between the two types out of C or C++ frontend and we don't seem to synthetize these in middle end (even in cases it would make sense). I will try to play with it more - would be nice to have a C reproducer. We may be safe before my patch from wrong code issues if there is no way to rpduce VIEW_CONVERT_EXPR between types like this in languages that support aligned attribute. I think the problem is generally similar to memory references - the gimple type compatibility should not be tied to ABI details. Probably most consistent solution would be to extend GIMPLE_CALL to also list types of parameters and do not rely on whatever type the operand have.... Richard, any ideas? Honza > > > * gnat.dg/discr44.adb: New test. > > -- > Eric Botcazou > -- { dg-do run } > -- { dg-options "-gnatws" } > > procedure Discr44 is > > function Ident (I : Integer) return Integer is > begin > return I; > end; > > type Int is range 1 .. 10; > > type Str is array (Int range <>) of Character; > > type Parent (D1, D2 : Int; B : Boolean) is record > S : Str (D1 .. D2); > end record; > > type Derived (D : Int) is new Parent (D1 => D, D2 => D, B => False); > > X1 : Derived (D => Int (Ident (7))); > > begin > if X1.D /= 7 then > raise Program_Error; > end if; > end;