Index: llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp =================================================================== --- llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -1230,7 +1230,8 @@ else O << " .align " << GVar->getAlignment(); - if (ETy->isFloatingPointTy() || ETy->isIntegerTy() || ETy->isPointerTy()) { + if (ETy->isFloatingPointTy() || ETy->isPointerTy() || + (ETy->isIntegerTy() && ETy->getScalarSizeInBits() <= 64)) { O << " ."; // Special case: ABI requires that we use .u8 for predicates if (ETy->isIntegerTy(1)) @@ -1271,6 +1272,7 @@ // targets that support these high level field accesses. Structs, arrays // and vectors are lowered into arrays of bytes. switch (ETy->getTypeID()) { + case Type::IntegerTyID: // Integers larger than 64 bits case Type::StructTyID: case Type::ArrayTyID: case Type::VectorTyID: @@ -1994,6 +1996,17 @@ const DataLayout &DL = getDataLayout(); int Bytes; + // Integers of arbitrary width + if (const ConstantInt *CI = dyn_cast(CPV)) { + APInt Val = CI->getValue(); + for (unsigned I = 0, E = DL.getTypeStoreSize(CPV->getType()); I < E; ++I) { + uint8_t Byte = Val.getLoBits(8).getZExtValue(); + aggBuffer->addBytes(&Byte, 1, 1); + Val = Val.lshr(8); + } + return; + } + // Old constants if (isa(CPV) || isa(CPV)) { if (CPV->getNumOperands()) Index: llvm/test/CodeGen/NVPTX/global-variable-big.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/NVPTX/global-variable-big.ll @@ -0,0 +1,9 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64" +target triple = "nvptx64-nvidia-cuda" + +; Check that we can handle global variables of large integer type. + +; (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};