blob: 4e7a4426a03e2f43573c882aa6f032d2b01797dc [file] [log] [blame]
Will Dietzb8540362012-11-27 15:01:55 +00001// Check -fsanitize=signed-integer-overflow and
2// -fsanitize=unsigned-integer-overflow with promoted unsigned types
3//
4// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s \
5// RUN: -fsanitize=signed-integer-overflow | FileCheck %s --check-prefix=CHECKS
6// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s \
7// RUN: -fsanitize=unsigned-integer-overflow | FileCheck %s --check-prefix=CHECKU
8
9unsigned short si, sj, sk;
10unsigned char ci, cj, ck;
11
12extern void opaqueshort(unsigned short);
13extern void opaquechar(unsigned char);
14
Stephen Lin93ab6bf2013-08-15 06:47:53 +000015// CHECKS-LABEL: define void @testshortadd()
16// CHECKU-LABEL: define void @testshortadd()
Will Dietzb8540362012-11-27 15:01:55 +000017void testshortadd() {
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070018 // CHECKS: load i16, i16* @sj
19 // CHECKS: load i16, i16* @sk
Will Dietzb8540362012-11-27 15:01:55 +000020 // CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
21 // CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
22 // CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
23 // CHECKS: call void @__ubsan_handle_add_overflow
24 //
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070025 // CHECKU: [[T1:%.*]] = load i16, i16* @sj
Will Dietzb8540362012-11-27 15:01:55 +000026 // CHECKU: [[T2:%.*]] = zext i16 [[T1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070027 // CHECKU: [[T3:%.*]] = load i16, i16* @sk
Will Dietzb8540362012-11-27 15:01:55 +000028 // CHECKU: [[T4:%.*]] = zext i16 [[T3]]
29 // CHECKU-NOT: llvm.sadd
30 // CHECKU-NOT: llvm.uadd
31 // CHECKU: [[T5:%.*]] = add nsw i32 [[T2]], [[T4]]
32
33 si = sj + sk;
34}
35
Stephen Lin93ab6bf2013-08-15 06:47:53 +000036// CHECKS-LABEL: define void @testshortsub()
37// CHECKU-LABEL: define void @testshortsub()
Will Dietzb8540362012-11-27 15:01:55 +000038void testshortsub() {
39
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070040 // CHECKS: load i16, i16* @sj
41 // CHECKS: load i16, i16* @sk
Will Dietzb8540362012-11-27 15:01:55 +000042 // CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
43 // CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
44 // CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
45 // CHECKS: call void @__ubsan_handle_sub_overflow
46 //
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070047 // CHECKU: [[T1:%.*]] = load i16, i16* @sj
Will Dietzb8540362012-11-27 15:01:55 +000048 // CHECKU: [[T2:%.*]] = zext i16 [[T1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070049 // CHECKU: [[T3:%.*]] = load i16, i16* @sk
Will Dietzb8540362012-11-27 15:01:55 +000050 // CHECKU: [[T4:%.*]] = zext i16 [[T3]]
51 // CHECKU-NOT: llvm.ssub
52 // CHECKU-NOT: llvm.usub
53 // CHECKU: [[T5:%.*]] = sub nsw i32 [[T2]], [[T4]]
54
55 si = sj - sk;
56}
57
Stephen Lin93ab6bf2013-08-15 06:47:53 +000058// CHECKS-LABEL: define void @testshortmul()
59// CHECKU-LABEL: define void @testshortmul()
Will Dietzb8540362012-11-27 15:01:55 +000060void testshortmul() {
61
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070062 // CHECKS: load i16, i16* @sj
63 // CHECKS: load i16, i16* @sk
Will Dietzb8540362012-11-27 15:01:55 +000064 // CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
65 // CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
66 // CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
67 // CHECKS: call void @__ubsan_handle_mul_overflow
68 //
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070069 // CHECKU: [[T1:%.*]] = load i16, i16* @sj
Will Dietzb8540362012-11-27 15:01:55 +000070 // CHECKU: [[T2:%.*]] = zext i16 [[T1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070071 // CHECKU: [[T3:%.*]] = load i16, i16* @sk
Will Dietzb8540362012-11-27 15:01:55 +000072 // CHECKU: [[T4:%.*]] = zext i16 [[T3]]
73 // CHECKU-NOT: llvm.smul
74 // CHECKU-NOT: llvm.umul
75 // CHECKU: [[T5:%.*]] = mul nsw i32 [[T2]], [[T4]]
76 si = sj * sk;
77}
78
Stephen Lin93ab6bf2013-08-15 06:47:53 +000079// CHECKS-LABEL: define void @testcharadd()
80// CHECKU-LABEL: define void @testcharadd()
Will Dietzb8540362012-11-27 15:01:55 +000081void testcharadd() {
82
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070083 // CHECKS: load i8, i8* @cj
84 // CHECKS: load i8, i8* @ck
Will Dietzb8540362012-11-27 15:01:55 +000085 // CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
86 // CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
87 // CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
88 // CHECKS: call void @__ubsan_handle_add_overflow
89 //
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070090 // CHECKU: [[T1:%.*]] = load i8, i8* @cj
Will Dietzb8540362012-11-27 15:01:55 +000091 // CHECKU: [[T2:%.*]] = zext i8 [[T1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070092 // CHECKU: [[T3:%.*]] = load i8, i8* @ck
Will Dietzb8540362012-11-27 15:01:55 +000093 // CHECKU: [[T4:%.*]] = zext i8 [[T3]]
94 // CHECKU-NOT: llvm.sadd
95 // CHECKU-NOT: llvm.uadd
96 // CHECKU: [[T5:%.*]] = add nsw i32 [[T2]], [[T4]]
97
98 ci = cj + ck;
99}
100
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000101// CHECKS-LABEL: define void @testcharsub()
102// CHECKU-LABEL: define void @testcharsub()
Will Dietzb8540362012-11-27 15:01:55 +0000103void testcharsub() {
104
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700105 // CHECKS: load i8, i8* @cj
106 // CHECKS: load i8, i8* @ck
Will Dietzb8540362012-11-27 15:01:55 +0000107 // CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
108 // CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
109 // CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
110 // CHECKS: call void @__ubsan_handle_sub_overflow
111 //
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700112 // CHECKU: [[T1:%.*]] = load i8, i8* @cj
Will Dietzb8540362012-11-27 15:01:55 +0000113 // CHECKU: [[T2:%.*]] = zext i8 [[T1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700114 // CHECKU: [[T3:%.*]] = load i8, i8* @ck
Will Dietzb8540362012-11-27 15:01:55 +0000115 // CHECKU: [[T4:%.*]] = zext i8 [[T3]]
116 // CHECKU-NOT: llvm.ssub
117 // CHECKU-NOT: llvm.usub
118 // CHECKU: [[T5:%.*]] = sub nsw i32 [[T2]], [[T4]]
119
120 ci = cj - ck;
121}
122
Stephen Lin93ab6bf2013-08-15 06:47:53 +0000123// CHECKS-LABEL: define void @testcharmul()
124// CHECKU-LABEL: define void @testcharmul()
Will Dietzb8540362012-11-27 15:01:55 +0000125void testcharmul() {
126
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700127 // CHECKS: load i8, i8* @cj
128 // CHECKS: load i8, i8* @ck
Will Dietzb8540362012-11-27 15:01:55 +0000129 // CHECKS: [[T1:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
130 // CHECKS-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
131 // CHECKS-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
132 // CHECKS: call void @__ubsan_handle_mul_overflow
133 //
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700134 // CHECKU: [[T1:%.*]] = load i8, i8* @cj
Will Dietzb8540362012-11-27 15:01:55 +0000135 // CHECKU: [[T2:%.*]] = zext i8 [[T1]]
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700136 // CHECKU: [[T3:%.*]] = load i8, i8* @ck
Will Dietzb8540362012-11-27 15:01:55 +0000137 // CHECKU: [[T4:%.*]] = zext i8 [[T3]]
138 // CHECKU-NOT: llvm.smul
139 // CHECKU-NOT: llvm.umul
140 // CHECKU: [[T5:%.*]] = mul nsw i32 [[T2]], [[T4]]
141
142 ci = cj * ck;
143}