Diff Detail
Event Timeline
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | From this workaround, it seems like how inaccessiblememonly is used for calloc does not completely match AA's interpretation. Are there other cases in the code base? I'm not sure if special casing calloc here is ideal. I think we should probably treat the AA change as a separate patch, with an AA only test as well, perhaps llvm/test/Analysis/BasicAA/libfuncs.ll? |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | Not only calloc, all alloc (calloc, malloc, aligned_alloc) fns have inaccessiblememonly. inaccessiblememonly was introduced long time ago but this attribute was basically dead, no libfunc used it until recently. Sadly, inaccessiblememonly is somehow broken nowdays as the code assumes that such call does not write or read memory, but of course it returns memory. This AA change can be separated patch (but this DSE needs it as a prerequisite) Another solution is removal of inaccessiblememonly from alloc fns, as it caused more harm then improvements. |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | Your new implementation claims that inaccessiblememonly alloc-like fns mod all locations -- if that's what you want, just drop the attribute from the functions entirely. That will have about the same effect. I think inaccessiblememonly is fine for modeling malloc behavior (or do you see any issues there as well?), the problem is with calloc which combines malloc (inaccessiblememonly) with a write to the location (accessible). As @jdoerfert already pointed out on the PR, properly modelling this would require "inaccessible_or_returned_memonly". While I'm somewhat open to DSE hacks, I don't think making this change on the AA layer is acceptable. I think dropping inaccessiblememonly inference for calloc() specifically would be the right thing to do in the meantime. |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | Yeah, I will just drop it from calloc. |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 |
Just found one I think. Imagine you want to change malloc+memset combo to calloc auto *UnderlyingDef = cast<MemoryDef>(MSSA.getMemoryAccess(MallocInst)); // If UnderlyingDef is the clobbering access of Def, no instructions // between them can modify the memory location. auto *ClobberDef = MSSA.getSkipSelfWalker()->getClobberingMemoryAccess(MemsetDef); return UnderlyingDef == ClobberDef; This will fail. |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | I am wondering whether there is other solution or should I just remove inaccessiblememonly from malloc too? I tried also to use memoryIsNotModifiedBetween but MemLoc is None |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | @xbolva00: |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | Great! Please post new patch :) |
llvm/lib/Analysis/AliasAnalysis.cpp | ||
---|---|---|
241 | Sure. I cannot uploaded diff to this one so created new instead: https://reviews.llvm.org/D103009 |
From this workaround, it seems like how inaccessiblememonly is used for calloc does not completely match AA's interpretation. Are there other cases in the code base? I'm not sure if special casing calloc here is ideal.
I think we should probably treat the AA change as a separate patch, with an AA only test as well, perhaps llvm/test/Analysis/BasicAA/libfuncs.ll?