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() {
18b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load i16* @sj
19b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load 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  //
25b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T1:%.*]] = load i16* @sj
26b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i16 [[T1]]
27b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T3:%.*]] = load 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
40b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load i16* @sj
41b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load 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  //
47b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T1:%.*]] = load i16* @sj
48b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i16 [[T1]]
49b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T3:%.*]] = load 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
62b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load i16* @sj
63b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load 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  //
69b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T1:%.*]] = load i16* @sj
70b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i16 [[T1]]
71b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T3:%.*]] = load 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
83b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load i8* @cj
84b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load 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  //
90b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T1:%.*]] = load i8* @cj
91b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i8 [[T1]]
92b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T3:%.*]] = load 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
105b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load i8* @cj
106b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load 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  //
112b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T1:%.*]] = load i8* @cj
113b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i8 [[T1]]
114b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T3:%.*]] = load 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
127b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load i8* @cj
128b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKS:        load 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  //
134b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T1:%.*]] = load i8* @cj
135b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T2:%.*]] = zext i8 [[T1]]
136b85403658a77e9c19c391c8f02bc7767544a25d9Will Dietz  // CHECKU:      [[T3:%.*]] = load 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