Skip to content

Commit 2a9648e

Browse files
author
Jenkins
committed
merge main into amd-stg-open
Change-Id: I23e3c30f7ff624881f380b7c58010eab434edecd
2 parents 5c95caf + c98b3a8 commit 2a9648e

File tree

26 files changed

+1119
-410
lines changed

26 files changed

+1119
-410
lines changed

clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,6 @@ bool hasLoopStmtAncestor(const DeclRefExpr &DeclRef, const Decl &Decl,
5151
return Matches.empty();
5252
}
5353

54-
bool isExplicitTemplateSpecialization(const FunctionDecl &Function) {
55-
if (const auto *SpecializationInfo = Function.getTemplateSpecializationInfo())
56-
if (SpecializationInfo->getTemplateSpecializationKind() ==
57-
TSK_ExplicitSpecialization)
58-
return true;
59-
if (const auto *Method = llvm::dyn_cast<CXXMethodDecl>(&Function))
60-
if (Method->getTemplatedKind() == FunctionDecl::TK_MemberSpecialization &&
61-
Method->getMemberSpecializationInfo()->isExplicitSpecialization())
62-
return true;
63-
return false;
64-
}
65-
6654
} // namespace
6755

6856
UnnecessaryValueParamCheck::UnnecessaryValueParamCheck(
@@ -147,11 +135,12 @@ void UnnecessaryValueParamCheck::check(const MatchFinder::MatchResult &Result) {
147135
// 2. the function is virtual as it might break overrides
148136
// 3. the function is referenced outside of a call expression within the
149137
// compilation unit as the signature change could introduce build errors.
150-
// 4. the function is an explicit template specialization.
138+
// 4. the function is a primary template or an explicit template
139+
// specialization.
151140
const auto *Method = llvm::dyn_cast<CXXMethodDecl>(Function);
152141
if (Param->getBeginLoc().isMacroID() || (Method && Method->isVirtual()) ||
153142
isReferencedOutsideOfCallExpr(*Function, *Result.Context) ||
154-
isExplicitTemplateSpecialization(*Function))
143+
(Function->getTemplatedKind() != FunctionDecl::TK_NonTemplate))
155144
return;
156145
for (const auto *FunctionDecl = Function; FunctionDecl != nullptr;
157146
FunctionDecl = FunctionDecl->getPreviousDecl()) {

clang-tools-extra/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ Changes in existing checks
202202
<clang-tidy/checks/readability-simplify-boolean-expr>` to simplify expressions
203203
using DeMorgan's Theorem.
204204

205+
- Fixed a crash in :doc:`performance-unnecessary-value-param
206+
<clang-tidy/checks/readability-suspicious-call-argument>` when the specialization
207+
template has an unnecessary value paramter. Removed the fix for a template.
208+
205209
Removed checks
206210
^^^^^^^^^^^^^^
207211

clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param-delayed.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ struct PositiveConstValueConstructor {
6969

7070
template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType S, T V) {
7171
// CHECK-MESSAGES: [[@LINE-1]]:90: warning: the const qualified parameter 'S'
72-
// CHECK-FIXES: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
72+
// CHECK-FIXES-NOT: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
7373
}
7474

7575
void instantiated() {

clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %check_clang_tidy %s performance-unnecessary-value-param %t
1+
// RUN: %check_clang_tidy %s performance-unnecessary-value-param %t -- -- -fno-delayed-template-parsing
22

33
// CHECK-FIXES: #include <utility>
44

@@ -109,7 +109,7 @@ struct PositiveConstValueConstructor {
109109

110110
template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType S, T V) {
111111
// CHECK-MESSAGES: [[@LINE-1]]:90: warning: the const qualified parameter 'S'
112-
// CHECK-FIXES: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
112+
// CHECK-FIXES-NOT: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
113113
}
114114

115115
void instantiated() {
@@ -381,3 +381,24 @@ void templateFunction<ExpensiveToCopyType>(ExpensiveToCopyType E) {
381381
// CHECK-FIXES: void templateFunction<ExpensiveToCopyType>(ExpensiveToCopyType E) {
382382
E.constReference();
383383
}
384+
385+
template <class T>
386+
T templateSpecializationFunction(ExpensiveToCopyType E) {
387+
// CHECK-MESSAGES: [[@LINE-1]]:54: warning: the parameter 'E' is copied
388+
// CHECK-FIXES-NOT: T templateSpecializationFunction(const ExpensiveToCopyType& E) {
389+
return T();
390+
}
391+
392+
template <>
393+
bool templateSpecializationFunction(ExpensiveToCopyType E) {
394+
// CHECK-MESSAGES: [[@LINE-1]]:57: warning: the parameter 'E' is copied
395+
// CHECK-FIXES-NOT: bool templateSpecializationFunction(const ExpensiveToCopyType& E) {
396+
return true;
397+
}
398+
399+
template <>
400+
int templateSpecializationFunction(ExpensiveToCopyType E) {
401+
// CHECK-MESSAGES: [[@LINE-1]]:56: warning: the parameter 'E' is copied
402+
// CHECK-FIXES-NOT: int templateSpecializationFunction(const ExpensiveToCopyType& E) {
403+
return 0;
404+
}

libcxx/test/std/utilities/meta/meta.unary/meta.unary.prop/is_default_constructible.pass.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,21 +106,11 @@ int main(int, char**)
106106
#if TEST_STD_VER >= 11
107107
test_is_not_default_constructible<B>();
108108
test_is_not_default_constructible<int&&>();
109-
110-
// TODO: Remove this workaround once Clang <= 3.7 are no longer used regularly.
111-
// In those compiler versions the __is_constructible builtin gives the wrong
112-
// results for abominable function types.
113-
#if (defined(TEST_APPLE_CLANG_VER) && TEST_APPLE_CLANG_VER < 703) \
114-
|| (defined(TEST_CLANG_VER) && TEST_CLANG_VER < 308)
115-
#define WORKAROUND_CLANG_BUG
116-
#endif
117-
#if !defined(WORKAROUND_CLANG_BUG)
118109
test_is_not_default_constructible<void()>();
119110
test_is_not_default_constructible<void() const> ();
120111
test_is_not_default_constructible<void() volatile> ();
121112
test_is_not_default_constructible<void() &> ();
122113
test_is_not_default_constructible<void() &&> ();
123-
#endif
124114
#endif
125115

126116
return 0;

llvm/docs/LangRef.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17998,7 +17998,7 @@ Example:
1799817998
;; Lanes at and above %pivot are taken from %on_false
1799917999
%atfirst = insertelement <4 x i32> undef, i32 %pivot, i32 0
1800018000
%splat = shufflevector <4 x i32> %atfirst, <4 x i32> poison, <4 x i32> zeroinitializer
18001-
%pivotmask = icmp ult <4 x i32> %splat, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
18001+
%pivotmask = icmp ult <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32> %splat
1800218002
%mergemask = and <4 x i1> %cond, <4 x i1> %pivotmask
1800318003
%also.r = select <4 x i1> %mergemask, <4 x i32> %on_true, <4 x i32> %on_false
1800418004

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15147,6 +15147,11 @@ static SDValue tryCombineFixedPointConvert(SDNode *N,
1514715147
// It also supports immediate DUP-like nodes (MOVI/MVNi), which we can fold
1514815148
// similarly here.
1514915149
static SDValue tryExtendDUPToExtractHigh(SDValue N, SelectionDAG &DAG) {
15150+
MVT VT = N.getSimpleValueType();
15151+
if (N.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
15152+
N.getConstantOperandVal(1) == 0)
15153+
N = N.getOperand(0);
15154+
1515015155
switch (N.getOpcode()) {
1515115156
case AArch64ISD::DUP:
1515215157
case AArch64ISD::DUPLANE8:
@@ -15167,18 +15172,19 @@ static SDValue tryExtendDUPToExtractHigh(SDValue N, SelectionDAG &DAG) {
1516715172
return SDValue();
1516815173
}
1516915174

15170-
MVT NarrowTy = N.getSimpleValueType();
15171-
if (!NarrowTy.is64BitVector())
15175+
if (!VT.is64BitVector())
1517215176
return SDValue();
1517315177

15174-
MVT ElementTy = NarrowTy.getVectorElementType();
15175-
unsigned NumElems = NarrowTy.getVectorNumElements();
15176-
MVT NewVT = MVT::getVectorVT(ElementTy, NumElems * 2);
15178+
SDLoc DL(N);
15179+
unsigned NumElems = VT.getVectorNumElements();
15180+
if (N.getValueType().is64BitVector()) {
15181+
MVT ElementTy = VT.getVectorElementType();
15182+
MVT NewVT = MVT::getVectorVT(ElementTy, NumElems * 2);
15183+
N = DAG.getNode(N->getOpcode(), DL, NewVT, N->ops());
15184+
}
1517715185

15178-
SDLoc dl(N);
15179-
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NarrowTy,
15180-
DAG.getNode(N->getOpcode(), dl, NewVT, N->ops()),
15181-
DAG.getConstant(NumElems, dl, MVT::i64));
15186+
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, N,
15187+
DAG.getConstant(NumElems, DL, MVT::i64));
1518215188
}
1518315189

1518415190
static bool isEssentiallyExtractHighSubvector(SDValue N) {
@@ -18225,6 +18231,24 @@ static SDValue performSelectCombine(SDNode *N,
1822518231
return DAG.getSelect(DL, ResVT, Mask, N->getOperand(1), N->getOperand(2));
1822618232
}
1822718233

18234+
static SDValue performDUPCombine(SDNode *N,
18235+
TargetLowering::DAGCombinerInfo &DCI) {
18236+
EVT VT = N->getValueType(0);
18237+
// If "v2i32 DUP(x)" and "v4i32 DUP(x)" both exist, use an extract from the
18238+
// 128bit vector version.
18239+
if (VT.is64BitVector() && DCI.isAfterLegalizeDAG()) {
18240+
EVT LVT = VT.getDoubleNumVectorElementsVT(*DCI.DAG.getContext());
18241+
if (SDNode *LN = DCI.DAG.getNodeIfExists(
18242+
N->getOpcode(), DCI.DAG.getVTList(LVT), {N->getOperand(0)})) {
18243+
SDLoc DL(N);
18244+
return DCI.DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, SDValue(LN, 0),
18245+
DCI.DAG.getConstant(0, DL, MVT::i64));
18246+
}
18247+
}
18248+
18249+
return performPostLD1Combine(N, DCI, false);
18250+
}
18251+
1822818252
/// Get rid of unnecessary NVCASTs (that don't change the type).
1822918253
static SDValue performNVCASTCombine(SDNode *N) {
1823018254
if (N->getValueType(0) == N->getOperand(0).getValueType())
@@ -18948,7 +18972,7 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
1894818972
case AArch64ISD::CSEL:
1894918973
return performCSELCombine(N, DCI, DAG);
1895018974
case AArch64ISD::DUP:
18951-
return performPostLD1Combine(N, DCI, false);
18975+
return performDUPCombine(N, DCI);
1895218976
case AArch64ISD::NVCAST:
1895318977
return performNVCASTCombine(N);
1895418978
case AArch64ISD::SPLICE:

llvm/lib/Target/RISCV/RISCVInstrInfoZb.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,14 @@ def : Pat<(i64 (add (and (shl GPR:$rs1, (i64 2)), 0x3FFFFFFFF), non_imm12:$rs2))
11741174
(SH2ADD_UW GPR:$rs1, GPR:$rs2)>;
11751175
def : Pat<(i64 (add (and (shl GPR:$rs1, (i64 3)), 0x7FFFFFFFF), non_imm12:$rs2)),
11761176
(SH3ADD_UW GPR:$rs1, GPR:$rs2)>;
1177+
1178+
// Use SRLI to clear the LSBs and SHXADD_UW to mask and shift.
1179+
def : Pat<(i64 (add (and GPR:$rs1, 0x1FFFFFFFE), non_imm12:$rs2)),
1180+
(SH1ADD_UW (SRLI GPR:$rs1, 1), GPR:$rs2)>;
1181+
def : Pat<(i64 (add (and GPR:$rs1, 0x3FFFFFFFC), non_imm12:$rs2)),
1182+
(SH2ADD_UW (SRLI GPR:$rs1, 2), GPR:$rs2)>;
1183+
def : Pat<(i64 (add (and GPR:$rs1, 0x7FFFFFFF8), non_imm12:$rs2)),
1184+
(SH3ADD_UW (SRLI GPR:$rs1, 3), GPR:$rs2)>;
11771185
} // Predicates = [HasStdExtZba, IsRV64]
11781186

11791187
let Predicates = [HasStdExtZbcOrZbkc] in {

llvm/lib/Target/X86/X86ScheduleZnver1.td

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -398,14 +398,17 @@ defm : X86WriteRes<WriteVecMoveToGpr, [ZnFPU2], 2, [1], 1>;
398398
defm : X86WriteRes<WriteVecMoveFromGpr, [ZnFPU2], 3, [1], 1>;
399399
defm : X86WriteRes<WriteEMMS, [ZnFPU], 2, [1], 1>;
400400

401-
defm : ZnWriteResFpuPair<WriteVecShift, [ZnFPU], 1>;
401+
defm : ZnWriteResFpuPair<WriteVecShift, [ZnFPU2], 1>;
402402
defm : ZnWriteResFpuPair<WriteVecShiftX, [ZnFPU2], 1>;
403-
defm : ZnWriteResFpuPair<WriteVecShiftY, [ZnFPU2], 2>;
403+
defm : ZnWriteResFpuPair<WriteVecShiftY, [ZnFPU2], 1, [2], 2>;
404404
defm : X86WriteResPairUnsupported<WriteVecShiftZ>;
405-
defm : ZnWriteResFpuPair<WriteVecShiftImm, [ZnFPU], 1>;
406-
defm : ZnWriteResFpuPair<WriteVecShiftImmX, [ZnFPU], 1>;
407-
defm : ZnWriteResFpuPair<WriteVecShiftImmY, [ZnFPU], 1>;
405+
defm : ZnWriteResFpuPair<WriteVecShiftImm, [ZnFPU2], 1>;
406+
defm : ZnWriteResFpuPair<WriteVecShiftImmX, [ZnFPU2], 1>;
407+
defm : ZnWriteResFpuPair<WriteVecShiftImmY, [ZnFPU2], 1, [2], 2>;
408408
defm : X86WriteResPairUnsupported<WriteVecShiftImmZ>;
409+
defm : ZnWriteResFpuPair<WriteVarVecShift, [ZnFPU1], 3, [2], 1>;
410+
defm : ZnWriteResFpuPair<WriteVarVecShiftY, [ZnFPU1], 3, [4], 2>;
411+
defm : X86WriteResPairUnsupported<WriteVarVecShiftZ>;
409412
defm : ZnWriteResFpuPair<WriteVecLogic, [ZnFPU], 1>;
410413
defm : ZnWriteResFpuPair<WriteVecLogicX, [ZnFPU], 1>;
411414
defm : ZnWriteResFpuPair<WriteVecLogicY, [ZnFPU], 1>;
@@ -444,11 +447,6 @@ defm : ZnWriteResFpuPair<WritePSADBWY, [ZnFPU0], 3>;
444447
defm : X86WriteResPairUnsupported<WritePSADBWZ>;
445448
defm : ZnWriteResFpuPair<WritePHMINPOS, [ZnFPU0], 4>;
446449

447-
// Vector Shift Operations
448-
defm : ZnWriteResFpuPair<WriteVarVecShift, [ZnFPU12], 1>;
449-
defm : ZnWriteResFpuPair<WriteVarVecShiftY, [ZnFPU12], 1>;
450-
defm : X86WriteResPairUnsupported<WriteVarVecShiftZ>;
451-
452450
// Vector insert/extract operations.
453451
defm : ZnWriteResFpuPair<WriteVecInsert, [ZnFPU], 1>;
454452

llvm/lib/Target/X86/X86ScheduleZnver2.td

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -393,14 +393,17 @@ defm : X86WriteRes<WriteVecMoveToGpr, [Zn2FPU2], 2, [1], 1>;
393393
defm : X86WriteRes<WriteVecMoveFromGpr, [Zn2FPU2], 3, [1], 1>;
394394
defm : X86WriteRes<WriteEMMS, [Zn2FPU], 2, [1], 1>;
395395

396-
defm : Zn2WriteResFpuPair<WriteVecShift, [Zn2FPU], 1>;
396+
defm : Zn2WriteResFpuPair<WriteVecShift, [Zn2FPU2], 1>;
397397
defm : Zn2WriteResFpuPair<WriteVecShiftX, [Zn2FPU2], 1>;
398398
defm : Zn2WriteResFpuPair<WriteVecShiftY, [Zn2FPU2], 1>;
399399
defm : X86WriteResPairUnsupported<WriteVecShiftZ>;
400-
defm : Zn2WriteResFpuPair<WriteVecShiftImm, [Zn2FPU], 1>;
401-
defm : Zn2WriteResFpuPair<WriteVecShiftImmX, [Zn2FPU], 1>;
402-
defm : Zn2WriteResFpuPair<WriteVecShiftImmY, [Zn2FPU], 1>;
400+
defm : Zn2WriteResFpuPair<WriteVecShiftImm, [Zn2FPU2], 1>;
401+
defm : Zn2WriteResFpuPair<WriteVecShiftImmX, [Zn2FPU2], 1>;
402+
defm : Zn2WriteResFpuPair<WriteVecShiftImmY, [Zn2FPU2], 1>;
403403
defm : X86WriteResPairUnsupported<WriteVecShiftImmZ>;
404+
defm : Zn2WriteResFpuPair<WriteVarVecShift, [Zn2FPU1], 3, [2], 1>;
405+
defm : Zn2WriteResFpuPair<WriteVarVecShiftY, [Zn2FPU1], 3, [2], 1>;
406+
defm : X86WriteResPairUnsupported<WriteVarVecShiftZ>;
404407
defm : Zn2WriteResFpuPair<WriteVecLogic, [Zn2FPU], 1>;
405408
defm : Zn2WriteResFpuPair<WriteVecLogicX, [Zn2FPU], 1>;
406409
defm : Zn2WriteResFpuPair<WriteVecLogicY, [Zn2FPU], 1>;
@@ -439,11 +442,6 @@ defm : Zn2WriteResFpuPair<WritePSADBWY, [Zn2FPU0], 3>;
439442
defm : X86WriteResPairUnsupported<WritePSADBWZ>;
440443
defm : Zn2WriteResFpuPair<WritePHMINPOS, [Zn2FPU0], 4>;
441444

442-
// Vector Shift Operations
443-
defm : Zn2WriteResFpuPair<WriteVarVecShift, [Zn2FPU12], 3>;
444-
defm : Zn2WriteResFpuPair<WriteVarVecShiftY, [Zn2FPU12], 3>;
445-
defm : X86WriteResPairUnsupported<WriteVarVecShiftZ>;
446-
447445
// Vector insert/extract operations.
448446
defm : Zn2WriteResFpuPair<WriteVecInsert, [Zn2FPU], 1>;
449447

llvm/lib/Transforms/Scalar/LICM.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,6 +1959,7 @@ bool llvm::promoteLoopAccessesToScalars(
19591959

19601960
bool DereferenceableInPH = false;
19611961
bool SafeToInsertStore = false;
1962+
bool StoreIsGuanteedToExecute = false;
19621963
bool FoundLoadToPromote = false;
19631964

19641965
SmallVector<Instruction *, 64> LoopUses;
@@ -2039,10 +2040,12 @@ bool llvm::promoteLoopAccessesToScalars(
20392040
// alignment than any other guaranteed stores, in which case we can
20402041
// raise the alignment on the promoted store.
20412042
Align InstAlignment = Store->getAlign();
2042-
2043+
bool GuaranteedToExecute =
2044+
SafetyInfo->isGuaranteedToExecute(*UI, DT, CurLoop);
2045+
StoreIsGuanteedToExecute |= GuaranteedToExecute;
20432046
if (!DereferenceableInPH || !SafeToInsertStore ||
20442047
(InstAlignment > Alignment)) {
2045-
if (SafetyInfo->isGuaranteedToExecute(*UI, DT, CurLoop)) {
2048+
if (GuaranteedToExecute) {
20462049
DereferenceableInPH = true;
20472050
SafeToInsertStore = true;
20482051
Alignment = std::max(Alignment, InstAlignment);
@@ -2156,21 +2159,26 @@ bool llvm::promoteLoopAccessesToScalars(
21562159

21572160
// Set up the preheader to have a definition of the value. It is the live-out
21582161
// value from the preheader that uses in the loop will use.
2159-
LoadInst *PreheaderLoad = new LoadInst(
2160-
AccessTy, SomePtr, SomePtr->getName() + ".promoted",
2161-
Preheader->getTerminator());
2162-
if (SawUnorderedAtomic)
2163-
PreheaderLoad->setOrdering(AtomicOrdering::Unordered);
2164-
PreheaderLoad->setAlignment(Alignment);
2165-
PreheaderLoad->setDebugLoc(DebugLoc());
2166-
if (AATags)
2167-
PreheaderLoad->setAAMetadata(AATags);
2168-
SSA.AddAvailableValue(Preheader, PreheaderLoad);
2169-
2170-
MemoryAccess *PreheaderLoadMemoryAccess = MSSAU.createMemoryAccessInBB(
2171-
PreheaderLoad, nullptr, PreheaderLoad->getParent(), MemorySSA::End);
2172-
MemoryUse *NewMemUse = cast<MemoryUse>(PreheaderLoadMemoryAccess);
2173-
MSSAU.insertUse(NewMemUse, /*RenameUses=*/true);
2162+
LoadInst *PreheaderLoad = nullptr;
2163+
if (FoundLoadToPromote || !StoreIsGuanteedToExecute) {
2164+
PreheaderLoad =
2165+
new LoadInst(AccessTy, SomePtr, SomePtr->getName() + ".promoted",
2166+
Preheader->getTerminator());
2167+
if (SawUnorderedAtomic)
2168+
PreheaderLoad->setOrdering(AtomicOrdering::Unordered);
2169+
PreheaderLoad->setAlignment(Alignment);
2170+
PreheaderLoad->setDebugLoc(DebugLoc());
2171+
if (AATags)
2172+
PreheaderLoad->setAAMetadata(AATags);
2173+
2174+
MemoryAccess *PreheaderLoadMemoryAccess = MSSAU.createMemoryAccessInBB(
2175+
PreheaderLoad, nullptr, PreheaderLoad->getParent(), MemorySSA::End);
2176+
MemoryUse *NewMemUse = cast<MemoryUse>(PreheaderLoadMemoryAccess);
2177+
MSSAU.insertUse(NewMemUse, /*RenameUses=*/true);
2178+
SSA.AddAvailableValue(Preheader, PreheaderLoad);
2179+
} else {
2180+
SSA.AddAvailableValue(Preheader, PoisonValue::get(AccessTy));
2181+
}
21742182

21752183
if (VerifyMemorySSA)
21762184
MSSAU.getMemorySSA()->verifyMemorySSA();
@@ -2181,7 +2189,7 @@ bool llvm::promoteLoopAccessesToScalars(
21812189
if (VerifyMemorySSA)
21822190
MSSAU.getMemorySSA()->verifyMemorySSA();
21832191
// If the SSAUpdater didn't use the load in the preheader, just zap it now.
2184-
if (PreheaderLoad->use_empty())
2192+
if (PreheaderLoad && PreheaderLoad->use_empty())
21852193
eraseInstruction(*PreheaderLoad, *SafetyInfo, MSSAU);
21862194

21872195
return true;

0 commit comments

Comments
 (0)