From: Alex Zinenko Date: Mon, 7 Jun 2021 16:33:18 +0000 (+0200) Subject: [mlir] fix integer type mismatch in alloc conversion to LLVM X-Git-Tag: llvmorg-14-init~4600 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3c70a82e2891949801bd5da68159cd8156659f6f;p=platform%2Fupstream%2Fllvm.git [mlir] fix integer type mismatch in alloc conversion to LLVM Some places in the alloc-like op conversion use the converted index type whereas other places use the pointer-sized integer type, which may not be the same. Consistently use the converted index type, similarly to other address calculations. Reviewed By: pifon2a Differential Revision: https://reviews.llvm.org/D103826 --- diff --git a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp index 6ddc333..dcbb4b3 100644 --- a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp +++ b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp @@ -1878,10 +1878,9 @@ struct AllocOpLowering : public AllocLikeOpLLVMLowering { Value alignedPtr = allocatedPtr; if (alignment) { - auto intPtrType = getIntPtrType(memRefType.getMemorySpaceAsInt()); // Compute the aligned type pointer. Value allocatedInt = - rewriter.create(loc, intPtrType, allocatedPtr); + rewriter.create(loc, getIndexType(), allocatedPtr); Value alignmentInt = createAligned(rewriter, loc, allocatedInt, alignment); alignedPtr = diff --git a/mlir/test/Conversion/StandardToLLVM/convert-static-memref-ops.mlir b/mlir/test/Conversion/StandardToLLVM/convert-static-memref-ops.mlir index 82dddeb..2762339 100644 --- a/mlir/test/Conversion/StandardToLLVM/convert-static-memref-ops.mlir +++ b/mlir/test/Conversion/StandardToLLVM/convert-static-memref-ops.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt -convert-std-to-llvm %s | FileCheck %s +// RUN: mlir-opt -convert-std-to-llvm -split-input-file %s | FileCheck %s // RUN: mlir-opt -convert-std-to-llvm='use-bare-ptr-memref-call-conv=1' -split-input-file %s | FileCheck %s --check-prefix=BAREPTR // BAREPTR-LABEL: func @check_noalias @@ -402,3 +402,28 @@ func @check_unranked_memref_func_call(%in: memref<*xi8>) -> memref<*xi8> { // BAREPTR-NEXT: return %{{.*}} : memref<*xi8> return %res : memref<*xi8> } + +// ----- + +// Check that consistent types are emitted in address arithemic in presence of +// a data layout specification. +module attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry> } { + func @address() { + %c1 = constant 1 : index + %0 = memref.alloc(%c1) : memref> + // CHECK: %[[CST:.*]] = llvm.mlir.constant(1 : index) : i32 + // CHECK: llvm.mlir.null + // CHECK: llvm.getelementptr %{{.*}}[[CST]] + // CHECK: llvm.ptrtoint %{{.*}} : !llvm.ptr<{{.*}}> to i32 + // CHECK: llvm.ptrtoint %{{.*}} : !llvm.ptr<{{.*}}> to i32 + // CHECK: llvm.add %{{.*}} : i32 + // CHECK: llvm.call @malloc(%{{.*}}) : (i32) -> !llvm.ptr + // CHECK: llvm.ptrtoint %{{.*}} : !llvm.ptr<{{.*}}> to i32 + // CHECK: llvm.sub {{.*}} : i32 + // CHECK: llvm.add {{.*}} : i32 + // CHECK: llvm.urem {{.*}} : i32 + // CHECK: llvm.sub {{.*}} : i32 + // CHECK: llvm.inttoptr %{{.*}} : i32 to !llvm.ptr + return + } +}