diff options
author | Chris Lattner <sabre@nondot.org> | 2005-02-14 21:40:26 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-02-14 21:40:26 +0000 |
commit | 27e192196fec42618c7fcbd865e8e0b541545671 (patch) | |
tree | 7a78aff35ae64d21f04650dc85d3d6d306377403 | |
parent | eb28797506be067c7a6bf95c09eadf203fe6b016 (diff) |
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
-rw-r--r-- | lib/CodeGen/AsmPrinter.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 80f67023f4..4e77a78d81 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<Value*> 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); } |