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