@@ -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