brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.4 KiB · 8d5bad7 Raw
274 lines · c
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK2// 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,CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-NORECOVER,CHECK-SANITIZE-UNREACHABLE3// 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,CHECK-SANITIZE,CHECK-SANITIZE-ANYRECOVER,CHECK-SANITIZE-RECOVER4// 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,CHECK-SANITIZE,CHECK-SANITIZE-TRAP,CHECK-SANITIZE-UNREACHABLE5 6// CHECK-SANITIZE-ANYRECOVER: @[[UNSIGNED_INT:.*]] = {{.*}} c"'unsigned int'\00" }7// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[SIGNED_INT:.*]] = {{.*}} c"'int'\00" }8// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_100:.*]] = {{.*}}, i32 100, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_INT]], i8 3, i32 0 }9// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_200:.*]] = {{.*}}, i32 200, i32 10 }, ptr @[[SIGNED_INT]], ptr @[[UNSIGNED_INT]], i8 3, i32 0 }10// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[UNSIGNED_CHAR:.*]] = {{.*}} c"'unsigned char'\00" }11// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_300:.*]] = {{.*}}, i32 300, i32 10 }, ptr @[[SIGNED_INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }12// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[SIGNED_CHAR:.*]] = {{.*}} c"'signed char'\00" }13// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_400:.*]] = {{.*}}, i32 400, i32 10 }, ptr @[[SIGNED_CHAR]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }14// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_500:.*]] = {{.*}}, i32 500, i32 10 }, ptr @[[UNSIGNED_CHAR]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }15// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_600:.*]] = {{.*}}, i32 600, i32 10 }, ptr @[[SIGNED_CHAR]], ptr @[[UNSIGNED_INT]], i8 3, i32 0 }16// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_700:.*]] = {{.*}}, i32 700, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }17// CHECK-SANITIZE-ANYRECOVER-NEXT: @[[LINE_800:.*]] = {{.*}}, i32 800, i32 10 }, ptr @[[SIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }18// CHECK-SANITIZE-ANYRECOVER: @[[UINT32:.*]] = {{.*}} c"'uint32_t' (aka 'unsigned int')\00" }19// CHECK-SANITIZE-ANYRECOVER: @[[INT32:.*]] = {{.*}} c"'int32_t' (aka 'int')\00" }20// CHECK-SANITIZE-ANYRECOVER: @[[LINE_900:.*]] = {{.*}}, i32 900, i32 10 }, ptr @[[UINT32]], ptr @[[INT32]], i8 3, i32 0 }21 22// ========================================================================== //23// The expected true-positives.24// These are implicit, potentially sign-altering, conversions.25// ========================================================================== //26 27// These 3 result (after optimizations) in simple 'icmp sge i32 %src, 0'.28 29// CHECK-LABEL: @unsigned_int_to_signed_int30// CHECK-SAME: i32 noundef %[[SRC:.*]])31signed int unsigned_int_to_signed_int(unsigned int src) {32  // CHECK: %[[SRC_ADDR:.*]] = alloca i3233  // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]34  // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]35  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize36  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize37  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize38  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:39  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize40  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i32 %[[DST]] to i64, !nosanitize41  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_100]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize42  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_100]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize43  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize44  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize45  // CHECK-SANITIZE: [[CONT]]:46  // CHECK-NEXT: ret i32 %[[DST]]47  // CHECK-NEXT: }48#line 10049  return src;50}51 52// CHECK-LABEL: @signed_int_to_unsigned_int53// CHECK-SAME: i32 noundef %[[SRC:.*]])54unsigned int signed_int_to_unsigned_int(signed int src) {55  // CHECK: %[[SRC_ADDR:.*]] = alloca i3256  // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]57  // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]58  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize59  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize60  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize61  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:62  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize63  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i32 %[[DST]] to i64, !nosanitize64  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_200]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize65  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_200]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize66  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize67  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize68  // CHECK-SANITIZE: [[CONT]]:69  // CHECK-NEXT: ret i32 %[[DST]]70  // CHECK-NEXT: }71#line 20072  return src;73}74 75// CHECK-LABEL: @signed_int_to_unsigned_char76// CHECK-SAME: i32 noundef %[[SRC:.*]])77unsigned char signed_int_to_unsigned_char(signed int src) {78  // CHECK: %[[SRC_ADDR:.*]] = alloca i3279  // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]80  // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]81  // CHECK-NEXT: %[[CONV:.*]] = trunc i32 %[[DST]] to i882  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize83  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize84  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize85  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:86  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize87  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i8 %[[CONV]] to i64, !nosanitize88  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_300]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize89  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_300]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize90  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize91  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize92  // CHECK-SANITIZE: [[CONT]]:93  // CHECK-NEXT: ret i8 %[[CONV]]94  // CHECK-NEXT: }95#line 30096  return src;97}98 99// These 3 result (after optimizations) in simple 'icmp sge i8 %src, 0'100 101// CHECK-LABEL: @signed_char_to_unsigned_char102// CHECK-SAME: (i8 noundef signext %[[SRC:.*]])103unsigned char signed_char_to_unsigned_char(signed char src) {104  // CHECK: %[[SRC_ADDR:.*]] = alloca i8105  // CHECK-NEXT: store i8 %[[SRC]], ptr %[[SRC_ADDR]]106  // CHECK-NEXT: %[[DST:.*]] = load i8, ptr %[[SRC_ADDR]]107  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize108  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize109  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize110  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:111  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i8 %[[DST]] to i64, !nosanitize112  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize113  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_400]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize114  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_400]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize115  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize116  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize117  // CHECK-SANITIZE: [[CONT]]:118  // CHECK-NEXT: ret i8 %[[DST]]119  // CHECK-NEXT: }120#line 400121  return src;122}123 124// CHECK-LABEL: @unsigned_char_to_signed_char125// CHECK-SAME: (i8 noundef zeroext %[[SRC:.*]])126signed char unsigned_char_to_signed_char(unsigned char src) {127  // CHECK: %[[SRC_ADDR:.*]] = alloca i8128  // CHECK-NEXT: store i8 %[[SRC]], ptr %[[SRC_ADDR]]129  // CHECK-NEXT: %[[DST:.*]] = load i8, ptr %[[SRC_ADDR]]130  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize131  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize132  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize133  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:134  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i8 %[[DST]] to i64, !nosanitize135  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize136  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_500]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize137  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_500]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize138  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize139  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize140  // CHECK-SANITIZE: [[CONT]]:141  // CHECK-NEXT: ret i8 %[[DST]]142  // CHECK-NEXT: }143#line 500144  return src;145}146 147// CHECK-LABEL: @signed_char_to_unsigned_int148// CHECK-SAME: (i8 noundef signext %[[SRC:.*]])149unsigned int signed_char_to_unsigned_int(signed char src) {150  // CHECK: %[[SRC_ADDR:.*]] = alloca i8151  // CHECK-NEXT: store i8 %[[SRC]], ptr %[[SRC_ADDR]]152  // CHECK-NEXT: %[[DST:.*]] = load i8, ptr %[[SRC_ADDR]]153  // CHECK-NEXT: %[[CONV:.*]] = sext i8 %[[DST]] to i32154  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize155  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize156  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize157  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:158  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i8 %[[DST]] to i64, !nosanitize159  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i32 %[[CONV]] to i64, !nosanitize160  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_600]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize161  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_600]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize162  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize163  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize164  // CHECK-SANITIZE: [[CONT]]:165  // CHECK-NEXT: ret i32 %[[CONV]]166  // CHECK-NEXT: }167#line 600168  return src;169}170 171// This one result (after optimizations) in 'icmp sge i8 (trunc i32 %src), 0'172 173// CHECK-LABEL: @unsigned_int_to_signed_char174// CHECK-SAME: i32 noundef %[[SRC:.*]])175signed char unsigned_int_to_signed_char(unsigned int src) {176  // CHECK: %[[SRC_ADDR:.*]] = alloca i32177  // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]178  // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]179  // CHECK-NEXT: %[[CONV:.*]] = trunc i32 %[[DST]] to i8180  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[CONV]], 0, !nosanitize181  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize182  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize183  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:184  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize185  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i8 %[[CONV]] to i64, !nosanitize186  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_700]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize187  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_700]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize188  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize189  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize190  // CHECK-SANITIZE: [[CONT]]:191  // CHECK-NEXT: ret i8 %[[CONV]]192  // CHECK-NEXT: }193#line 700194  return src;195}196 197// The worst one: 'xor i1 (icmp sge i8 (trunc i32 %x), 0), (icmp sge i32 %x, 0)'198 199// CHECK-LABEL: @signed_int_to_signed_char200// CHECK-SAME: i32 noundef %[[SRC:.*]])201signed char signed_int_to_signed_char(signed int x) {202  // CHECK: %[[SRC_ADDR:.*]] = alloca i32203  // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]204  // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]205  // CHECK-NEXT: %[[CONV:.*]] = trunc i32 %[[DST]] to i8206  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize207  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[CONV]], 0, !nosanitize208  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize209  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize210  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:211  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize212  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTCONV:.*]] = zext i8 %[[CONV]] to i64, !nosanitize213  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_800]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize214  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_800]], i64 %[[EXTSRC]], i64 %[[EXTCONV]]){{.*}}, !nosanitize215  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize216  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize217  // CHECK-SANITIZE: [[CONT]]:218  // CHECK-NEXT: ret i8 %[[CONV]]219  // CHECK-NEXT: }220#line 800221  return x;222}223 224// ========================================================================== //225// Check canonical type stuff226// ========================================================================== //227 228typedef unsigned int uint32_t;229typedef signed int int32_t;230 231// CHECK-LABEL: @uint32_t_to_int32_t232// CHECK-SAME: i32 noundef %[[SRC:.*]])233int32_t uint32_t_to_int32_t(uint32_t src) {234  // CHECK: %[[SRC_ADDR:.*]] = alloca i32235  // CHECK-NEXT: store i32 %[[SRC]], ptr %[[SRC_ADDR]]236  // CHECK-NEXT: %[[DST:.*]] = load i32, ptr %[[SRC_ADDR]]237  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[DST]], 0, !nosanitize238  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize239  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize240  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:241  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[DST]] to i64, !nosanitize242  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i32 %[[DST]] to i64, !nosanitize243  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_900]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize244  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_900]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize245  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize246  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize247  // CHECK-SANITIZE: [[CONT]]:248  // CHECK-NEXT: ret i32 %[[DST]]249  // CHECK-NEXT: }250#line 900251  return src;252}253 254// ========================================================================== //255// Check that explicit conversion does not interfere with implicit conversion256// ========================================================================== //257// These contain one implicit and one explicit sign-changing conversion.258// We want to make sure that we still diagnose the implicit conversion.259 260// Implicit sign-change after explicit sign-change.261// CHECK-LABEL: @explicit_conversion_interference0262unsigned int explicit_conversion_interference0(unsigned int c) {263  // CHECK-SANITIZE: call264  return (signed int)c;265}266 267// Implicit sign-change before explicit sign-change.268// CHECK-LABEL: @explicit_conversion_interference1269unsigned int explicit_conversion_interference1(unsigned int c) {270  // CHECK-SANITIZE: call271  signed int b;272  return (unsigned int)(b = c);273}274