From 27e192196fec42618c7fcbd865e8e0b541545671 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 14 Feb 2005 21:40:26 +0000 Subject: [PATCH] Print GEP offsets as signed values instead of unsigned values. On X86, this prints: getelementptr (int* %A, int -1) as: "(A) - 4" instead of "(A) + 18446744073709551612", which makes the assembler much happier. This fixes test/Regression/CodeGen/X86/2005-02-14-IllegalAssembler.ll, and Benchmarks/Prolangs-C/cdecl with LLC on X86. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20183 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 80f67023f43..4e77a78d81b 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -78,10 +78,14 @@ void AsmPrinter::emitConstantValueOnly(const Constant *CV) { // generate a symbolic expression for the byte address const Constant *ptrVal = CE->getOperand(0); std::vector idxVec(CE->op_begin()+1, CE->op_end()); - if (uint64_t Offset = TD.getIndexedOffset(ptrVal->getType(), idxVec)) { - O << "("; + if (int64_t Offset = TD.getIndexedOffset(ptrVal->getType(), idxVec)) { + if (Offset) + O << "("; emitConstantValueOnly(ptrVal); - O << ") + " << Offset; + if (Offset > 0) + O << ") + " << Offset; + else if (Offset < 0) + O << ") - " << -Offset; } else { emitConstantValueOnly(ptrVal); }