1 // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s --check-prefix=DEFAULT 2 // RUN: %clang_cc1 %s -emit-llvm -o - -fwrapv | FileCheck %s --check-prefix=WRAPV 3 // RUN: %clang_cc1 %s -emit-llvm -o - -ftrapv | FileCheck %s --check-prefix=TRAPV 4 // RUN: %clang_cc1 %s -emit-llvm -o - -ftrapv -ftrapv-handler foo | FileCheck %s --check-prefix=TRAPV_HANDLER 5 6 7 // Tests for signed integer overflow stuff. 8 // rdar://7432000 rdar://7221421 9 void test1() { 10 // DEFAULT: define void @test1 11 // WRAPV: define void @test1 12 // TRAPV: define void @test1 13 extern volatile int f11G, a, b; 14 15 // DEFAULT: add nsw i32 16 // WRAPV: add i32 17 // TRAPV: llvm.sadd.with.overflow.i32 18 // TRAPV_HANDLER: foo( 19 f11G = a + b; 20 21 // DEFAULT: sub nsw i32 22 // WRAPV: sub i32 23 // TRAPV: llvm.ssub.with.overflow.i32 24 // TRAPV_HANDLER: foo( 25 f11G = a - b; 26 27 // DEFAULT: mul nsw i32 28 // WRAPV: mul i32 29 // TRAPV: llvm.smul.with.overflow.i32 30 // TRAPV_HANDLER: foo( 31 f11G = a * b; 32 33 // DEFAULT: sub nsw i32 0, 34 // WRAPV: sub i32 0, 35 // TRAPV: llvm.ssub.with.overflow.i32(i32 0 36 // TRAPV_HANDLER: foo( 37 f11G = -a; 38 39 // PR7426 - Overflow checking for increments. 40 41 // DEFAULT: add nsw i32 {{.*}}, 1 42 // WRAPV: add i32 {{.*}}, 1 43 // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 1) 44 // TRAPV_HANDLER: foo( 45 ++a; 46 47 // DEFAULT: add nsw i32 {{.*}}, -1 48 // WRAPV: add i32 {{.*}}, -1 49 // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 -1) 50 // TRAPV_HANDLER: foo( 51 --a; 52 53 54 // -fwrapv should turn off inbounds for GEP's, PR9256 55 extern int* P; 56 ++P; 57 // DEFAULT: getelementptr inbounds i32* 58 // WRAPV: getelementptr i32* 59 // TRAPV: getelementptr inbounds i32* 60 } 61