@@ -420,8 +420,8 @@ struct AssumeAlignmentOpLowering
420420    auto  loc = op.getLoc ();
421421
422422    auto  srcMemRefType = cast<MemRefType>(op.getMemref ().getType ());
423-     Value ptr = getStridedElementPtr (loc, srcMemRefType, memref,  /* indices= */ {} ,
424-                                      rewriter );
423+     Value ptr = getStridedElementPtr (rewriter,  loc, srcMemRefType, memref,
424+                                      /* indices= */ {} );
425425
426426    //  Emit llvm.assume(true) ["align"(memref, alignment)].
427427    //  This is more direct than ptrtoint-based checks, is explicitly supported,
@@ -644,8 +644,8 @@ struct GenericAtomicRMWOpLowering
644644    //  Compute the loaded value and branch to the loop block.
645645    rewriter.setInsertionPointToEnd (initBlock);
646646    auto  memRefType = cast<MemRefType>(atomicOp.getMemref ().getType ());
647-     auto  dataPtr = getStridedElementPtr (loc, memRefType, adaptor. getMemref (), 
648-                                          adaptor.getIndices (), rewriter );
647+     auto  dataPtr = getStridedElementPtr (
648+         rewriter, loc, memRefType,  adaptor.getMemref (), adaptor. getIndices () );
649649    Value init = rewriter.create <LLVM::LoadOp>(
650650        loc, typeConverter->convertType (memRefType.getElementType ()), dataPtr);
651651    rewriter.create <LLVM::BrOp>(loc, init, loopBlock);
@@ -829,9 +829,13 @@ struct LoadOpLowering : public LoadStoreOpLowering<memref::LoadOp> {
829829                  ConversionPatternRewriter &rewriter) const  override  {
830830    auto  type = loadOp.getMemRefType ();
831831
832-     Value dataPtr =
833-         getStridedElementPtr (loadOp.getLoc (), type, adaptor.getMemref (),
834-                              adaptor.getIndices (), rewriter);
832+     //  Per memref.load spec, the indices must be in-bounds:
833+     //  0 <= idx < dim_size, and additionally all offsets are non-negative,
834+     //  hence inbounds and nuw are used when lowering to llvm.getelementptr.
835+     Value dataPtr = getStridedElementPtr (
836+         rewriter, loadOp.getLoc (), type, adaptor.getMemref (),
837+         adaptor.getIndices (),
838+         LLVM::GEPNoWrapFlags::inbounds | LLVM::GEPNoWrapFlags::nuw);
835839    rewriter.replaceOpWithNewOp <LLVM::LoadOp>(
836840        loadOp, typeConverter->convertType (type.getElementType ()), dataPtr, 0 ,
837841        false , loadOp.getNontemporal ());
@@ -849,8 +853,12 @@ struct StoreOpLowering : public LoadStoreOpLowering<memref::StoreOp> {
849853                  ConversionPatternRewriter &rewriter) const  override  {
850854    auto  type = op.getMemRefType ();
851855
852-     Value dataPtr = getStridedElementPtr (op.getLoc (), type, adaptor.getMemref (),
853-                                          adaptor.getIndices (), rewriter);
856+     //  Per memref.store spec, the indices must be in-bounds:
857+     //  0 <= idx < dim_size, and additionally all offsets are non-negative,
858+     //  hence inbounds and nuw are used when lowering to llvm.getelementptr.
859+     Value dataPtr = getStridedElementPtr (
860+         rewriter, op.getLoc (), type, adaptor.getMemref (), adaptor.getIndices (),
861+         LLVM::GEPNoWrapFlags::inbounds | LLVM::GEPNoWrapFlags::nuw);
854862    rewriter.replaceOpWithNewOp <LLVM::StoreOp>(op, adaptor.getValue (), dataPtr,
855863                                               0 , false , op.getNontemporal ());
856864    return  success ();
@@ -868,8 +876,8 @@ struct PrefetchOpLowering : public LoadStoreOpLowering<memref::PrefetchOp> {
868876    auto  type = prefetchOp.getMemRefType ();
869877    auto  loc = prefetchOp.getLoc ();
870878
871-     Value dataPtr = getStridedElementPtr (loc, type, adaptor. getMemref (), 
872-                                           adaptor.getIndices (), rewriter );
879+     Value dataPtr = getStridedElementPtr (
880+         rewriter, loc, type,  adaptor.getMemref (), adaptor. getIndices () );
873881
874882    //  Replace with llvm.prefetch.
875883    IntegerAttr isWrite = rewriter.getI32IntegerAttr (prefetchOp.getIsWrite ());
@@ -1809,8 +1817,8 @@ struct AtomicRMWOpLowering : public LoadStoreOpLowering<memref::AtomicRMWOp> {
18091817    if  (failed (memRefType.getStridesAndOffset (strides, offset)))
18101818      return  failure ();
18111819    auto  dataPtr =
1812-         getStridedElementPtr (atomicOp.getLoc (), memRefType, adaptor. getMemref () ,
1813-                              adaptor.getIndices (), rewriter );
1820+         getStridedElementPtr (rewriter,  atomicOp.getLoc (), memRefType,
1821+                              adaptor.getMemref (), adaptor. getIndices () );
18141822    rewriter.replaceOpWithNewOp <LLVM::AtomicRMWOp>(
18151823        atomicOp, *maybeKind, dataPtr, adaptor.getValue (),
18161824        LLVM::AtomicOrdering::acq_rel);
0 commit comments