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