308 lines · c
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-NOSANITIZE2 3// RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fno-sanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-NORECOVER,CHECK-SANITIZE-UNREACHABLE4// RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-recover=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-RECOVER5// RUN: %clang_cc1 -fsanitize=implicit-integer-sign-change -fsanitize-trap=implicit-integer-sign-change -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s -implicit-check-not="call void @__ubsan_handle_implicit_conversion" --check-prefixes=CHECK-SANITIZE,CHECK-SANITIZE-TRAP,CHECK-SANITIZE-UNREACHABLE6 7// CHECK-SANITIZE-ANYRECOVER-DAG: @[[INT:.*]] = {{.*}} c"'int'\00" }8// CHECK-SANITIZE-ANYRECOVER-DAG: @[[UNSIGNED_SHORT:.*]] = {{.*}} c"'unsigned short'\00" }9// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_100:.*]] = {{.*}}, i32 100, i32 11 }, ptr @[[INT]], ptr @[[UNSIGNED_SHORT]], i8 3, i32 0 }10// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_200:.*]] = {{.*}}, i32 200, i32 11 }, ptr @[[INT]], ptr @[[UNSIGNED_SHORT]], i8 3, i32 0 }11// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_300:.*]] = {{.*}}, i32 300, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_SHORT]], i8 3, i32 0 }12// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_400:.*]] = {{.*}}, i32 400, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_SHORT]], i8 3, i32 0 }13// CHECK-SANITIZE-ANYRECOVER-DAG: @[[SHORT:.*]] = {{.*}} c"'short'\00" }14// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_500:.*]] = {{.*}}, i32 500, i32 11 }, ptr @[[INT]], ptr @[[SHORT]], i8 3, i32 0 }15// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_600:.*]] = {{.*}}, i32 600, i32 11 }, ptr @[[INT]], ptr @[[SHORT]], i8 3, i32 0 }16// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_700:.*]] = {{.*}}, i32 700, i32 10 }, ptr @[[INT]], ptr @[[SHORT]], i8 3, i32 0 }17// CHECK-SANITIZE-ANYRECOVER-DAG: @[[LINE_800:.*]] = {{.*}}, i32 800, i32 10 }, ptr @[[INT]], ptr @[[SHORT]], i8 3, i32 0 }18 19unsigned short t0(unsigned short x) {20// CHECK-NOSANITIZE-LABEL: @t0(21// CHECK-NOSANITIZE-NEXT: entry:22// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 223// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 224// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 225// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], 126// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 227// CHECK-NOSANITIZE-NEXT: ret i16 [[X_RELOADED]]28//29// CHECK-SANITIZE-LABEL: @t0(30// CHECK-SANITIZE-NEXT: entry:31// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 232// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 233// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 234// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = zext i16 [[X_RELOADED]] to i3235// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], 136// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i1637// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !238// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], false, !nosanitize39// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize40// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:41// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize42// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize43// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize44// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_100]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize45// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_100]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize46// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize47// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize48// CHECK-SANITIZE: [[CONT]]:49// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 250// CHECK-SANITIZE-NEXT: ret i16 [[X_RELOADED]]51#line 10052 return x++;53}54unsigned short t1(unsigned short x) {55// CHECK-NOSANITIZE-LABEL: @t1(56// CHECK-NOSANITIZE-NEXT: entry:57// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 258// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 259// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 260// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], -161// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 262// CHECK-NOSANITIZE-NEXT: ret i16 [[X_RELOADED]]63//64// CHECK-SANITIZE-LABEL: @t1(65// CHECK-SANITIZE-NEXT: entry:66// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 267// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 268// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 269// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = zext i16 [[X_RELOADED]] to i3270// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], -171// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i1672// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !273// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], false, !nosanitize74// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize75// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:76// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize77// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize78// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize79// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_200]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize80// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_200]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize81// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize82// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize83// CHECK-SANITIZE: [[CONT]]:84// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 285// CHECK-SANITIZE-NEXT: ret i16 [[X_RELOADED]]86#line 20087 return x--;88}89 90unsigned short t2(unsigned short x) {91// CHECK-NOSANITIZE-LABEL: @t2(92// CHECK-NOSANITIZE-NEXT: entry:93// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 294// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 295// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 296// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], 197// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 298// CHECK-NOSANITIZE-NEXT: ret i16 [[INC]]99//100// CHECK-SANITIZE-LABEL: @t2(101// CHECK-SANITIZE-NEXT: entry:102// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2103// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2104// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2105// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = zext i16 [[X_RELOADED]] to i32106// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], 1107// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i16108// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !2109// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], false, !nosanitize110// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize111// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:112// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize113// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize114// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize115// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_300]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize116// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_300]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize117// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize118// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize119// CHECK-SANITIZE: [[CONT]]:120// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 2121// CHECK-SANITIZE-NEXT: ret i16 [[X_PROMOTED_DEMOTED]]122#line 300123 return ++x;124}125 126unsigned short t3(unsigned short x) {127// CHECK-NOSANITIZE-LABEL: @t3(128// CHECK-NOSANITIZE-NEXT: entry:129// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2130// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2131// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2132// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], -1133// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 2134// CHECK-NOSANITIZE-NEXT: ret i16 [[INC]]135//136// CHECK-SANITIZE-LABEL: @t3(137// CHECK-SANITIZE-NEXT: entry:138// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2139// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2140// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2141// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = zext i16 [[X_RELOADED]] to i32142// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], -1143// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i16144// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !2145// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], false, !nosanitize146// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize147// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:148// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize149// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize150// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize151// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_400]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize152// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_400]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize153// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize154// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize155// CHECK-SANITIZE: [[CONT]]:156// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 2157// CHECK-SANITIZE-NEXT: ret i16 [[X_PROMOTED_DEMOTED]]158#line 400159 return --x;160}161 162signed short t4(signed short x) {163// CHECK-NOSANITIZE-LABEL: @t4(164// CHECK-NOSANITIZE-NEXT: entry:165// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2166// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2167// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2168// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], 1169// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 2170// CHECK-NOSANITIZE-NEXT: ret i16 [[X_RELOADED]]171//172// CHECK-SANITIZE-LABEL: @t4(173// CHECK-SANITIZE-NEXT: entry:174// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2175// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2176// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2177// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = sext i16 [[X_RELOADED]] to i32178// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], 1179// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i16180// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !2181// CHECK-SANITIZE-NEXT: [[DST_NEGATIVITYCHECK:%.*]] = icmp slt i16 [[X_PROMOTED_DEMOTED]], 0, !nosanitize !2182// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], [[DST_NEGATIVITYCHECK]], !nosanitize183// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize184// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:185// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize186// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize187// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize188// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_500]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize189// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_500]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize190// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize191// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize192// CHECK-SANITIZE: [[CONT]]:193// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 2194// CHECK-SANITIZE-NEXT: ret i16 [[X_RELOADED]]195#line 500196 return x++;197}198signed short t5(signed short x) {199// CHECK-NOSANITIZE-LABEL: @t5(200// CHECK-NOSANITIZE-NEXT: entry:201// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2202// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2203// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2204// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], -1205// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 2206// CHECK-NOSANITIZE-NEXT: ret i16 [[X_RELOADED]]207//208// CHECK-SANITIZE-LABEL: @t5(209// CHECK-SANITIZE-NEXT: entry:210// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2211// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2212// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2213// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = sext i16 [[X_RELOADED]] to i32214// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], -1215// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i16216// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !2217// CHECK-SANITIZE-NEXT: [[DST_NEGATIVITYCHECK:%.*]] = icmp slt i16 [[X_PROMOTED_DEMOTED]], 0, !nosanitize !2218// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], [[DST_NEGATIVITYCHECK]], !nosanitize219// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize220// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:221// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize222// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize223// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize224// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_600]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize225// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_600]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize226// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize227// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize228// CHECK-SANITIZE: [[CONT]]:229// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 2230// CHECK-SANITIZE-NEXT: ret i16 [[X_RELOADED]]231#line 600232 return x--;233}234 235signed short t6(signed short x) {236// CHECK-NOSANITIZE-LABEL: @t6(237// CHECK-NOSANITIZE-NEXT: entry:238// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2239// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2240// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2241// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], 1242// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 2243// CHECK-NOSANITIZE-NEXT: ret i16 [[INC]]244//245// CHECK-SANITIZE-LABEL: @t6(246// CHECK-SANITIZE-NEXT: entry:247// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2248// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2249// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2250// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = sext i16 [[X_RELOADED]] to i32251// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], 1252// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i16253// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !2254// CHECK-SANITIZE-NEXT: [[DST_NEGATIVITYCHECK:%.*]] = icmp slt i16 [[X_PROMOTED_DEMOTED]], 0, !nosanitize !2255// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], [[DST_NEGATIVITYCHECK]], !nosanitize256// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize257// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:258// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize259// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize260// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize261// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_700]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize262// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_700]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize263// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize264// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize265// CHECK-SANITIZE: [[CONT]]:266// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 2267// CHECK-SANITIZE-NEXT: ret i16 [[X_PROMOTED_DEMOTED]]268#line 700269 return ++x;270}271 272signed short t7(signed short x) {273// CHECK-NOSANITIZE-LABEL: @t7(274// CHECK-NOSANITIZE-NEXT: entry:275// CHECK-NOSANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2276// CHECK-NOSANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2277// CHECK-NOSANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2278// CHECK-NOSANITIZE-NEXT: [[INC:%.*]] = add i16 [[X_RELOADED]], -1279// CHECK-NOSANITIZE-NEXT: store i16 [[INC]], ptr [[X_ADDR]], align 2280// CHECK-NOSANITIZE-NEXT: ret i16 [[INC]]281//282// CHECK-SANITIZE-LABEL: @t7(283// CHECK-SANITIZE-NEXT: entry:284// CHECK-SANITIZE-NEXT: [[X_ADDR:%.*]] = alloca i16, align 2285// CHECK-SANITIZE-NEXT: store i16 [[X:%.*]], ptr [[X_ADDR]], align 2286// CHECK-SANITIZE-NEXT: [[X_RELOADED:%.*]] = load i16, ptr [[X_ADDR]], align 2287// CHECK-SANITIZE-NEXT: [[X_PROMOTED:%.*]] = sext i16 [[X_RELOADED]] to i32288// CHECK-SANITIZE-NEXT: [[INC:%.*]] = add i32 [[X_PROMOTED]], -1289// CHECK-SANITIZE-NEXT: [[X_PROMOTED_DEMOTED:%.*]] = trunc i32 [[INC]] to i16290// CHECK-SANITIZE-NEXT: [[SRC_INC_NEGATIVITYCHECK:%.*]] = icmp slt i32 [[INC]], 0, !nosanitize !2291// CHECK-SANITIZE-NEXT: [[DST_NEGATIVITYCHECK:%.*]] = icmp slt i16 [[X_PROMOTED_DEMOTED]], 0, !nosanitize !2292// CHECK-SANITIZE-NEXT: [[SIGNCHANGECHECK:%.*]] = icmp eq i1 [[SRC_INC_NEGATIVITYCHECK]], [[DST_NEGATIVITYCHECK]], !nosanitize293// CHECK-SANITIZE-NEXT: br i1 [[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_X_PROMOTEDERSION:[^,]+]],{{.*}} !nosanitize294// CHECK-SANITIZE: [[HANDLER_IMPLICIT_X_PROMOTEDERSION]]:295// CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize296// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP1:%.*]] = zext i32 [[INC]] to i64, !nosanitize297// CHECK-SANITIZE-ANYRECOVER-NEXT: [[TMP2:%.*]] = zext i16 [[X_PROMOTED_DEMOTED]] to i64, !nosanitize298// CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_800]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize299// CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_800]], i64 [[TMP1]], i64 [[TMP2]]) #2, !nosanitize300// CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize301// CHECK-SANITIZE-RECOVER-NEXT: br label %[[CONT]], !nosanitize302// CHECK-SANITIZE: [[CONT]]:303// CHECK-SANITIZE-NEXT: store i16 [[X_PROMOTED_DEMOTED]], ptr [[X_ADDR]], align 2304// CHECK-SANITIZE-NEXT: ret i16 [[X_PROMOTED_DEMOTED]]305#line 800306 return --x;307}308