> Hmm, can you clarify, do you mean I should *not* replace constant pool > values with their DECL_INITIAL? The attempt to substitute in the > initial value is what leads to most of the problems. For example, in > gnat/opt31.adb, create_access finds this expression accessing *.LC0: > > MEM[(interfaces__unsigned_8[(sizetype) <PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->LB0:<PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->UB0 >= <PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->LB0 ? (sizetype) <PLACEHOLDER_EXPR > struct opt31__messages_t___XUP>.P_BOUNDS->UB0 : (sizetype) > <PLACEHOLDER_EXPR struct opt31__messages_t___XUP>.P_BOUNDS->LB0 + > 4294967295] *)&*.LC0][1 ...]{lb: 1 sz: 1} > > this is an ARRAY_RANGE_REF of a MEM_REF of an ADDR_EXPR of *.LC0. So > far I haven't extended subst_constant_pool_initial to handle > ARRAY_RANGE_REFs, as it can't even handle this MEM_REF: > > MEM[(interfaces__unsigned_8[(sizetype) <PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->LB0:<PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->UB0 >= <PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->LB0 ? (sizetype) <PLACEHOLDER_EXPR > struct opt31__messages_t___XUP>.P_BOUNDS->UB0 : (sizetype) > <PLACEHOLDER_EXPR struct opt31__messages_t___XUP>.P_BOUNDS->LB0 + > 4294967295] *)&*.LC0] > > because the type here has size: > > MIN_EXPR <_GLOBAL.SZ2.ada_opt31 (<PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->UB0, <PLACEHOLDER_EXPR struct > opt31__messages_t___XUP>.P_BOUNDS->LB0), 17179869176> > > inside the MEM_REF of the ADDR_EXPR is *.LC0, whose DECL_INITIAL is a > 4-element array (fine). Sadly while the MEM_REF > type_contains_placeholder_p, the type of the outer ARRAY_RANGE_REF > does not....
FWIW you are allowed to punt on this kind of complex expressions that appear only in Ada. New optimizations are sort of allowed to work on the C family of languages first, and be extended or not to the rest of languages afterwards. > One possibility is that this whole construct, ARRAY_RANGE_REF that it > is, should mark *.LC0 in cannot_scalarize_away_bitmap. ARRAY_RANGE_REF is only used in Ada so you can do that for now (unless this introduces regressions in the gnat.dg testsuite but I doubt it). -- Eric Botcazou