- The increment needs to be signed value to preserve the original value when
  its data type is larger than 64-bit integer.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162766 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael Liao 2012-08-28 16:55:13 +00:00
Родитель 92daae0186
Коммит 36d5ceaab2
2 изменённых файлов: 10 добавлений и 1 удалений

Просмотреть файл

@ -1306,7 +1306,7 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
// Most common case by far: integer increment.
} else if (type->isIntegerType()) {
llvm::Value *amt = llvm::ConstantInt::get(value->getType(), amount);
llvm::Value *amt = llvm::ConstantInt::get(value->getType(), amount, true);
// Note that signed integer inc/dec with width less than int can't
// overflow because of promotion rules; we're just eliding a few steps here.

9
test/CodeGen/pr13704.c Normal file
Просмотреть файл

@ -0,0 +1,9 @@
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
extern void foo(__int128);
void bar() {
__int128 x = 2;
x--;
foo(x);
// CHECK: add nsw i128 %0, -1
}