arichardson added inline comments.
================ Comment at: llvm/lib/IR/AutoUpgrade.cpp:4297 + // address space of 1. + if (T.isAMDGPU() && !DL.contains("-G") && !DL.startswith("G")) { + return DL.empty() ? std::string("G1") : (DL + "-G1").str(); ---------------- dylanmckay wrote: > dylanmckay wrote: > > arichardson wrote: > > > akhuang wrote: > > > > arichardson wrote: > > > > > arsenm wrote: > > > > > > I would expect datalayout upgrades to work by parsing the old > > > > > > string, and checking the field values inside. I guess directly > > > > > > checking the string isn't a new problem here > > > > > I agree that would be less error prone. I wonder if there are cases > > > > > where the old string may fail to parse so you have to do the textual > > > > > upgrade first. I'm happy to make this change. > > > > > > > > > > @akhuang is there a reason you used string parsing in D67631? Any > > > > > objections to changing the code to parse the datalayout and add > > > > > missing attributes? > > > > I don't think so; parsing the datalayout sounds better to me too. > > > I just looked into parsing the DataLayout instead. Unfortunately the > > > resulting code is more complicated since there are no setters in > > > DataLayout and no way to create a normalized representation. > > > There's also no way to differentiate between no `-G ` passed and `-G0` so > > > something like `e-p:64:64-G0` will be converted to `e-p:64:64-G0-G1` > > > > > I suspect it would be possible to use the existing `DataLayout(StringRef)` > > constructor on the string, then call `getDefaultGlobalsAddressSpace()` on > > it, explicitly ignoring modifying the datalayout for the special case of an > > explicit `-G0`. > > > > For example, > > > > ```cpp > > DataLayout ParsedDL = DataLayout(DL); > > if (T.isAMDGPU() && !DL.contains("-G0") > > &&ParsedDL.getDefaultGlobalsAddressSpace() != 1) { > > return DL.empty() ? std::string("G1") : (DL + "-G1").str(); > > } > > ``` > > > > As I understand it, this would cover the fact that we cannot distinguish > > between an explicit default globals space of zero, and a datalayout without > > a default globals space (also `DL::getDefaultGlobalsAddressSpace() == 0`) > > by explicitly excluding the special case `-G0` > To be completely correct it should not assume that the global address space > is not at the very start of the data layout as my initial snippet did. I've > removed the `-` prefix from the `contains` check > > ``` > DataLayout ParsedDL = DataLayout(DL); > if (T.isAMDGPU() && !DL.contains("G0") > &&ParsedDL.getDefaultGlobalsAddressSpace() != 1) { > return DL.empty() ? std::string("G1") : (DL + "-G1").str(); > } > ``` We then end up overwriting explicitly specified `G<N>` flags. Maybe some tests would like to check that overriding the globals address space works? Also I believe this can result in an invalid datalayout: `"...-G2"` will be converted to `"...-G2-G1"`. Not sure what the correct approach is @arsenm ? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D84345/new/ https://reviews.llvm.org/D84345 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits