blob: c91be3356edd54f0b3b675ed37a9d07e7d7c4de3 [file] [log] [blame]
Will Dietzb8540362012-11-27 15:01:55 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsanitize=unsigned-integer-overflow %s -emit-llvm -o - | FileCheck %s
2// Verify checked operations are emitted for integers and longs.
3// unsigned short/char's tested in unsigned-promotion.c
4
5unsigned long li, lj, lk;
6unsigned int ii, ij, ik;
7
8extern void opaquelong(unsigned long);
9extern void opaqueint(unsigned int);
10
Stephen Lin93ab6bf2013-08-15 06:47:53 +000011// CHECK-LABEL: define void @testlongadd()
Will Dietzb8540362012-11-27 15:01:55 +000012void testlongadd() {
13
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070014 // CHECK: [[T1:%.*]] = load i64, i64* @lj
15 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk
Will Dietzb8540362012-11-27 15:01:55 +000016 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 [[T2]])
17 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 0
18 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
19 // CHECK: call void @__ubsan_handle_add_overflow
20 li = lj + lk;
21}
22
Stephen Lin93ab6bf2013-08-15 06:47:53 +000023// CHECK-LABEL: define void @testlongsub()
Will Dietzb8540362012-11-27 15:01:55 +000024void testlongsub() {
25
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070026 // CHECK: [[T1:%.*]] = load i64, i64* @lj
27 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk
Will Dietzb8540362012-11-27 15:01:55 +000028 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[T1]], i64 [[T2]])
29 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 0
30 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
31 // CHECK: call void @__ubsan_handle_sub_overflow
32 li = lj - lk;
33}
34
Stephen Lin93ab6bf2013-08-15 06:47:53 +000035// CHECK-LABEL: define void @testlongmul()
Will Dietzb8540362012-11-27 15:01:55 +000036void testlongmul() {
37
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070038 // CHECK: [[T1:%.*]] = load i64, i64* @lj
39 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @lk
Will Dietzb8540362012-11-27 15:01:55 +000040 // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[T1]], i64 [[T2]])
41 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 0
42 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 1
43 // CHECK: call void @__ubsan_handle_mul_overflow
44 li = lj * lk;
45}
46
Stephen Lin93ab6bf2013-08-15 06:47:53 +000047// CHECK-LABEL: define void @testlongpostinc()
Will Dietzb8540362012-11-27 15:01:55 +000048void testlongpostinc() {
49 opaquelong(li++);
50
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070051 // CHECK: [[T1:%.*]] = load i64, i64* @li
Will Dietzb8540362012-11-27 15:01:55 +000052 // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)
53 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0
54 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1
55 // CHECK: call void @__ubsan_handle_add_overflow
56}
57
Stephen Lin93ab6bf2013-08-15 06:47:53 +000058// CHECK-LABEL: define void @testlongpreinc()
Will Dietzb8540362012-11-27 15:01:55 +000059void testlongpreinc() {
60 opaquelong(++li);
61
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070062 // CHECK: [[T1:%.*]] = load i64, i64* @li
Will Dietzb8540362012-11-27 15:01:55 +000063 // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)
64 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 0
65 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 1
66 // CHECK: call void @__ubsan_handle_add_overflow
67}
68
Stephen Lin93ab6bf2013-08-15 06:47:53 +000069// CHECK-LABEL: define void @testintadd()
Will Dietzb8540362012-11-27 15:01:55 +000070void testintadd() {
71
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070072 // CHECK: [[T1:%.*]] = load i32, i32* @ij
73 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik
Will Dietzb8540362012-11-27 15:01:55 +000074 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 [[T2]])
75 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 0
76 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
77 // CHECK: call void @__ubsan_handle_add_overflow
78 ii = ij + ik;
79}
80
Stephen Lin93ab6bf2013-08-15 06:47:53 +000081// CHECK-LABEL: define void @testintsub()
Will Dietzb8540362012-11-27 15:01:55 +000082void testintsub() {
83
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070084 // CHECK: [[T1:%.*]] = load i32, i32* @ij
85 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik
Will Dietzb8540362012-11-27 15:01:55 +000086 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[T1]], i32 [[T2]])
87 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 0
88 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
89 // CHECK: call void @__ubsan_handle_sub_overflow
90 ii = ij - ik;
91}
92
Stephen Lin93ab6bf2013-08-15 06:47:53 +000093// CHECK-LABEL: define void @testintmul()
Will Dietzb8540362012-11-27 15:01:55 +000094void testintmul() {
95
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070096 // CHECK: [[T1:%.*]] = load i32, i32* @ij
97 // CHECK-NEXT: [[T2:%.*]] = load i32, i32* @ik
Will Dietzb8540362012-11-27 15:01:55 +000098 // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[T1]], i32 [[T2]])
99 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 0
100 // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1
101 // CHECK: call void @__ubsan_handle_mul_overflow
102 ii = ij * ik;
103}
104
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000105// CHECK-LABEL: define void @testintpostinc()
Will Dietzb8540362012-11-27 15:01:55 +0000106void testintpostinc() {
107 opaqueint(ii++);
108
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700109 // CHECK: [[T1:%.*]] = load i32, i32* @ii
Will Dietzb8540362012-11-27 15:01:55 +0000110 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)
111 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0
112 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1
113 // CHECK: call void @__ubsan_handle_add_overflow
114}
115
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000116// CHECK-LABEL: define void @testintpreinc()
Will Dietzb8540362012-11-27 15:01:55 +0000117void testintpreinc() {
118 opaqueint(++ii);
119
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700120 // CHECK: [[T1:%.*]] = load i32, i32* @ii
Will Dietzb8540362012-11-27 15:01:55 +0000121 // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)
122 // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0
123 // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1
124 // CHECK: call void @__ubsan_handle_add_overflow
125}