1b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz// Check -fsanitize=signed-integer-overflow and
2b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz// -fsanitize=unsigned-integer-overflow with promoted unsigned types
3b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz//
4b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s \
5b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz// RUN:   -fsanitize=signed-integer-overflow | FileCheck %s --check-prefix=CHECKS
6b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s \
7b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz// RUN:   -fsanitize=unsigned-integer-overflow | FileCheck %s --check-prefix=CHECKU
8b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
9b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzunsigned short si, sj, sk;
10b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzunsigned char ci, cj, ck;
11b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
12b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzextern void opaqueshort(unsigned short);
13b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzextern void opaquechar(unsigned char);
14b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
1593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKS-LABEL:   define void @testshortadd()
1693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKU-LABEL: define void @testshortadd()
17b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzvoid testshortadd() {
183ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i16, i16* @sj
193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i16, i16* @sk
20b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        [[T1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
21b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
22b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
23b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        call void @__ubsan_handle_add_overflow
24b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  //
253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T1:%.*]] = load i16, i16* @sj
26b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i16 [[T1]]
273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T3:%.*]] = load i16, i16* @sk
28b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T4:%.*]] = zext i16 [[T3]]
29b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.sadd
30b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.uadd
31b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T5:%.*]] = add nsw i32 [[T2]], [[T4]]
32b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
33b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  si = sj + sk;
34b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz}
35b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
3693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKS-LABEL:   define void @testshortsub()
3793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKU-LABEL: define void @testshortsub()
38b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzvoid testshortsub() {
39b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i16, i16* @sj
413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i16, i16* @sk
42b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        [[T1:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
43b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
44b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
45b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        call void @__ubsan_handle_sub_overflow
46b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  //
473ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T1:%.*]] = load i16, i16* @sj
48b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i16 [[T1]]
493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T3:%.*]] = load i16, i16* @sk
50b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T4:%.*]] = zext i16 [[T3]]
51b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.ssub
52b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.usub
53b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T5:%.*]] = sub nsw i32 [[T2]], [[T4]]
54b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
55b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  si = sj - sk;
56b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz}
57b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
5893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKS-LABEL:   define void @testshortmul()
5993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKU-LABEL: define void @testshortmul()
60b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzvoid testshortmul() {
61b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i16, i16* @sj
633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i16, i16* @sk
64b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        [[T1:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
65b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
66b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
67b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        call void @__ubsan_handle_mul_overflow
68b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  //
693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T1:%.*]] = load i16, i16* @sj
70b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i16 [[T1]]
713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T3:%.*]] = load i16, i16* @sk
72b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T4:%.*]] = zext i16 [[T3]]
73b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.smul
74b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.umul
75b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T5:%.*]] = mul nsw i32 [[T2]], [[T4]]
76b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  si = sj * sk;
77b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz}
78b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
7993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKS-LABEL:   define void @testcharadd()
8093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKU-LABEL: define void @testcharadd()
81b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzvoid testcharadd() {
82b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i8, i8* @cj
843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i8, i8* @ck
85b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        [[T1:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
86b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
87b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
88b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        call void @__ubsan_handle_add_overflow
89b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  //
903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T1:%.*]] = load i8, i8* @cj
91b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i8 [[T1]]
923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T3:%.*]] = load i8, i8* @ck
93b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T4:%.*]] = zext i8 [[T3]]
94b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.sadd
95b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.uadd
96b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T5:%.*]] = add nsw i32 [[T2]], [[T4]]
97b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
98b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  ci = cj + ck;
99b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz}
100b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
10193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKS-LABEL:   define void @testcharsub()
10293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKU-LABEL: define void @testcharsub()
103b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzvoid testcharsub() {
104b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
1053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i8, i8* @cj
1063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i8, i8* @ck
107b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        [[T1:%.*]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
108b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
109b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
110b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        call void @__ubsan_handle_sub_overflow
111b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  //
1123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T1:%.*]] = load i8, i8* @cj
113b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i8 [[T1]]
1143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T3:%.*]] = load i8, i8* @ck
115b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T4:%.*]] = zext i8 [[T3]]
116b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.ssub
117b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.usub
118b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T5:%.*]] = sub nsw i32 [[T2]], [[T4]]
119b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
120b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  ci = cj - ck;
121b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz}
122b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
12393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKS-LABEL:   define void @testcharmul()
12493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKU-LABEL: define void @testcharmul()
125b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietzvoid testcharmul() {
126b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
1273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i8, i8* @cj
1283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKS:        load i8, i8* @ck
129b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        [[T1:%.*]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 [[T2:%.*]], i32 [[T3:%.*]])
130b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T4:%.*]] = extractvalue { i32, i1 } [[T1]], 0
131b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS-NEXT:   [[T5:%.*]] = extractvalue { i32, i1 } [[T1]], 1
132b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        call void @__ubsan_handle_mul_overflow
133b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  //
1343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T1:%.*]] = load i8, i8* @cj
135b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i8 [[T1]]
1363ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECKU:      [[T3:%.*]] = load i8, i8* @ck
137b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T4:%.*]] = zext i8 [[T3]]
138b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.smul
139b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU-NOT:  llvm.umul
140b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T5:%.*]] = mul nsw i32 [[T2]], [[T4]]
141b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz
142b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  ci = cj * ck;
143b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz}
144