From 6a423ee34447f29384fa6b8d7943809f2a8267d2 Mon Sep 17 00:00:00 2001 From: Artem Belevich Date: Thu, 23 Mar 2023 15:27:02 -0700 Subject: [PATCH] [NVPTX] Fix integer overflow affecting array size calculation. It turns out, 4GB+ large arrays are a thing and a 32-bit integer is just not enough to handle them. Differential Revision: https://reviews.llvm.org/D146767 --- llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp | 2 +- llvm/test/CodeGen/NVPTX/global-variable-big.ll | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp index d4173ac..aea4be0 100644 --- a/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -1148,7 +1148,7 @@ void NVPTXAsmPrinter::printModuleLevelGV(const GlobalVariable *GVar, } } } else { - unsigned int ElementSize = 0; + uint64_t ElementSize = 0; // Although PTX has direct support for struct type and array type and // LLVM IR is very similar to PTX, the LLVM CodeGen does not support for diff --git a/llvm/test/CodeGen/NVPTX/global-variable-big.ll b/llvm/test/CodeGen/NVPTX/global-variable-big.ll index 81171e8..f4194df 100644 --- a/llvm/test/CodeGen/NVPTX/global-variable-big.ll +++ b/llvm/test/CodeGen/NVPTX/global-variable-big.ll @@ -9,3 +9,10 @@ target triple = "nvptx64-nvidia-cuda" ; (lsb) 0x0102'0304'0506...0F10 (msb) @gv = addrspace(1) externally_initialized global i128 21345817372864405881847059188222722561, align 16 ; CHECK: .visible .global .align 16 .b8 gv[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + +; Make sure that we do not overflow on large number of elements. +; CHECK-LABEL large_data +; CHECK: .visible .global .align 1 .b8 large_data[4831838208] +@large_data = global [4831838208 x i8] zeroinitializer + + -- 2.7.4