aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/ExtractAPI/API.cpp
diff options
context:
space:
mode:
authorAhmed Bougacha <ahmed@bougacha.org>2022-04-12 09:23:11 -0700
committerAhmed Bougacha <ahmed@bougacha.org>2022-04-12 10:34:54 -0700
commitcfa4fe7c51870fe6b480d541938f556cf0736fa2 (patch)
tree96a2ce5e234f8145514b7ccd832de00853bc3510 /clang/lib/ExtractAPI/API.cpp
parentf3e76dcae3dc6fff5e0d3d0932a1287c9337466c (diff)
downloadllvm-cfa4fe7c51870fe6b480d541938f556cf0736fa2.zip
llvm-cfa4fe7c51870fe6b480d541938f556cf0736fa2.tar.gz
llvm-cfa4fe7c51870fe6b480d541938f556cf0736fa2.tar.bz2
[AArch64][LOH] Don't ignore regmasks in bundles by iterating over instrs.
The LOH pass iterates over instructions to build its custom register state machine, but it uses the top-level bundle iterator. This should be okay, because when the wrapper BUNDLE MI is built, it aggregates the register defs/uses in its instructions into MOs. However, that doesn't apply to regmasks, and accumulating regmasks across multiple instructions would be messy business. There are a couple AnalyzePhysRegInBundle (/Virt) helpers that do look at regmasks, but those don't fit in very well here. AArch64 has started to use a few bundle instructions, specifically as glorified pseudos for variant call instructions, which have regmasks. So the LOH pass ends up ignoring regmasks. Concretely, this has been wrong for a while, but, on aarch64, the most common bundle (rv_marker call) was always followed by the attached call instruction, a plain BL with a regmask. Which was properly detected by the pass. However, we recently started keeping the attached call in the bundle, so the regmask is now ignored. And the pass happily combines ADRPs, of say, x8, across the bundle, resulting in corrupt pointers later.
Diffstat (limited to 'clang/lib/ExtractAPI/API.cpp')
0 files changed, 0 insertions, 0 deletions