Skip to content

Commit af9a452

Browse files
committed
[llvm][codegen] Fix non-determinism in StackFrameLayoutAnalysisPass output
We were iterating over a SmallPtrSet when outputting slot variables. This is still correct but made the test fail under reverse iteration. This patch replaces the SmallPtrSet with a SmallVector. Also remove the "Stack Frame Layout" lines from arm64-opt-remarks-lazy-bfi test, since those also break under reverse iteration. Reviewed By: nickdesaulniers Differential Revision: https://reviews.llvm.org/D142127
1 parent 887240f commit af9a452

File tree

2 files changed

+5
-20
lines changed

2 files changed

+5
-20
lines changed

llvm/lib/CodeGen/StackFrameLayoutAnalysisPass.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
//
1717
//===----------------------------------------------------------------------===//
1818

19+
#include "llvm/ADT/SetVector.h"
1920
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
2021
#include "llvm/CodeGen/MachineFrameInfo.h"
2122
#include "llvm/CodeGen/MachineFunction.h"
@@ -45,8 +46,7 @@ namespace {
4546
/// MachineFunction.
4647
///
4748
struct StackFrameLayoutAnalysisPass : public MachineFunctionPass {
48-
using SlotDbgMap =
49-
SmallDenseMap<int, SmallPtrSet<const DILocalVariable *, 4>>;
49+
using SlotDbgMap = SmallDenseMap<int, SetVector<const DILocalVariable *>>;
5050
static char ID;
5151

5252
enum SlotType {
@@ -180,18 +180,15 @@ struct StackFrameLayoutAnalysisPass : public MachineFunctionPass {
180180
<< MFI.getStackProtectorIndex() << "\n");
181181

182182
std::vector<SlotData> SlotInfo;
183-
SmallDenseMap<int, int> SlotOffsetMap;
184183

185184
const unsigned int NumObj = MFI.getNumObjects();
186185
SlotInfo.reserve(NumObj);
187-
SlotOffsetMap.reserve(NumObj);
188186
// initialize slot info
189187
for (int Idx = MFI.getObjectIndexBegin(), EndIdx = MFI.getObjectIndexEnd();
190188
Idx != EndIdx; ++Idx) {
191189
if (MFI.isDeadObjectIndex(Idx))
192190
continue;
193-
auto &Inserted = SlotInfo.emplace_back(MFI, ValOffset, Idx);
194-
SlotOffsetMap[Inserted.Slot] = Inserted.Offset;
191+
SlotInfo.emplace_back(MFI, ValOffset, Idx);
195192
}
196193

197194
// sort the ordering, to match the actual layout in memory

llvm/test/CodeGen/AArch64/arm64-opt-remarks-lazy-bfi.ll

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,7 @@
3838
; HOTNESS-NEXT: Freeing Pass 'Insert CFI remember/restore state instructions' on Function 'empty_func'
3939
; HOTNESS-NEXT: Executing Pass 'Verify generated machine code'
4040
; HOTNESS-NEXT: Freeing Pass 'Verify generated machine code'
41-
; HOTNESS-NEXT: Executing Pass 'Lazy Machine Block Frequency Analysis'
42-
; HOTNESS-NEXT: Executing Pass 'Machine Optimization Remark Emitter'
43-
; HOTNESS: Executing Pass 'Stack Frame Layout Analysis'
44-
; HOTNESS-NEXT: Freeing Pass 'Machine Optimization Remark Emitter'
45-
; HOTNESS-NEXT: Freeing Pass 'Lazy Machine Block Frequency Analysis'
46-
; HOTNESS-NEXT: Freeing Pass 'Stack Frame Layout Analysis'
47-
; HOTNESS-NEXT: Executing Pass 'Unpack machine instruction bundles'
41+
; HOTNESS: Executing Pass 'Unpack machine instruction bundles'
4842
; HOTNESS-NEXT: Freeing Pass 'Unpack machine instruction bundles'
4943
; HOTNESS-NEXT: Executing Pass 'Verify generated machine code'
5044
; HOTNESS-NEXT: Freeing Pass 'Verify generated machine code'
@@ -69,13 +63,7 @@
6963
; NO_HOTNESS-NEXT: Freeing Pass 'Insert CFI remember/restore state instructions' on Function 'empty_func'
7064
; NO_HOTNESS-NEXT: Executing Pass 'Verify generated machine code'
7165
; NO_HOTNESS-NEXT: Freeing Pass 'Verify generated machine code'
72-
; NO_HOTNESS-NEXT: Executing Pass 'Lazy Machine Block Frequency Analysis'
73-
; NO_HOTNESS-NEXT: Executing Pass 'Machine Optimization Remark Emitter'
74-
; NO_HOTNESS: Executing Pass 'Stack Frame Layout Analysis'
75-
; NO_HOTNESS-NEXT: Freeing Pass 'Machine Optimization Remark Emitter'
76-
; NO_HOTNESS-NEXT: Freeing Pass 'Lazy Machine Block Frequency Analysis'
77-
; NO_HOTNESS-NEXT: Freeing Pass 'Stack Frame Layout Analysis'
78-
; NO_HOTNESS-NEXT: Executing Pass 'Unpack machine instruction bundles'
66+
; NO_HOTNESS: Executing Pass 'Unpack machine instruction bundles'
7967
; NO_HOTNESS-NEXT: Freeing Pass 'Unpack machine instruction bundles'
8068
; NO_HOTNESS-NEXT: Executing Pass 'Verify generated machine code'
8169
; NO_HOTNESS-NEXT: Freeing Pass 'Verify generated machine code'

0 commit comments

Comments
 (0)