Jan Hubicka <hubi...@ucw.cz> writes: >> > Hi, >> > the alias-2.c testcase fails on targets with anchors. The reason is that >> > the variable itself is anchored while the alias is not and they point to >> > the >> > same location. I folllowed the docs of SYMBOL_REF claiming that >> > SYMBOL_REF_DECL if the symbol is label and tought it is safe to >> > disambiguate >> > them. >> >> What kind of distinction do you mean between "label" and non-label here? >> >> I don't think !SYMBOL_REF_DECL tells us anything useful about the >> symbol. I think it's more a case of: if SYMBOF_REF_DECL is present, >> we can assume that what it says is accurate. If it isn't present we >> can't assume anything. >> >> So was it... >> >> Jan Hubicka <hubi...@ucw.cz> writes: >> > @@ -2323,26 +2367,14 @@ >> > >> > if (GET_CODE (x) == SYMBOL_REF && GET_CODE (y) == SYMBOL_REF) >> > { >> > - tree x_decl = SYMBOL_REF_DECL (x); >> > - tree y_decl = SYMBOL_REF_DECL (y); >> > - int cmp; >> > + int cmp = compare_base_symbol_refs (x,y); >> > >> > - if (!x_decl || !y_decl) >> > - { >> > - /* Label and normal symbol are never the same. */ >> > - if (x_decl != y_decl) >> > - return 0; >> > - return offset_overlap_p (c, xsize, ysize); >> >> ...this part of the code that was causing the problem? That doesn't >> seem valid even without the anchor stuff. I think the starting position > > Yep, I misread the docs assuming that SYMBOL_REF_DECL == NULL only > for code labels. It is always safe to disambiguate these as they access > readonly memory anyway. > >> should be that we can only use offset_overlap_p if XSTR (x) == XSTR (y) >> and need to assume a conflict otherwise. E.g. I think in principle it's >> valid for a target to create symbol_refs for different parts of a single >> artificial object. > > The code original was: > if (rtx_equal_for_memref_p (x, y)) > { > return offset_overlap_p (c, xsize, ysize); > } > and > rtx_equal_for_memref_p (const_rtx x, const_rtx y) > { > ... > case SYMBOL_REF: > return XSTR (x, 0) == XSTR (y, 0); > > So it assumed base+offset check for all labels with same XSTR. My patch > makes this strictly weaker: it is possible that the same variable is > accessed via its own symbol or via offset from variable anchor.
Well, to me "weaker" means "makes more conservative assumptions", which in this context would be assuming a conflict in cases where the old code didn't (i.e. returning -1 more often). I'm not sure whether the first patch was strictly weaker in that sense, since if the symbol_refs were not equal according to rtx_equal_for_memref_p, the old code would fall through to the end of the function and return -1. >> I agree there are other refinements you can do on top of that, >> e.g. that two block symbols in different blocks can never conflict. >> But the patch seems to be treating anchors as an exception to the rule, >> whereas I think they're just one instance of the rule. > > Can you think of some testcase? Not a specific one, sorry, but it seems like the kind of thing that could happen with extra ABI-mandated constructs. But maybe the lack of a specific testcase is a good thing. If in practice anchors make up the vast majority of cases where (a) SYMBOL_REF_DECL is null and (b) XSTR is too weak, there should no harm in relying on the old XSTR comparison for the non-anchor null-decl cases. > Doing XSTR==XSTR test and assuming a conflict otherwise will cause a > conflict between > every external variable read/write and static variable read/write as one > will be anchored > and other not. Yeah, I think handling anchors is a good thing. It just seems that logically the correctness fix is to replace: /* Label and normal symbol are never the same. */ if (x_decl != y_decl) return 0; return offset_overlap_p (c, xsize, ysize); with something like: if (XSTR (x, 0) == XSTR (y, 0)) return offset_overlap_p (c, xsize, ysize); /* Symbols might conflict. */ return -1; Handling anchors would then be a very useful optimisation on top of that. Thanks, Richard