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