@@ -98,18 +98,18 @@ type Node = {
98
98
99
99
// Inclusive start and end
100
100
type References = {
101
- accessedRanges : AccessedRanges ;
101
+ singleUseIdentifiers : SingleUseIdentifiers ;
102
102
lastAssignments : LastAssignments ;
103
103
} ;
104
104
type LastAssignments = Map < string , InstructionId > ;
105
- type AccessedRanges = Map < IdentifierId , Range > ;
105
+ type SingleUseIdentifiers = Set < IdentifierId > ;
106
106
type Range = { start : InstructionId ; end : InstructionId } ;
107
107
enum ReferenceKind {
108
108
Read ,
109
109
Write ,
110
110
}
111
111
function findReferencedRangeOfTemporaries ( fn : HIRFunction ) : References {
112
- const accessedRanges : AccessedRanges = new Map ( ) ;
112
+ const singleUseIdentifiers = new Map < IdentifierId , number > ( ) ;
113
113
const lastAssignments : LastAssignments = new Map ( ) ;
114
114
function reference (
115
115
instr : InstructionId ,
@@ -134,15 +134,8 @@ function findReferencedRangeOfTemporaries(fn: HIRFunction): References {
134
134
}
135
135
return ;
136
136
} else if ( kind === ReferenceKind . Read ) {
137
- const range = getOrInsertWith (
138
- accessedRanges ,
139
- place . identifier . id ,
140
- ( ) => ( {
141
- start : instr ,
142
- end : instr ,
143
- } )
144
- ) ;
145
- range . end = instr ;
137
+ const previousCount = singleUseIdentifiers . get ( place . identifier . id ) ?? 0 ;
138
+ singleUseIdentifiers . set ( place . identifier . id , previousCount + 1 ) ;
146
139
}
147
140
}
148
141
for ( const [ , block ] of fn . body . blocks ) {
@@ -158,7 +151,14 @@ function findReferencedRangeOfTemporaries(fn: HIRFunction): References {
158
151
reference ( block . terminal . id , operand , ReferenceKind . Read ) ;
159
152
}
160
153
}
161
- return { accessedRanges, lastAssignments } ;
154
+ return {
155
+ singleUseIdentifiers : new Set (
156
+ [ ...singleUseIdentifiers ]
157
+ . filter ( ( [ , count ] ) => count === 1 )
158
+ . map ( ( [ id ] ) => id )
159
+ ) ,
160
+ lastAssignments,
161
+ } ;
162
162
}
163
163
164
164
function reorderBlock (
@@ -485,12 +485,10 @@ function getReorderability(
485
485
const name = instr . value . place . identifier . name ;
486
486
if ( name !== null && name . kind === "named" ) {
487
487
const lastAssignment = references . lastAssignments . get ( name . value ) ;
488
- const range = references . accessedRanges . get ( instr . lvalue . identifier . id ) ;
489
488
if (
490
489
lastAssignment !== undefined &&
491
490
lastAssignment < instr . id &&
492
- range !== undefined &&
493
- range . end === range . start // this LoadLocal is used exactly once
491
+ references . singleUseIdentifiers . has ( instr . lvalue . identifier . id )
494
492
) {
495
493
return Reorderability . Reorderable ;
496
494
}
0 commit comments