diff options
author | Craig Topper <craig.topper@sifive.com> | 2024-04-24 12:31:14 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-24 12:31:14 -0700 |
commit | fc538b070de69315fe05105e8c0bc622fb61168a (patch) | |
tree | 7a9d7d19fa1b12ebc78de5305ba33266c65530f6 /clang/lib/CodeGen/CodeGenFunction.h | |
parent | 03bb10dfb3725ec2c31fb66deede96d066f2b49a (diff) | |
download | llvm-fc538b070de69315fe05105e8c0bc622fb61168a.zip llvm-fc538b070de69315fe05105e8c0bc622fb61168a.tar.gz llvm-fc538b070de69315fe05105e8c0bc622fb61168a.tar.bz2 |
[SelectionDAG] Pass SDVTList instead of VTs to *SDNode constructors. NFC (#89880)
All of these constructors were creating a SDVTList using an EVT* created
by SDNode::getValueTypeList. This EVT needs to live at least as long as
the SDNode that uses it. To do this, SDNode::getValueTypeList contains
several function scoped static variables that hold the memory for the
EVT. So the EVT lives until global destructors run.
This is problematic since an EVT contains a Type* that points to memory
allocated by an LLVMContext. If multiple LLVMContexts are used that
don't have overlapping lifetimes, we can end up with stale or or
incorrect pointers cached in the EVTs owned by SDNode::getValueTypeList.
I want to try to make the EVTs be owned by SelectionDAG instead. This is
already done for SDVTLists with more than 1 VT. The single value case is
a very old optimizaton that should be re-evaluated. In order to do this,
I need the SDVTLists to be created by SelectionDAG rather than by the
SDNode itself.
This patch doesn't change how the allocation is done yet. It just moves
the code around.
This patch does reduce the number of calls to getVTList since we now
share with the call needed for the SDNode FoldingSet.
Part of fixing #88233.
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.h')
0 files changed, 0 insertions, 0 deletions