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
8 // Tests for signed integer overflow stuff.
9 // rdar://7432000 rdar://7221421
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;
16 // DEFAULT: add nsw i32
18 // TRAPV: llvm.sadd.with.overflow.i32
19 // CATCH_UB: llvm.sadd.with.overflow.i32
20 // TRAPV_HANDLER: foo(
23 // DEFAULT: sub nsw i32
25 // TRAPV: llvm.ssub.with.overflow.i32
26 // CATCH_UB: llvm.ssub.with.overflow.i32
27 // TRAPV_HANDLER: foo(
30 // DEFAULT: mul nsw i32
32 // TRAPV: llvm.smul.with.overflow.i32
33 // CATCH_UB: llvm.smul.with.overflow.i32
34 // TRAPV_HANDLER: foo(
37 // DEFAULT: sub nsw 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(
44 // PR7426 - Overflow checking for increments.
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(
53 // DEFAULT: add nsw i32 {{.*}}, -1
54 // WRAPV: add i32 {{.*}}, -1
55 // TRAPV: llvm.ssub.with.overflow.i32({{.*}}, i32 1)
56 // CATCH_UB: llvm.ssub.with.overflow.i32({{.*}}, i32 1)
57 // TRAPV_HANDLER: foo(
60 // -fwrapv should turn off inbounds for GEP's, PR9256
63 // DEFAULT: getelementptr inbounds i32, i32*
64 // WRAPV: getelementptr i32, i32*
65 // TRAPV: getelementptr inbounds i32, i32*
66 // CATCH_UB: getelementptr inbounds i32, i32*
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