@@ -193,6 +193,46 @@ private module Cached {
193
193
)
194
194
}
195
195
196
+ /** Holds if `operand`'s definition is a `VariableAddressInstruction` whose variable is a temporary */
197
+ private predicate isIRTempVariable ( Operand operand ) {
198
+ operand .getDef ( ) .( VariableAddressInstruction ) .getIRVariable ( ) instanceof IRTempVariable
199
+ }
200
+
201
+ /**
202
+ * Holds if `node` is an indirect operand whose operand is an argument, and
203
+ * the `n`'th expression associated with the operand is `e`.
204
+ */
205
+ private predicate isIndirectOperandOfArgument (
206
+ IndirectOperand node , ArgumentOperand operand , Expr e , int n
207
+ ) {
208
+ node .hasOperandAndIndirectionIndex ( operand , 1 ) and
209
+ e = getConvertedResultExpression ( operand .getDef ( ) , n )
210
+ }
211
+
212
+ /**
213
+ * Holds if `opFrom` is an operand to a conversion, and `opTo` is the unique
214
+ * use of the conversion.
215
+ */
216
+ private predicate isConversionStep ( Operand opFrom , Operand opTo ) {
217
+ exists ( Instruction mid |
218
+ conversionFlow ( opFrom , mid , false , false ) and
219
+ opTo = unique( | | getAUse ( mid ) )
220
+ )
221
+ }
222
+
223
+ /**
224
+ * Holds if an operand that satisfies `isIRTempVariable` flows to `op`
225
+ * through a (possibly empty) sequence of conversions.
226
+ */
227
+ private predicate irTempOperandConversionFlows ( Operand op ) {
228
+ isIRTempVariable ( op )
229
+ or
230
+ exists ( Operand mid |
231
+ irTempOperandConversionFlows ( mid ) and
232
+ isConversionStep ( mid , op )
233
+ )
234
+ }
235
+
196
236
/** Holds if `node` should be an `IndirectOperand` that maps `node.asExpr()` to `e`. */
197
237
private predicate exprNodeShouldBeIndirectOperand ( IndirectOperand node , Expr e , int n ) {
198
238
exists ( ArgumentOperand operand |
@@ -203,9 +243,8 @@ private module Cached {
203
243
// result. However, the instruction actually represents the _address_ of
204
244
// the argument. So to fix this mismatch, we have the indirection of the
205
245
// `VariableAddressInstruction` map to the expression.
206
- node .hasOperandAndIndirectionIndex ( operand , 1 ) and
207
- e = getConvertedResultExpression ( operand .getDef ( ) , n ) and
208
- operand .getDef ( ) .( VariableAddressInstruction ) .getIRVariable ( ) instanceof IRTempVariable
246
+ isIndirectOperandOfArgument ( node , operand , e , n ) and
247
+ irTempOperandConversionFlows ( operand )
209
248
)
210
249
}
211
250
0 commit comments