Register stackification currently checks VNInfo for changes. Make that
more accurate by testing each intervening instruction for any other defs
to the same virtual register.
Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
lgtm.
lib/Target/WebAssembly/WebAssemblyRegStackify.cpp | ||
---|---|---|
282 ↗ | (On Diff #72576) | Instead of holding MachineOperand*, this could just hold unsigned register numbers, which would simplify some of the code below. Also, this is a good candidate for a SmallVector, with a size of something like 4. |
308 ↗ | (On Diff #72576) | MRI.hasOneDef(Reg) would make this a little clearer than using getUniqueVRegDef. |
317 ↗ | (On Diff #72576) | !MutableOperands.empty() would be a little more concise than .size() > 0. |
317 ↗ | (On Diff #72576) | Ah, the bug is the case where InsVNI is null. The register may not be live at the insert point, however it may still be clobbered between Def and the insert point. It's unfortunate then that LiveIntervals doesn't seem to have a convenient way to ask "is this value clobbered anywhere between here and there" if it isn't already live there. But given that, this was the only use of LIS in this function, so you can remove the LIS argument now too. |
lib/Target/WebAssembly/WebAssemblyRegStackify.cpp | ||
---|---|---|
282 ↗ | (On Diff #72576) | Indeed it does. And I didn't think about SmallVector. Thanks |
308 ↗ | (On Diff #72576) | That it would. |
317 ↗ | (On Diff #72576) | Right, forgot that was a thing. Thanks |
317 ↗ | (On Diff #72576) | Exactly. And, nice catch on the LIS. |
341 ↗ | (On Diff #72576) | Looking at this again, I could reorder this to only loop over the mutable operands if the instruction's operands are defs, which would be slightly more performant. I'll stick with this because it's more readable. |