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-prefixes=CATCH_UB,CATCH_UB_POINTER
5 // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=signed-integer-overflow -fwrapv | FileCheck %s --check-prefixes=CATCH_UB,NOCATCH_UB_POINTER
6 // RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv -ftrapv-handler foo | FileCheck %s --check-prefix=TRAPV_HANDLER
9 // Tests for signed integer overflow stuff.
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 nuw i32, ptr
64 // WRAPV: getelementptr i32, ptr
65 // TRAPV: getelementptr inbounds nuw i32, ptr
66 // CATCH_UB_POINTER: getelementptr inbounds nuw i32, ptr
67 // NOCATCH_UB_POINTER: getelementptr i32, ptr
69 // PR9350: char pre-increment never overflows.
70 extern volatile signed char PR9350_char_inc
;
71 // DEFAULT: add i8 {{.*}}, 1
72 // WRAPV: add i8 {{.*}}, 1
73 // TRAPV: add i8 {{.*}}, 1
74 // CATCH_UB: add i8 {{.*}}, 1
77 // PR9350: char pre-decrement never overflows.
78 extern volatile signed char PR9350_char_dec
;
79 // DEFAULT: add i8 {{.*}}, -1
80 // WRAPV: add i8 {{.*}}, -1
81 // TRAPV: add i8 {{.*}}, -1
82 // CATCH_UB: add i8 {{.*}}, -1
85 // PR9350: short pre-increment never overflows.
86 extern volatile signed short PR9350_short_inc
;
87 // DEFAULT: add i16 {{.*}}, 1
88 // WRAPV: add i16 {{.*}}, 1
89 // TRAPV: add i16 {{.*}}, 1
90 // CATCH_UB: add i16 {{.*}}, 1
93 // PR9350: short pre-decrement never overflows.
94 extern volatile signed short PR9350_short_dec
;
95 // DEFAULT: add i16 {{.*}}, -1
96 // WRAPV: add i16 {{.*}}, -1
97 // TRAPV: add i16 {{.*}}, -1
98 // CATCH_UB: add i16 {{.*}}, -1
101 // PR24256: don't instrument __builtin_frame_address.
102 __builtin_frame_address(0 + 0);
103 // DEFAULT: call ptr @llvm.frameaddress.p0(i32 0)
104 // WRAPV: call ptr @llvm.frameaddress.p0(i32 0)
105 // TRAPV: call ptr @llvm.frameaddress.p0(i32 0)
106 // CATCH_UB: call ptr @llvm.frameaddress.p0(i32 0)