@@ -420,8 +420,8 @@ struct AssumeAlignmentOpLowering
420
420
auto loc = op.getLoc ();
421
421
422
422
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= */ {} );
425
425
426
426
// Emit llvm.assume(true) ["align"(memref, alignment)].
427
427
// This is more direct than ptrtoint-based checks, is explicitly supported,
@@ -644,8 +644,8 @@ struct GenericAtomicRMWOpLowering
644
644
// Compute the loaded value and branch to the loop block.
645
645
rewriter.setInsertionPointToEnd (initBlock);
646
646
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 () );
649
649
Value init = rewriter.create <LLVM::LoadOp>(
650
650
loc, typeConverter->convertType (memRefType.getElementType ()), dataPtr);
651
651
rewriter.create <LLVM::BrOp>(loc, init, loopBlock);
@@ -829,9 +829,13 @@ struct LoadOpLowering : public LoadStoreOpLowering<memref::LoadOp> {
829
829
ConversionPatternRewriter &rewriter) const override {
830
830
auto type = loadOp.getMemRefType ();
831
831
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);
835
839
rewriter.replaceOpWithNewOp <LLVM::LoadOp>(
836
840
loadOp, typeConverter->convertType (type.getElementType ()), dataPtr, 0 ,
837
841
false , loadOp.getNontemporal ());
@@ -849,8 +853,12 @@ struct StoreOpLowering : public LoadStoreOpLowering<memref::StoreOp> {
849
853
ConversionPatternRewriter &rewriter) const override {
850
854
auto type = op.getMemRefType ();
851
855
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);
854
862
rewriter.replaceOpWithNewOp <LLVM::StoreOp>(op, adaptor.getValue (), dataPtr,
855
863
0 , false , op.getNontemporal ());
856
864
return success ();
@@ -868,8 +876,8 @@ struct PrefetchOpLowering : public LoadStoreOpLowering<memref::PrefetchOp> {
868
876
auto type = prefetchOp.getMemRefType ();
869
877
auto loc = prefetchOp.getLoc ();
870
878
871
- Value dataPtr = getStridedElementPtr (loc, type, adaptor. getMemref (),
872
- adaptor.getIndices (), rewriter );
879
+ Value dataPtr = getStridedElementPtr (
880
+ rewriter, loc, type, adaptor.getMemref (), adaptor. getIndices () );
873
881
874
882
// Replace with llvm.prefetch.
875
883
IntegerAttr isWrite = rewriter.getI32IntegerAttr (prefetchOp.getIsWrite ());
@@ -1809,8 +1817,8 @@ struct AtomicRMWOpLowering : public LoadStoreOpLowering<memref::AtomicRMWOp> {
1809
1817
if (failed (memRefType.getStridesAndOffset (strides, offset)))
1810
1818
return failure ();
1811
1819
auto dataPtr =
1812
- getStridedElementPtr (atomicOp.getLoc (), memRefType, adaptor. getMemref () ,
1813
- adaptor.getIndices (), rewriter );
1820
+ getStridedElementPtr (rewriter, atomicOp.getLoc (), memRefType,
1821
+ adaptor.getMemref (), adaptor. getIndices () );
1814
1822
rewriter.replaceOpWithNewOp <LLVM::AtomicRMWOp>(
1815
1823
atomicOp, *maybeKind, dataPtr, adaptor.getValue (),
1816
1824
LLVM::AtomicOrdering::acq_rel);
0 commit comments