@@ -278,7 +278,7 @@ std::pair<MemoryLocationRange, bool> aggregate(
278278 auto ArrayPtr = LocInfo.first ;
279279 if (!ArrayPtr || !ArrayPtr->isDelinearized () || !LocInfo.second ->isValid ()) {
280280 // LLVM_DEBUG(dbgs() << "[AGGREGATE] Failed to delinearize location.\n");
281- /* LLVM_DEBUG(
281+ LLVM_DEBUG (
282282 dbgs () << " [AGGREGATE] Failed to delinearize location: " ;
283283 printLocationSource (dbgs (), Loc);
284284 dbgs () << " . Reason: " ;
@@ -289,7 +289,54 @@ std::pair<MemoryLocationRange, bool> aggregate(
289289 else
290290 dbgs () << " !LocInfo.second->isValid()" ;
291291 dbgs () << " \n " ;
292- );*/
292+ );
293+
294+ // for cases like: <lhs, 240, 248> (Default)
295+ // lhs[13][3][5][5]
296+ /* if (!ArrayPtr) {
297+ ArrayPtr = Fwk->getDelinearizeInfo()->findArray(Loc.Ptr, false);
298+ }
299+ auto Lower = Loc.LowerBound;
300+ auto Upper = Loc.UpperBound;
301+ if (ArrayPtr && Lower.hasValue() && Upper.hasValue()) {
302+ LLVM_DEBUG(dbgs() << "Check plain location: "; printLocationSource(dbgs(), Loc); dbgs() << "\n";);
303+ auto ArrayType{getPointerElementType(*ArrayPtr->getBase())};
304+ auto ArraySizeInfo = arraySize(ArrayType);
305+ if (ArraySizeInfo != std::make_tuple(0, 1, ArrayType)) {
306+ LLVM_DEBUG(dbgs() << "Here.1\n");
307+ auto LV = Lower.getValue();
308+ auto UV = Upper.getValue();
309+ auto ElemSize = Fwk->getDataLayout().getTypeStoreSize(
310+ std::get<2>(ArraySizeInfo)).getFixedSize();
311+ MemoryLocationRange FakeCollapsed;
312+ FakeCollapsed.Ptr = nullptr;
313+ FakeCollapsed.LowerBound = 0;
314+ FakeCollapsed.UpperBound = ElemSize;
315+ FakeCollapsed.SE = SE;
316+ FakeCollapsed.Kind = LocKind::Collapsed;
317+ auto DimN = ArrayPtr->getNumberOfDims();
318+ FakeCollapsed.DimList.resize(DimN);
319+ bool AreAllKnown = true;
320+ for (size_t I = 0; I < DimN; ++I) {
321+ auto DimSizeSCEV = ArrayPtr->getDimSize(I);
322+ if (ArrayPtr->isKnownDimSize(I) && isa<SCEVConstant>(DimSizeSCEV)) {
323+ auto &Dim = FakeCollapsed.DimList[I];
324+ Dim.DimSize = cast<SCEVConstant>(DimSizeSCEV)->getAPInt().getZExtValue();
325+ Dim.Start = Dim.End = Dim.Step = SE->getConstant(Type::getInt64Ty(SE->getContext()), 1);
326+ } else {
327+ AreAllKnown = false;
328+ break;
329+ }
330+ }
331+ if (AreAllKnown) {
332+ LLVM_DEBUG(dbgs() << "Here.2\n");
333+ ResLoc.delinearize(FakeCollapsed);
334+ LLVM_DEBUG(dbgs() << "After collapsing: "; printLocationSource(dbgs(), ResLoc); dbgs() << "\n";);
335+ return std::make_pair(ResLoc, true);
336+ }
337+ }
338+ LLVM_DEBUG(dbgs() << "Here.3\n");
339+ }*/
293340 ResLoc.Kind = LocKind::Default;
294341 return std::make_pair (ResLoc, true );
295342 }
0 commit comments