@@ -88,6 +88,8 @@ bool AllocUseInfo::addMemOp(Instruction *inst, unsigned opno, uint32_t offset,
88
88
memop.isaggr = isa<StructType>(elty) || isa<ArrayType>(elty) || isa<VectorType>(elty);
89
89
memop.isobjref = hasObjref (elty);
90
90
auto &field = getField (offset, size, elty);
91
+ field.second .hasunboxed |= !hasObjref (elty) || (hasObjref (elty) && !isa<PointerType>(elty));
92
+
91
93
if (field.second .hasobjref != memop.isobjref )
92
94
field.second .multiloc = true ; // can't split this field, since it contains a mix of references and bits
93
95
if (!isstore)
@@ -198,6 +200,7 @@ void jl_alloc::runEscapeAnalysis(llvm::CallInst *I, EscapeAnalysisRequiredArgs r
198
200
auto elty = inst->getType ();
199
201
required.use_info .has_unknown_objref |= hasObjref (elty);
200
202
required.use_info .has_unknown_objrefaggr |= hasObjref (elty) && !isa<PointerType>(elty);
203
+ required.use_info .has_unknown_unboxed |= !hasObjref (elty) || (hasObjref (elty) && !isa<PointerType>(elty));
201
204
required.use_info .hasunknownmem = true ;
202
205
} else if (!required.use_info .addMemOp (inst, 0 , cur.offset ,
203
206
inst->getType (),
@@ -289,6 +292,7 @@ void jl_alloc::runEscapeAnalysis(llvm::CallInst *I, EscapeAnalysisRequiredArgs r
289
292
auto elty = storev->getType ();
290
293
required.use_info .has_unknown_objref |= hasObjref (elty);
291
294
required.use_info .has_unknown_objrefaggr |= hasObjref (elty) && !isa<PointerType>(elty);
295
+ required.use_info .has_unknown_unboxed |= !hasObjref (elty) || (hasObjref (elty) && !isa<PointerType>(elty));
292
296
required.use_info .hasunknownmem = true ;
293
297
} else if (!required.use_info .addMemOp (inst, use->getOperandNo (),
294
298
cur.offset , storev->getType (),
@@ -310,10 +314,14 @@ void jl_alloc::runEscapeAnalysis(llvm::CallInst *I, EscapeAnalysisRequiredArgs r
310
314
}
311
315
required.use_info .hasload = true ;
312
316
auto storev = isa<AtomicCmpXchgInst>(inst) ? cast<AtomicCmpXchgInst>(inst)->getNewValOperand () : cast<AtomicRMWInst>(inst)->getValOperand ();
317
+ Type *elty = storev->getType ();
313
318
if (cur.offset == UINT32_MAX || !required.use_info .addMemOp (inst, use->getOperandNo (),
314
- cur.offset , storev-> getType () ,
319
+ cur.offset , elty ,
315
320
true , required.DL )) {
316
321
LLVM_DEBUG (dbgs () << " Atomic inst has unknown offset\n " );
322
+ required.use_info .has_unknown_objref |= hasObjref (elty);
323
+ required.use_info .has_unknown_objrefaggr |= hasObjref (elty) && !isa<PointerType>(elty);
324
+ required.use_info .has_unknown_unboxed |= !hasObjref (elty) || (hasObjref (elty) && !isa<PointerType>(elty));
317
325
required.use_info .hasunknownmem = true ;
318
326
}
319
327
required.use_info .refload = true ;
0 commit comments