@@ -88,6 +88,9 @@ bool AllocUseInfo::addMemOp(Instruction *inst, unsigned opno, uint32_t offset,
8888 memop.isaggr = isa<StructType>(elty) || isa<ArrayType>(elty) || isa<VectorType>(elty);
8989 memop.isobjref = hasObjref (elty);
9090 auto &field = getField (offset, size, elty);
91+
92+ field.second .hasbits |= !hasObjref (elty) || (hasObjref (elty) && !isa<PointerType>(elty));
93+
9194 if (field.second .hasobjref != memop.isobjref )
9295 field.second .multiloc = true ; // can't split this field, since it contains a mix of references and bits
9396 if (!isstore)
@@ -198,6 +201,7 @@ void jl_alloc::runEscapeAnalysis(llvm::CallInst *I, EscapeAnalysisRequiredArgs r
198201 auto elty = inst->getType ();
199202 required.use_info .has_unknown_objref |= hasObjref (elty);
200203 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));
201205 required.use_info .hasunknownmem = true ;
202206 } else if (!required.use_info .addMemOp (inst, 0 , cur.offset ,
203207 inst->getType (),
@@ -289,6 +293,7 @@ void jl_alloc::runEscapeAnalysis(llvm::CallInst *I, EscapeAnalysisRequiredArgs r
289293 auto elty = storev->getType ();
290294 required.use_info .has_unknown_objref |= hasObjref (elty);
291295 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));
292297 required.use_info .hasunknownmem = true ;
293298 } else if (!required.use_info .addMemOp (inst, use->getOperandNo (),
294299 cur.offset , storev->getType (),
@@ -310,10 +315,14 @@ void jl_alloc::runEscapeAnalysis(llvm::CallInst *I, EscapeAnalysisRequiredArgs r
310315 }
311316 required.use_info .hasload = true ;
312317 auto storev = isa<AtomicCmpXchgInst>(inst) ? cast<AtomicCmpXchgInst>(inst)->getNewValOperand () : cast<AtomicRMWInst>(inst)->getValOperand ();
318+ Type *elty = storev->getType ();
313319 if (cur.offset == UINT32_MAX || !required.use_info .addMemOp (inst, use->getOperandNo (),
314- cur.offset , storev-> getType () ,
320+ cur.offset , elty ,
315321 true , required.DL )) {
316322 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));
317326 required.use_info .hasunknownmem = true ;
318327 }
319328 required.use_info .refload = true ;
0 commit comments