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
10void 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