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
test1()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.ssub.with.overflow.i32({{.*}}, i32 1)
56 // CATCH_UB: llvm.ssub.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, i32*
64 // WRAPV: getelementptr i32, i32*
65 // TRAPV: getelementptr inbounds i32, i32*
66 // CATCH_UB: getelementptr inbounds i32, 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 // PR24256: don't instrument __builtin_frame_address.
77 __builtin_frame_address(0 + 0);
78 // DEFAULT: call i8* @llvm.frameaddress(i32 0)
79 // WRAPV: call i8* @llvm.frameaddress(i32 0)
80 // TRAPV: call i8* @llvm.frameaddress(i32 0)
81 // CATCH_UB: call i8* @llvm.frameaddress(i32 0)
82 }
83