brintos

brintos / llvm-project-archived public Read only

0
0
Text · 163.7 KiB · 197ec53 Raw
2562 lines · c
1// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK2 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,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,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,CHECK-SANITIZE,CHECK-SANITIZE-TRAP,CHECK-SANITIZE-UNREACHABLE6 7// LHS can be of 2 types: unsigned char and signed char8// RHS can be of 4 types: unsigned char, signed char, unsigned int, signed int.9// Therefore there are total of 8 tests per group.10 11// Also there are total of 10 compound operators (+=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=)12 13// CHECK-SANITIZE-ANYRECOVER: @[[INT:.*]] = {{.*}} c"'int'\00" }14// CHECK-SANITIZE-ANYRECOVER: @[[UNSIGNED_CHAR:.*]] = {{.*}} c"'unsigned char'\00" }15// CHECK-SANITIZE-ANYRECOVER: @[[LINE_100_SIGN_CHANGE:.*]] = {{.*}}, i32 100, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }16// CHECK-SANITIZE-ANYRECOVER: @[[LINE_200_SIGN_CHANGE:.*]] = {{.*}}, i32 200, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }17// CHECK-SANITIZE-ANYRECOVER: @[[LINE_400_SIGN_CHANGE:.*]] = {{.*}}, i32 400, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }18// CHECK-SANITIZE-ANYRECOVER: @[[SIGNED_CHAR:.*]] = {{.*}} c"'signed char'\00" }19// CHECK-SANITIZE-ANYRECOVER: @[[LINE_500_SIGN_CHANGE:.*]] = {{.*}}, i32 500, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }20// CHECK-SANITIZE-ANYRECOVER: @[[LINE_600_SIGN_CHANGE:.*]] = {{.*}}, i32 600, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }21// CHECK-SANITIZE-ANYRECOVER: @[[UNSIGNED_INT:.*]] = {{.*}} c"'unsigned int'\00" }22// CHECK-SANITIZE-ANYRECOVER: @[[LINE_700_SIGN_CHANGE:.*]] = {{.*}}, i32 700, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }23// CHECK-SANITIZE-ANYRECOVER: @[[LINE_800_SIGN_CHANGE:.*]] = {{.*}}, i32 800, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }24 25// CHECK-SANITIZE-ANYRECOVER: @[[LINE_900_SIGN_CHANGE:.*]] = {{.*}}, i32 900, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }26// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1000_SIGN_CHANGE:.*]] = {{.*}}, i32 1000, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }27// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1200_SIGN_CHANGE:.*]] = {{.*}}, i32 1200, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }28// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1300_SIGN_CHANGE:.*]] = {{.*}}, i32 1300, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }29// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1400_SIGN_CHANGE:.*]] = {{.*}}, i32 1400, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }30// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1500_SIGN_CHANGE:.*]] = {{.*}}, i32 1500, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }31// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1600_SIGN_CHANGE:.*]] = {{.*}}, i32 1600, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }32 33// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1700_SIGN_CHANGE:.*]] = {{.*}}, i32 1700, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }34// CHECK-SANITIZE-ANYRECOVER: @[[LINE_1800_SIGN_CHANGE:.*]] = {{.*}}, i32 1800, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }35// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2000_SIGN_CHANGE:.*]] = {{.*}}, i32 2000, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }36// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2100_SIGN_CHANGE:.*]] = {{.*}}, i32 2100, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }37// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2200_SIGN_CHANGE:.*]] = {{.*}}, i32 2200, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }38// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2300_SIGN_CHANGE:.*]] = {{.*}}, i32 2300, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }39// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2400_SIGN_CHANGE:.*]] = {{.*}}, i32 2400, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }40 41// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2500_SIGN_CHANGE:.*]] = {{.*}}, i32 2500, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }42// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2600_SIGN_CHANGE:.*]] = {{.*}}, i32 2600, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }43// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2800_SIGN_CHANGE:.*]] = {{.*}}, i32 2800, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }44// CHECK-SANITIZE-ANYRECOVER: @[[LINE_2900_SIGN_CHANGE:.*]] = {{.*}}, i32 2900, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }45// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3000_SIGN_CHANGE:.*]] = {{.*}}, i32 3000, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }46// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3100_SIGN_CHANGE:.*]] = {{.*}}, i32 3100, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }47// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3200_SIGN_CHANGE:.*]] = {{.*}}, i32 3200, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }48 49// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3300_SIGN_CHANGE:.*]] = {{.*}}, i32 3300, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }50// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3400_SIGN_CHANGE:.*]] = {{.*}}, i32 3400, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }51// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3600_SIGN_CHANGE:.*]] = {{.*}}, i32 3600, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }52// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3700_SIGN_CHANGE:.*]] = {{.*}}, i32 3700, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }53// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3800_SIGN_CHANGE:.*]] = {{.*}}, i32 3800, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }54// CHECK-SANITIZE-ANYRECOVER: @[[LINE_3900_SIGN_CHANGE:.*]] = {{.*}}, i32 3900, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }55// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4000_SIGN_CHANGE:.*]] = {{.*}}, i32 4000, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }56 57// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4100_SIGN_CHANGE:.*]] = {{.*}}, i32 4100, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }58// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4200_SIGN_CHANGE:.*]] = {{.*}}, i32 4200, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }59// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4300_SIGN_CHANGE:.*]] = {{.*}}, i32 4300, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }60// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4400_SIGN_CHANGE:.*]] = {{.*}}, i32 4400, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }61// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4500_SIGN_CHANGE:.*]] = {{.*}}, i32 4500, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }62// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4600_SIGN_CHANGE:.*]] = {{.*}}, i32 4600, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }63// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4700_SIGN_CHANGE:.*]] = {{.*}}, i32 4700, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }64// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4800_SIGN_CHANGE:.*]] = {{.*}}, i32 4800, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }65 66// CHECK-SANITIZE-ANYRECOVER: @[[LINE_4900_SIGN_CHANGE:.*]] = {{.*}}, i32 4900, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }67// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5000_SIGN_CHANGE:.*]] = {{.*}}, i32 5000, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }68// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5100_SIGN_CHANGE:.*]] = {{.*}}, i32 5100, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }69// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5200_SIGN_CHANGE:.*]] = {{.*}}, i32 5200, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }70// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5300_SIGN_CHANGE:.*]] = {{.*}}, i32 5300, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }71// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5400_SIGN_CHANGE:.*]] = {{.*}}, i32 5400, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }72// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5500_SIGN_CHANGE:.*]] = {{.*}}, i32 5500, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }73// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5600_SIGN_CHANGE:.*]] = {{.*}}, i32 5600, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }74 75// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5700_SIGN_CHANGE:.*]] = {{.*}}, i32 5700, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }76// CHECK-SANITIZE-ANYRECOVER: @[[LINE_5800_SIGN_CHANGE:.*]] = {{.*}}, i32 5800, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }77// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6000_SIGN_CHANGE:.*]] = {{.*}}, i32 6000, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }78// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6100_SIGN_CHANGE:.*]] = {{.*}}, i32 6100, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }79// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6200_SIGN_CHANGE:.*]] = {{.*}}, i32 6200, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }80// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6300_SIGN_CHANGE:.*]] = {{.*}}, i32 6300, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }81// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6400_SIGN_CHANGE:.*]] = {{.*}}, i32 6400, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }82 83// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6500_SIGN_CHANGE:.*]] = {{.*}}, i32 6500, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }84// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6600_SIGN_CHANGE:.*]] = {{.*}}, i32 6600, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }85// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6800_SIGN_CHANGE:.*]] = {{.*}}, i32 6800, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }86// CHECK-SANITIZE-ANYRECOVER: @[[LINE_6900_SIGN_CHANGE:.*]] = {{.*}}, i32 6900, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }87// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7000_SIGN_CHANGE:.*]] = {{.*}}, i32 7000, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }88// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7100_SIGN_CHANGE:.*]] = {{.*}}, i32 7100, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }89// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7200_SIGN_CHANGE:.*]] = {{.*}}, i32 7200, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }90 91// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7300_SIGN_CHANGE:.*]] = {{.*}}, i32 7300, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }92// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7400_SIGN_CHANGE:.*]] = {{.*}}, i32 7400, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }93// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7600_SIGN_CHANGE:.*]] = {{.*}}, i32 7600, i32 10 }, ptr @[[INT]], ptr @[[UNSIGNED_CHAR]], i8 3, i32 0 }94// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7700_SIGN_CHANGE:.*]] = {{.*}}, i32 7700, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }95// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7800_SIGN_CHANGE:.*]] = {{.*}}, i32 7800, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }96// CHECK-SANITIZE-ANYRECOVER: @[[LINE_7900_SIGN_CHANGE:.*]] = {{.*}}, i32 7900, i32 10 }, ptr @[[UNSIGNED_INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }97// CHECK-SANITIZE-ANYRECOVER: @[[LINE_8000_SIGN_CHANGE:.*]] = {{.*}}, i32 8000, i32 10 }, ptr @[[INT]], ptr @[[SIGNED_CHAR]], i8 3, i32 0 }98 99//----------------------------------------------------------------------------//100// Compound add operator.                                                     //101//----------------------------------------------------------------------------//102 103// CHECK-LABEL: @unsigned_char_add_signed_char_unsigned_char104void unsigned_char_add_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {105  // CHECK: {106  // CHECK-NEXT: entry:107  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8108  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1109  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8110  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1111  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1112  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32113  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8114  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1115  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32116  // CHECK-NEXT: %[[SRC:.*]] = add nsw i32 %[[LHSEXT]], %[[RHSEXT]]117  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8118  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize119  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize120  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize121  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:122  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize123  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize124  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize125  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize126  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize127  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize128  // CHECK-SANITIZE: [[CONT]]:129  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1130  // CHECK-NEXT: ret void131  // CHECK-NEXT: }132#line 100133  (*LHS) += RHS;134}135 136// CHECK-LABEL: @unsigned_char_add_signed_char_signed_char137void unsigned_char_add_signed_char_signed_char(unsigned char *LHS, signed char RHS) {138  // CHECK: {139  // CHECK-NEXT: entry:140  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8141  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1142  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8143  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1144  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1145  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32146  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8147  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1148  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32149  // CHECK-NEXT: %[[SRC:.*]] = add nsw i32 %[[LHSEXT]], %[[RHSEXT]]150  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8151  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize152  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize153  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize154  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:155  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize156  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize157  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize158  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize159  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize160  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize161  // CHECK-SANITIZE: [[CONT]]:162  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1163  // CHECK-NEXT: ret void164  // CHECK-NEXT: }165#line 200166  (*LHS) += RHS;167}168 169// CHECK-LABEL: @unsigned_char_add_signed_char_unsigned_int170void unsigned_char_add_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {171#line 300172  (*LHS) += RHS;173}174 175// CHECK-LABEL: @unsigned_char_add_signed_char_signed_int176void unsigned_char_add_signed_char_signed_int(unsigned char *LHS, signed int RHS) {177  // CHECK: {178  // CHECK-NEXT: entry:179  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8180  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4181  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8182  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4183  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4184  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8185  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1186  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32187  // CHECK-NEXT: %[[SRC:.*]] = add nsw i32 %[[LHSEXT]], %[[RHS]]188  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8189  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize190  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize191  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize192  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:193  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize194  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize195  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize196  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize197  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize198  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize199  // CHECK-SANITIZE: [[CONT]]:200  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1201  // CHECK-NEXT: ret void202  // CHECK-NEXT: }203#line 400204  (*LHS) += RHS;205}206 207// CHECK-LABEL: @signed_char_add_unsigned_char208void signed_char_add_unsigned_char(signed char *LHS, unsigned char RHS) {209  // CHECK: {210  // CHECK-NEXT: entry:211  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8212  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1213  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8214  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1215  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1216  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32217  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8218  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1219  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32220  // CHECK-NEXT: %[[SRC:.*]] = add nsw i32 %[[LHSEXT]], %[[RHSEXT]]221  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8222  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize223  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize224  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize225  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize226  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:227  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize228  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize229  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize230  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize231  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize232  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize233  // CHECK-SANITIZE: [[CONT]]:234  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1235  // CHECK-NEXT: ret void236  // CHECK-NEXT: }237#line 500238  (*LHS) += RHS;239}240 241// CHECK-LABEL: @signed_char_add_signed_char242void signed_char_add_signed_char(signed char *LHS, signed char RHS) {243  // CHECK: {244  // CHECK-NEXT: entry:245  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8246  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1247  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8248  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1249  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1250  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32251  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8252  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1253  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32254  // CHECK-NEXT: %[[SRC:.*]] = add nsw i32 %[[LHSEXT]], %[[RHSEXT]]255  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8256  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize257  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize258  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize259  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize260  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:261  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize262  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize263  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize264  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize265  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize266  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize267  // CHECK-SANITIZE: [[CONT]]:268  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1269  // CHECK-NEXT: ret void270  // CHECK-NEXT: }271#line 600272  (*LHS) += RHS;273}274 275// CHECK-LABEL: @signed_char_add_signed_char_unsigned_int276void signed_char_add_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {277  // CHECK: {278  // CHECK-NEXT: entry:279  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8280  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4281  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8282  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4283  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4284  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8285  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1286  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32287  // CHECK-NEXT: %[[SRC:.*]] = add i32 %[[LHSEXT]], %[[RHS]]288  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8289  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize290  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize291  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize292  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:293  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize294  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize295  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize296  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize297  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize298  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize299  // CHECK-SANITIZE: [[CONT]]:300  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1301  // CHECK-NEXT: ret void302  // CHECK-NEXT: }303#line 700304  (*LHS) += RHS;305}306 307// CHECK-LABEL: @signed_char_add_signed_char_signed_int308void signed_char_add_signed_char_signed_int(signed char *LHS, signed int RHS) {309  // CHECK: {310  // CHECK-NEXT: entry:311  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8312  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4313  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8314  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4315  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4316  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8317  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1318  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32319  // CHECK-NEXT: %[[SRC:.*]] = add nsw i32 %[[LHSEXT]], %[[RHS]]320  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8321  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize322  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize323  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize324  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize325  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:326  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize327  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize328  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize329  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize330  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize331  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize332  // CHECK-SANITIZE: [[CONT]]:333  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1334  // CHECK-NEXT: ret void335  // CHECK-NEXT: }336#line 800337  (*LHS) += RHS;338}339 340//----------------------------------------------------------------------------//341// Compound subtract operator.                                                //342//----------------------------------------------------------------------------//343 344// CHECK-LABEL: @unsigned_char_sub_signed_char_unsigned_char345void unsigned_char_sub_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {346  // CHECK: {347  // CHECK-NEXT: entry:348  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8349  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1350  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8351  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1352  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1353  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32354  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8355  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1356  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32357  // CHECK-NEXT: %[[SRC:.*]] = sub nsw i32 %[[LHSEXT]], %[[RHSEXT]]358  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8359  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize360  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize361  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize362  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:363  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize364  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize365  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize366  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize367  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize368  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize369  // CHECK-SANITIZE: [[CONT]]:370  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1371  // CHECK-NEXT: ret void372  // CHECK-NEXT: }373#line 900374  (*LHS) -= RHS;375}376 377// CHECK-LABEL: @unsigned_char_sub_signed_char_signed_char378void unsigned_char_sub_signed_char_signed_char(unsigned char *LHS, signed char RHS) {379  // CHECK: {380  // CHECK-NEXT: entry:381  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8382  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1383  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8384  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1385  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1386  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32387  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8388  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1389  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32390  // CHECK-NEXT: %[[SRC:.*]] = sub nsw i32 %[[LHSEXT]], %[[RHSEXT]]391  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8392  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize393  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize394  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize395  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:396  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize397  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize398  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize399  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize400  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize401  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize402  // CHECK-SANITIZE: [[CONT]]:403  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1404  // CHECK-NEXT: ret void405  // CHECK-NEXT: }406#line 1000407  (*LHS) -= RHS;408}409 410// CHECK-LABEL: @unsigned_char_sub_signed_char_unsigned_int411void unsigned_char_sub_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {412#line 1100413  (*LHS) -= RHS;414}415 416// CHECK-LABEL: @unsigned_char_sub_signed_char_signed_int417void unsigned_char_sub_signed_char_signed_int(unsigned char *LHS, signed int RHS) {418  // CHECK: {419  // CHECK-NEXT: entry:420  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8421  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4422  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8423  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4424  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4425  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8426  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1427  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32428  // CHECK-NEXT: %[[SRC:.*]] = sub nsw i32 %[[LHSEXT]], %[[RHS]]429  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8430  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize431  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize432  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize433  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:434  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize435  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize436  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize437  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize438  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize439  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize440  // CHECK-SANITIZE: [[CONT]]:441  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1442  // CHECK-NEXT: ret void443  // CHECK-NEXT: }444#line 1200445  (*LHS) -= RHS;446}447 448// CHECK-LABEL: @signed_char_sub_unsigned_char449void signed_char_sub_unsigned_char(signed char *LHS, unsigned char RHS) {450  // CHECK: {451  // CHECK-NEXT: entry:452  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8453  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1454  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8455  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1456  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1457  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32458  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8459  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1460  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32461  // CHECK-NEXT: %[[SRC:.*]] = sub nsw i32 %[[LHSEXT]], %[[RHSEXT]]462  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8463  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize464  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize465  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize466  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize467  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:468  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize469  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize470  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize471  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize472  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize473  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize474  // CHECK-SANITIZE: [[CONT]]:475  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1476  // CHECK-NEXT: ret void477  // CHECK-NEXT: }478#line 1300479  (*LHS) -= RHS;480}481 482// CHECK-LABEL: @signed_char_sub_signed_char483void signed_char_sub_signed_char(signed char *LHS, signed char RHS) {484  // CHECK: {485  // CHECK-NEXT: entry:486  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8487  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1488  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8489  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1490  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1491  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32492  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8493  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1494  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32495  // CHECK-NEXT: %[[SRC:.*]] = sub nsw i32 %[[LHSEXT]], %[[RHSEXT]]496  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8497  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize498  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize499  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize500  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize501  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:502  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize503  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize504  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize505  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize506  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize507  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize508  // CHECK-SANITIZE: [[CONT]]:509  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1510  // CHECK-NEXT: ret void511  // CHECK-NEXT: }512#line 1400513  (*LHS) -= RHS;514}515 516// CHECK-LABEL: @signed_char_sub_signed_char_unsigned_int517void signed_char_sub_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {518  // CHECK: {519  // CHECK-NEXT: entry:520  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8521  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4522  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8523  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4524  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4525  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8526  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1527  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32528  // CHECK-NEXT: %[[SRC:.*]] = sub i32 %[[LHSEXT]], %[[RHS]]529  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8530  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize531  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize532  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize533  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:534  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize535  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize536  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize537  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize538  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize539  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize540  // CHECK-SANITIZE: [[CONT]]:541  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1542  // CHECK-NEXT: ret void543  // CHECK-NEXT: }544#line 1500545  (*LHS) -= RHS;546}547 548// CHECK-LABEL: @signed_char_sub_signed_char_signed_int549void signed_char_sub_signed_char_signed_int(signed char *LHS, signed int RHS) {550  // CHECK: {551  // CHECK-NEXT: entry:552  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8553  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4554  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8555  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4556  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4557  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8558  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1559  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32560  // CHECK-NEXT: %[[SRC:.*]] = sub nsw i32 %[[LHSEXT]], %[[RHS]]561  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8562  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize563  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize564  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize565  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize566  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:567  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize568  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize569  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize570  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize571  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize572  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize573  // CHECK-SANITIZE: [[CONT]]:574  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1575  // CHECK-NEXT: ret void576  // CHECK-NEXT: }577#line 1600578  (*LHS) -= RHS;579}580 581//----------------------------------------------------------------------------//582// Compound multiply operator.                                                //583//----------------------------------------------------------------------------//584 585// CHECK-LABEL: @unsigned_char_mul_signed_char_unsigned_char586void unsigned_char_mul_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {587  // CHECK: {588  // CHECK-NEXT: entry:589  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8590  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1591  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8592  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1593  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1594  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32595  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8596  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1597  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32598  // CHECK-NEXT: %[[SRC:.*]] = mul nsw i32 %[[LHSEXT]], %[[RHSEXT]]599  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8600  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize601  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize602  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize603  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:604  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize605  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize606  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize607  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize608  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize609  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize610  // CHECK-SANITIZE: [[CONT]]:611  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1612  // CHECK-NEXT: ret void613  // CHECK-NEXT: }614#line 1700615  (*LHS) *= RHS;616}617 618// CHECK-LABEL: @unsigned_char_mul_signed_char_signed_char619void unsigned_char_mul_signed_char_signed_char(unsigned char *LHS, signed char RHS) {620  // CHECK: {621  // CHECK-NEXT: entry:622  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8623  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1624  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8625  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1626  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1627  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32628  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8629  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1630  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32631  // CHECK-NEXT: %[[SRC:.*]] = mul nsw i32 %[[LHSEXT]], %[[RHSEXT]]632  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8633  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize634  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize635  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize636  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:637  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize638  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize639  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_1800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize640  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_1800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize641  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize642  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize643  // CHECK-SANITIZE: [[CONT]]:644  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1645  // CHECK-NEXT: ret void646  // CHECK-NEXT: }647#line 1800648  (*LHS) *= RHS;649}650 651// CHECK-LABEL: @unsigned_char_mul_signed_char_unsigned_int652void unsigned_char_mul_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {653#line 1900654  (*LHS) *= RHS;655}656 657// CHECK-LABEL: @unsigned_char_mul_signed_char_signed_int658void unsigned_char_mul_signed_char_signed_int(unsigned char *LHS, signed int RHS) {659  // CHECK: {660  // CHECK-NEXT: entry:661  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8662  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4663  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8664  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4665  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4666  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8667  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1668  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32669  // CHECK-NEXT: %[[SRC:.*]] = mul nsw i32 %[[LHSEXT]], %[[RHS]]670  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8671  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize672  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize673  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize674  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:675  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize676  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize677  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize678  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize679  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize680  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize681  // CHECK-SANITIZE: [[CONT]]:682  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1683  // CHECK-NEXT: ret void684  // CHECK-NEXT: }685#line 2000686  (*LHS) *= RHS;687}688 689// CHECK-LABEL: @signed_char_mul_unsigned_char690void signed_char_mul_unsigned_char(signed char *LHS, unsigned char RHS) {691  // CHECK: {692  // CHECK-NEXT: entry:693  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8694  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1695  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8696  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1697  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1698  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32699  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8700  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1701  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32702  // CHECK-NEXT: %[[SRC:.*]] = mul nsw i32 %[[LHSEXT]], %[[RHSEXT]]703  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8704  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize705  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize706  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize707  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize708  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:709  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize710  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize711  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize712  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize713  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize714  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize715  // CHECK-SANITIZE: [[CONT]]:716  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1717  // CHECK-NEXT: ret void718  // CHECK-NEXT: }719#line 2100720  (*LHS) *= RHS;721}722 723// CHECK-LABEL: @signed_char_mul_signed_char724void signed_char_mul_signed_char(signed char *LHS, signed char RHS) {725  // CHECK: {726  // CHECK-NEXT: entry:727  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8728  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1729  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8730  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1731  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1732  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32733  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8734  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1735  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32736  // CHECK-NEXT: %[[SRC:.*]] = mul nsw i32 %[[LHSEXT]], %[[RHSEXT]]737  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8738  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize739  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize740  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize741  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize742  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:743  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize744  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize745  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize746  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize747  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize748  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize749  // CHECK-SANITIZE: [[CONT]]:750  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1751  // CHECK-NEXT: ret void752  // CHECK-NEXT: }753#line 2200754  (*LHS) *= RHS;755}756 757// CHECK-LABEL: @signed_char_mul_signed_char_unsigned_int758void signed_char_mul_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {759  // CHECK: {760  // CHECK-NEXT: entry:761  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8762  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4763  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8764  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4765  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4766  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8767  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1768  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32769  // CHECK-NEXT: %[[SRC:.*]] = mul i32 %[[LHSEXT]], %[[RHS]]770  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8771  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize772  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize773  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize774  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:775  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize776  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize777  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize778  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize779  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize780  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize781  // CHECK-SANITIZE: [[CONT]]:782  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1783  // CHECK-NEXT: ret void784  // CHECK-NEXT: }785#line 2300786  (*LHS) *= RHS;787}788 789// CHECK-LABEL: @signed_char_mul_signed_char_signed_int790void signed_char_mul_signed_char_signed_int(signed char *LHS, signed int RHS) {791  // CHECK: {792  // CHECK-NEXT: entry:793  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8794  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4795  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8796  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4797  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4798  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8799  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1800  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32801  // CHECK-NEXT: %[[SRC:.*]] = mul nsw i32 %[[LHSEXT]], %[[RHS]]802  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8803  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize804  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize805  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize806  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize807  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:808  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize809  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize810  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize811  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize812  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize813  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize814  // CHECK-SANITIZE: [[CONT]]:815  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1816  // CHECK-NEXT: ret void817  // CHECK-NEXT: }818#line 2400819  (*LHS) *= RHS;820}821 822//----------------------------------------------------------------------------//823// Compound divide operator.                                                  //824//----------------------------------------------------------------------------//825 826// CHECK-LABEL: @unsigned_char_div_signed_char_unsigned_char827void unsigned_char_div_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {828  // CHECK: {829  // CHECK-NEXT: entry:830  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8831  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1832  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8833  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1834  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1835  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32836  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8837  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1838  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32839  // CHECK-NEXT: %[[SRC:.*]] = sdiv i32 %[[LHSEXT]], %[[RHSEXT]]840  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8841  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize842  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize843  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize844  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:845  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize846  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize847  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize848  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize849  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize850  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize851  // CHECK-SANITIZE: [[CONT]]:852  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1853  // CHECK-NEXT: ret void854  // CHECK-NEXT: }855#line 2500856  (*LHS) /= RHS;857}858 859// CHECK-LABEL: @unsigned_char_div_signed_char_signed_char860void unsigned_char_div_signed_char_signed_char(unsigned char *LHS, signed char RHS) {861  // CHECK: {862  // CHECK-NEXT: entry:863  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8864  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1865  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8866  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1867  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1868  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32869  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8870  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1871  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32872  // CHECK-NEXT: %[[SRC:.*]] = sdiv i32 %[[LHSEXT]], %[[RHSEXT]]873  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8874  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize875  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize876  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize877  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:878  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize879  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize880  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize881  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize882  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize883  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize884  // CHECK-SANITIZE: [[CONT]]:885  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1886  // CHECK-NEXT: ret void887  // CHECK-NEXT: }888#line 2600889  (*LHS) /= RHS;890}891 892// CHECK-LABEL: @unsigned_char_div_signed_char_unsigned_int893void unsigned_char_div_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {894#line 2700895  (*LHS) /= RHS;896}897 898// CHECK-LABEL: @unsigned_char_div_signed_char_signed_int899void unsigned_char_div_signed_char_signed_int(unsigned char *LHS, signed int RHS) {900  // CHECK: {901  // CHECK-NEXT: entry:902  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8903  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 4904  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8905  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 4906  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 4907  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8908  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1909  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i32910  // CHECK-NEXT: %[[SRC:.*]] = sdiv i32 %[[LHSEXT]], %[[RHS]]911  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8912  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize913  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize914  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize915  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:916  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize917  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize918  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize919  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize920  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize921  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize922  // CHECK-SANITIZE: [[CONT]]:923  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1924  // CHECK-NEXT: ret void925  // CHECK-NEXT: }926#line 2800927  (*LHS) /= RHS;928}929 930// CHECK-LABEL: @signed_char_div_unsigned_char931void signed_char_div_unsigned_char(signed char *LHS, unsigned char RHS) {932  // CHECK: {933  // CHECK-NEXT: entry:934  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8935  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1936  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8937  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1938  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1939  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i32940  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8941  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1942  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32943  // CHECK-NEXT: %[[SRC:.*]] = sdiv i32 %[[LHSEXT]], %[[RHSEXT]]944  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8945  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize946  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize947  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize948  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize949  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:950  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize951  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize952  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_2900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize953  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_2900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize954  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize955  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize956  // CHECK-SANITIZE: [[CONT]]:957  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1958  // CHECK-NEXT: ret void959  // CHECK-NEXT: }960#line 2900961  (*LHS) /= RHS;962}963 964// CHECK-LABEL: @signed_char_div_signed_char965void signed_char_div_signed_char(signed char *LHS, signed char RHS) {966  // CHECK: {967  // CHECK-NEXT: entry:968  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 8969  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 1970  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 8971  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 1972  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 1973  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i32974  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 8975  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 1976  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i32977  // CHECK-NEXT: %[[SRC:.*]] = sdiv i32 %[[LHSEXT]], %[[RHSEXT]]978  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i8979  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize980  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize981  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize982  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize983  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:984  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize985  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize986  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize987  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize988  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize989  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize990  // CHECK-SANITIZE: [[CONT]]:991  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 1992  // CHECK-NEXT: ret void993  // CHECK-NEXT: }994#line 3000995  (*LHS) /= RHS;996}997 998// CHECK-LABEL: @signed_char_div_signed_char_unsigned_int999void signed_char_div_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {1000  // CHECK: {1001  // CHECK-NEXT: entry:1002  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81003  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41004  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81005  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41006  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41007  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81008  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11009  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321010  // CHECK-NEXT: %[[SRC:.*]] = udiv i32 %[[LHSEXT]], %[[RHS]]1011  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81012  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1013  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize1014  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1015  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1016  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1017  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1018  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1019  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1020  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1021  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1022  // CHECK-SANITIZE: [[CONT]]:1023  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11024  // CHECK-NEXT: ret void1025  // CHECK-NEXT: }1026#line 31001027  (*LHS) /= RHS;1028}1029 1030// CHECK-LABEL: @signed_char_div_signed_char_signed_int1031void signed_char_div_signed_char_signed_int(signed char *LHS, signed int RHS) {1032  // CHECK: {1033  // CHECK-NEXT: entry:1034  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81035  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41036  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81037  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41038  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41039  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81040  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11041  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321042  // CHECK-NEXT: %[[SRC:.*]] = sdiv i32 %[[LHSEXT]], %[[RHS]]1043  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81044  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1045  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1046  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1047  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1048  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1049  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1050  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1051  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1052  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1053  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1054  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1055  // CHECK-SANITIZE: [[CONT]]:1056  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11057  // CHECK-NEXT: ret void1058  // CHECK-NEXT: }1059#line 32001060  (*LHS) /= RHS;1061}1062 1063//----------------------------------------------------------------------------//1064// Compound remainder operator.                                               //1065//----------------------------------------------------------------------------//1066 1067// CHECK-LABEL: @unsigned_char_rem_signed_char_unsigned_char1068void unsigned_char_rem_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {1069  // CHECK: {1070  // CHECK-NEXT: entry:1071  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81072  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11073  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81074  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11075  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11076  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321077  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81078  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11079  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321080  // CHECK-NEXT: %[[SRC:.*]] = srem i32 %[[LHSEXT]], %[[RHSEXT]]1081  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81082  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1083  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1084  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1085  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1086  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1087  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1088  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1089  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1090  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1091  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1092  // CHECK-SANITIZE: [[CONT]]:1093  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11094  // CHECK-NEXT: ret void1095  // CHECK-NEXT: }1096#line 33001097  (*LHS) %= RHS;1098}1099 1100// CHECK-LABEL: @unsigned_char_rem_signed_char_signed_char1101void unsigned_char_rem_signed_char_signed_char(unsigned char *LHS, signed char RHS) {1102  // CHECK: {1103  // CHECK-NEXT: entry:1104  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81105  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11106  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81107  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11108  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11109  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321110  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81111  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11112  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321113  // CHECK-NEXT: %[[SRC:.*]] = srem i32 %[[LHSEXT]], %[[RHSEXT]]1114  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81115  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1116  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1117  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1118  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1119  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1120  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1121  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1122  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1123  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1124  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1125  // CHECK-SANITIZE: [[CONT]]:1126  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11127  // CHECK-NEXT: ret void1128  // CHECK-NEXT: }1129#line 34001130  (*LHS) %= RHS;1131}1132 1133// CHECK-LABEL: @unsigned_char_rem_signed_char_unsigned_int1134void unsigned_char_rem_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {1135#line 35001136  (*LHS) %= RHS;1137}1138 1139// CHECK-LABEL: @unsigned_char_rem_signed_char_signed_int1140void unsigned_char_rem_signed_char_signed_int(unsigned char *LHS, signed int RHS) {1141  // CHECK: {1142  // CHECK-NEXT: entry:1143  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81144  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41145  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81146  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41147  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41148  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81149  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11150  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321151  // CHECK-NEXT: %[[SRC:.*]] = srem i32 %[[LHSEXT]], %[[RHS]]1152  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81153  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1154  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1155  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1156  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1157  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1158  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1159  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1160  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1161  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1162  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1163  // CHECK-SANITIZE: [[CONT]]:1164  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11165  // CHECK-NEXT: ret void1166  // CHECK-NEXT: }1167#line 36001168  (*LHS) %= RHS;1169}1170 1171// CHECK-LABEL: @signed_char_rem_unsigned_char1172void signed_char_rem_unsigned_char(signed char *LHS, unsigned char RHS) {1173  // CHECK: {1174  // CHECK-NEXT: entry:1175  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81176  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11177  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81178  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11179  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11180  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321181  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81182  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11183  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321184  // CHECK-NEXT: %[[SRC:.*]] = srem i32 %[[LHSEXT]], %[[RHSEXT]]1185  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81186  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1187  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1188  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1189  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1190  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1191  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1192  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1193  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1194  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1195  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1196  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1197  // CHECK-SANITIZE: [[CONT]]:1198  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11199  // CHECK-NEXT: ret void1200  // CHECK-NEXT: }1201#line 37001202  (*LHS) %= RHS;1203}1204 1205// CHECK-LABEL: @signed_char_rem_signed_char1206void signed_char_rem_signed_char(signed char *LHS, signed char RHS) {1207  // CHECK: {1208  // CHECK-NEXT: entry:1209  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81210  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11211  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81212  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11213  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11214  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321215  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81216  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11217  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321218  // CHECK-NEXT: %[[SRC:.*]] = srem i32 %[[LHSEXT]], %[[RHSEXT]]1219  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81220  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1221  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1222  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1223  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1224  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1225  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1226  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1227  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1228  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1229  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1230  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1231  // CHECK-SANITIZE: [[CONT]]:1232  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11233  // CHECK-NEXT: ret void1234  // CHECK-NEXT: }1235#line 38001236  (*LHS) %= RHS;1237}1238 1239// CHECK-LABEL: @signed_char_rem_signed_char_unsigned_int1240void signed_char_rem_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {1241  // CHECK: {1242  // CHECK-NEXT: entry:1243  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81244  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41245  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81246  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41247  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41248  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81249  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11250  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321251  // CHECK-NEXT: %[[SRC:.*]] = urem i32 %[[LHSEXT]], %[[RHS]]1252  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81253  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1254  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize1255  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1256  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1257  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1258  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1259  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_3900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1260  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_3900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1261  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1262  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1263  // CHECK-SANITIZE: [[CONT]]:1264  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11265  // CHECK-NEXT: ret void1266  // CHECK-NEXT: }1267#line 39001268  (*LHS) %= RHS;1269}1270 1271// CHECK-LABEL: @signed_char_rem_signed_char_signed_int1272void signed_char_rem_signed_char_signed_int(signed char *LHS, signed int RHS) {1273  // CHECK: {1274  // CHECK-NEXT: entry:1275  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81276  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41277  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81278  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41279  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41280  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81281  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11282  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321283  // CHECK-NEXT: %[[SRC:.*]] = srem i32 %[[LHSEXT]], %[[RHS]]1284  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81285  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1286  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1287  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1288  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1289  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1290  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1291  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1292  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1293  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1294  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1295  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1296  // CHECK-SANITIZE: [[CONT]]:1297  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11298  // CHECK-NEXT: ret void1299  // CHECK-NEXT: }1300#line 40001301  (*LHS) %= RHS;1302}1303 1304//----------------------------------------------------------------------------//1305// Compound left-shift operator.                                              //1306//----------------------------------------------------------------------------//1307 1308// CHECK-LABEL: @unsigned_char_shl_signed_char_unsigned_char1309void unsigned_char_shl_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {1310  // CHECK: {1311  // CHECK-NEXT: entry:1312  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81313  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11314  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81315  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11316  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11317  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321318  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81319  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11320  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321321  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHSEXT]]1322  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81323  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1324  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1325  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1326  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1327  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1328  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1329  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1330  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1331  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1332  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1333  // CHECK-SANITIZE: [[CONT]]:1334  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11335  // CHECK-NEXT: ret void1336  // CHECK-NEXT: }1337#line 41001338  (*LHS) <<= RHS;1339}1340 1341// CHECK-LABEL: @unsigned_char_shl_signed_char_signed_char1342void unsigned_char_shl_signed_char_signed_char(unsigned char *LHS, signed char RHS) {1343  // CHECK: {1344  // CHECK-NEXT: entry:1345  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81346  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11347  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81348  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11349  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11350  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321351  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81352  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11353  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321354  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHSEXT]]1355  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81356  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1357  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1358  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1359  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1360  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1361  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1362  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1363  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1364  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1365  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1366  // CHECK-SANITIZE: [[CONT]]:1367  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11368  // CHECK-NEXT: ret void1369  // CHECK-NEXT: }1370#line 42001371  (*LHS) <<= RHS;1372}1373 1374// CHECK-LABEL: @unsigned_char_shl_signed_char_unsigned_int1375void unsigned_char_shl_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {1376  // CHECK: {1377  // CHECK-NEXT: entry:1378  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81379  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41380  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81381  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41382  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41383  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81384  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11385  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321386  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHS]]1387  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81388  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1389  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1390  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1391  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1392  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1393  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1394  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1395  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1396  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1397  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1398  // CHECK-SANITIZE: [[CONT]]:1399  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11400  // CHECK-NEXT: ret void1401  // CHECK-NEXT: }1402#line 43001403  (*LHS) <<= RHS;1404}1405 1406// CHECK-LABEL: @unsigned_char_shl_signed_char_signed_int1407void unsigned_char_shl_signed_char_signed_int(unsigned char *LHS, signed int RHS) {1408  // CHECK: {1409  // CHECK-NEXT: entry:1410  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81411  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41412  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81413  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41414  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41415  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81416  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11417  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321418  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHS]]1419  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81420  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1421  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1422  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1423  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1424  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1425  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1426  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1427  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1428  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1429  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1430  // CHECK-SANITIZE: [[CONT]]:1431  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11432  // CHECK-NEXT: ret void1433  // CHECK-NEXT: }1434#line 44001435  (*LHS) <<= RHS;1436}1437 1438// CHECK-LABEL: @signed_char_shl_unsigned_char1439void signed_char_shl_unsigned_char(signed char *LHS, unsigned char RHS) {1440  // CHECK: {1441  // CHECK-NEXT: entry:1442  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81443  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11444  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81445  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11446  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11447  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321448  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81449  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11450  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321451  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHSEXT]]1452  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81453  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1454  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1455  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1456  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1457  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1458  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1459  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1460  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1461  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1462  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1463  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1464  // CHECK-SANITIZE: [[CONT]]:1465  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11466  // CHECK-NEXT: ret void1467  // CHECK-NEXT: }1468#line 45001469  (*LHS) <<= RHS;1470}1471 1472// CHECK-LABEL: @signed_char_shl_signed_char1473void signed_char_shl_signed_char(signed char *LHS, signed char RHS) {1474  // CHECK: {1475  // CHECK-NEXT: entry:1476  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81477  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11478  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81479  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11480  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11481  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321482  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81483  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11484  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321485  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHSEXT]]1486  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81487  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1488  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1489  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1490  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1491  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1492  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1493  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1494  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1495  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1496  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1497  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1498  // CHECK-SANITIZE: [[CONT]]:1499  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11500  // CHECK-NEXT: ret void1501  // CHECK-NEXT: }1502#line 46001503  (*LHS) <<= RHS;1504}1505 1506// CHECK-LABEL: @signed_char_shl_signed_char_unsigned_int1507void signed_char_shl_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {1508  // CHECK: {1509  // CHECK-NEXT: entry:1510  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81511  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41512  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81513  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41514  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41515  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81516  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11517  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321518  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHS]]1519  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81520  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1521  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1522  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1523  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1524  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1525  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1526  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1527  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1528  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1529  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1530  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1531  // CHECK-SANITIZE: [[CONT]]:1532  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11533  // CHECK-NEXT: ret void1534  // CHECK-NEXT: }1535#line 47001536  (*LHS) <<= RHS;1537}1538 1539// CHECK-LABEL: @signed_char_shl_signed_char_signed_int1540void signed_char_shl_signed_char_signed_int(signed char *LHS, signed int RHS) {1541  // CHECK: {1542  // CHECK-NEXT: entry:1543  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81544  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41545  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81546  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41547  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41548  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81549  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11550  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321551  // CHECK-NEXT: %[[SRC:.*]] = shl i32 %[[LHSEXT]], %[[RHS]]1552  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81553  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1554  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1555  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1556  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1557  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1558  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1559  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1560  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1561  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1562  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1563  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1564  // CHECK-SANITIZE: [[CONT]]:1565  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11566  // CHECK-NEXT: ret void1567  // CHECK-NEXT: }1568#line 48001569  (*LHS) <<= RHS;1570}1571 1572//----------------------------------------------------------------------------//1573// Compound right-shift operator.                                             //1574//----------------------------------------------------------------------------//1575 1576// CHECK-LABEL: @unsigned_char_shr_signed_char_unsigned_char1577void unsigned_char_shr_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {1578  // CHECK: {1579  // CHECK-NEXT: entry:1580  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81581  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11582  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81583  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11584  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11585  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321586  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81587  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11588  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321589  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHSEXT]]1590  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81591  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1592  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1593  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1594  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1595  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1596  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1597  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_4900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1598  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_4900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1599  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1600  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1601  // CHECK-SANITIZE: [[CONT]]:1602  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11603  // CHECK-NEXT: ret void1604  // CHECK-NEXT: }1605#line 49001606  (*LHS) >>= RHS;1607}1608 1609// CHECK-LABEL: @unsigned_char_shr_signed_char_signed_char1610void unsigned_char_shr_signed_char_signed_char(unsigned char *LHS, signed char RHS) {1611  // CHECK: {1612  // CHECK-NEXT: entry:1613  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81614  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11615  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81616  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11617  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11618  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321619  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81620  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11621  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321622  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHSEXT]]1623  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81624  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1625  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1626  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1627  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1628  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1629  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1630  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1631  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1632  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1633  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1634  // CHECK-SANITIZE: [[CONT]]:1635  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11636  // CHECK-NEXT: ret void1637  // CHECK-NEXT: }1638#line 50001639  (*LHS) >>= RHS;1640}1641 1642// CHECK-LABEL: @unsigned_char_shr_signed_char_unsigned_int1643void unsigned_char_shr_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {1644  // CHECK: {1645  // CHECK-NEXT: entry:1646  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81647  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41648  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81649  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41650  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41651  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81652  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11653  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321654  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHS]]1655  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81656  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1657  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1658  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1659  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1660  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1661  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1662  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1663  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1664  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1665  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1666  // CHECK-SANITIZE: [[CONT]]:1667  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11668  // CHECK-NEXT: ret void1669  // CHECK-NEXT: }1670#line 51001671  (*LHS) >>= RHS;1672}1673 1674// CHECK-LABEL: @unsigned_char_shr_signed_char_signed_int1675void unsigned_char_shr_signed_char_signed_int(unsigned char *LHS, signed int RHS) {1676  // CHECK: {1677  // CHECK-NEXT: entry:1678  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81679  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41680  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81681  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41682  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41683  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81684  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11685  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321686  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHS]]1687  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81688  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1689  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1690  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1691  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1692  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1693  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1694  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1695  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1696  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1697  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1698  // CHECK-SANITIZE: [[CONT]]:1699  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11700  // CHECK-NEXT: ret void1701  // CHECK-NEXT: }1702#line 52001703  (*LHS) >>= RHS;1704}1705 1706// CHECK-LABEL: @signed_char_shr_unsigned_char1707void signed_char_shr_unsigned_char(signed char *LHS, unsigned char RHS) {1708  // CHECK: {1709  // CHECK-NEXT: entry:1710  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81711  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11712  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81713  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11714  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11715  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321716  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81717  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11718  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321719  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHSEXT]]1720  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81721  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1722  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1723  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1724  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1725  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1726  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1727  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1728  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1729  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1730  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1731  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1732  // CHECK-SANITIZE: [[CONT]]:1733  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11734  // CHECK-NEXT: ret void1735  // CHECK-NEXT: }1736#line 53001737  (*LHS) >>= RHS;1738}1739 1740// CHECK-LABEL: @signed_char_shr_signed_char1741void signed_char_shr_signed_char(signed char *LHS, signed char RHS) {1742  // CHECK: {1743  // CHECK-NEXT: entry:1744  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81745  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11746  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81747  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11748  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11749  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321750  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81751  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11752  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321753  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHSEXT]]1754  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81755  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1756  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1757  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1758  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1759  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1760  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1761  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1762  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1763  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1764  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1765  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1766  // CHECK-SANITIZE: [[CONT]]:1767  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11768  // CHECK-NEXT: ret void1769  // CHECK-NEXT: }1770#line 54001771  (*LHS) >>= RHS;1772}1773 1774// CHECK-LABEL: @signed_char_shr_signed_char_unsigned_int1775void signed_char_shr_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {1776  // CHECK: {1777  // CHECK-NEXT: entry:1778  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81779  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41780  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81781  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41782  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41783  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81784  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11785  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321786  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHS]]1787  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81788  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1789  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1790  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1791  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1792  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1793  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1794  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1795  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1796  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1797  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1798  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1799  // CHECK-SANITIZE: [[CONT]]:1800  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11801  // CHECK-NEXT: ret void1802  // CHECK-NEXT: }1803#line 55001804  (*LHS) >>= RHS;1805}1806 1807// CHECK-LABEL: @signed_char_shr_signed_char_signed_int1808void signed_char_shr_signed_char_signed_int(signed char *LHS, signed int RHS) {1809  // CHECK: {1810  // CHECK-NEXT: entry:1811  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81812  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41813  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81814  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41815  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41816  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81817  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11818  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321819  // CHECK-NEXT: %[[SRC:.*]] = ashr i32 %[[LHSEXT]], %[[RHS]]1820  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81821  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1822  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1823  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1824  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1825  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1826  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1827  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1828  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1829  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1830  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1831  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1832  // CHECK-SANITIZE: [[CONT]]:1833  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11834  // CHECK-NEXT: ret void1835  // CHECK-NEXT: }1836#line 56001837  (*LHS) >>= RHS;1838}1839 1840//----------------------------------------------------------------------------//1841// Compound and operator.                                                     //1842//----------------------------------------------------------------------------//1843 1844// CHECK-LABEL: @unsigned_char_and_signed_char_unsigned_char1845void unsigned_char_and_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {1846  // CHECK: {1847  // CHECK-NEXT: entry:1848  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81849  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11850  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81851  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11852  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11853  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321854  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81855  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11856  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321857  // CHECK-NEXT: %[[SRC:.*]] = and i32 %[[LHSEXT]], %[[RHSEXT]]1858  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81859  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1860  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1861  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1862  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1863  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1864  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1865  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1866  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1867  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1868  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1869  // CHECK-SANITIZE: [[CONT]]:1870  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11871  // CHECK-NEXT: ret void1872  // CHECK-NEXT: }1873#line 57001874  (*LHS) &= RHS;1875}1876 1877// CHECK-LABEL: @unsigned_char_and_signed_char_signed_char1878void unsigned_char_and_signed_char_signed_char(unsigned char *LHS, signed char RHS) {1879  // CHECK: {1880  // CHECK-NEXT: entry:1881  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81882  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11883  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81884  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11885  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11886  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321887  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81888  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11889  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321890  // CHECK-NEXT: %[[SRC:.*]] = and i32 %[[LHSEXT]], %[[RHSEXT]]1891  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81892  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1893  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1894  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1895  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1896  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1897  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1898  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_5800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1899  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_5800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1900  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1901  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1902  // CHECK-SANITIZE: [[CONT]]:1903  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11904  // CHECK-NEXT: ret void1905  // CHECK-NEXT: }1906#line 58001907  (*LHS) &= RHS;1908}1909 1910// CHECK-LABEL: @unsigned_char_and_signed_char_unsigned_int1911void unsigned_char_and_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {1912#line 59001913  (*LHS) &= RHS;1914}1915 1916// CHECK-LABEL: @unsigned_char_and_signed_char_signed_int1917void unsigned_char_and_signed_char_signed_int(unsigned char *LHS, signed int RHS) {1918  // CHECK: {1919  // CHECK-NEXT: entry:1920  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81921  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 41922  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81923  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 41924  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 41925  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81926  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11927  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i321928  // CHECK-NEXT: %[[SRC:.*]] = and i32 %[[LHSEXT]], %[[RHS]]1929  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81930  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1931  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize1932  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1933  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1934  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1935  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1936  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1937  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1938  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1939  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1940  // CHECK-SANITIZE: [[CONT]]:1941  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11942  // CHECK-NEXT: ret void1943  // CHECK-NEXT: }1944#line 60001945  (*LHS) &= RHS;1946}1947 1948// CHECK-LABEL: @signed_char_and_unsigned_char1949void signed_char_and_unsigned_char(signed char *LHS, unsigned char RHS) {1950  // CHECK: {1951  // CHECK-NEXT: entry:1952  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81953  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11954  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81955  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11956  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11957  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i321958  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81959  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11960  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321961  // CHECK-NEXT: %[[SRC:.*]] = and i32 %[[LHSEXT]], %[[RHSEXT]]1962  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81963  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1964  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1965  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize1966  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize1967  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:1968  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize1969  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize1970  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1971  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize1972  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize1973  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize1974  // CHECK-SANITIZE: [[CONT]]:1975  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 11976  // CHECK-NEXT: ret void1977  // CHECK-NEXT: }1978#line 61001979  (*LHS) &= RHS;1980}1981 1982// CHECK-LABEL: @signed_char_and_signed_char1983void signed_char_and_signed_char(signed char *LHS, signed char RHS) {1984  // CHECK: {1985  // CHECK-NEXT: entry:1986  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 81987  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 11988  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 81989  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 11990  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 11991  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i321992  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 81993  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 11994  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i321995  // CHECK-NEXT: %[[SRC:.*]] = and i32 %[[LHSEXT]], %[[RHSEXT]]1996  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i81997  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize1998  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize1999  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2000  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2001  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2002  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2003  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2004  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2005  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2006  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2007  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2008  // CHECK-SANITIZE: [[CONT]]:2009  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12010  // CHECK-NEXT: ret void2011  // CHECK-NEXT: }2012#line 62002013  (*LHS) &= RHS;2014}2015 2016// CHECK-LABEL: @signed_char_and_signed_char_unsigned_int2017void signed_char_and_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {2018  // CHECK: {2019  // CHECK-NEXT: entry:2020  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82021  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42022  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82023  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42024  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42025  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82026  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12027  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322028  // CHECK-NEXT: %[[SRC:.*]] = and i32 %[[LHSEXT]], %[[RHS]]2029  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82030  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2031  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize2032  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2033  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2034  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2035  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2036  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2037  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2038  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2039  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2040  // CHECK-SANITIZE: [[CONT]]:2041  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12042  // CHECK-NEXT: ret void2043  // CHECK-NEXT: }2044#line 63002045  (*LHS) &= RHS;2046}2047 2048// CHECK-LABEL: @signed_char_and_signed_char_signed_int2049void signed_char_and_signed_char_signed_int(signed char *LHS, signed int RHS) {2050  // CHECK: {2051  // CHECK-NEXT: entry:2052  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82053  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42054  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82055  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42056  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42057  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82058  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12059  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322060  // CHECK-NEXT: %[[SRC:.*]] = and i32 %[[LHSEXT]], %[[RHS]]2061  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82062  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2063  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2064  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2065  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2066  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2067  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2068  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2069  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2070  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2071  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2072  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2073  // CHECK-SANITIZE: [[CONT]]:2074  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12075  // CHECK-NEXT: ret void2076  // CHECK-NEXT: }2077#line 64002078  (*LHS) &= RHS;2079}2080 2081//----------------------------------------------------------------------------//2082// Compound xor operator.                                                     //2083//----------------------------------------------------------------------------//2084 2085// CHECK-LABEL: @unsigned_char_or_signed_char_unsigned_char2086void unsigned_char_or_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {2087  // CHECK: {2088  // CHECK-NEXT: entry:2089  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82090  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12091  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82092  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12093  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12094  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i322095  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82096  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12097  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i322098  // CHECK-NEXT: %[[SRC:.*]] = or i32 %[[LHSEXT]], %[[RHSEXT]]2099  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82100  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2101  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize2102  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2103  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2104  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2105  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2106  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2107  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6500_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2108  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2109  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2110  // CHECK-SANITIZE: [[CONT]]:2111  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12112  // CHECK-NEXT: ret void2113  // CHECK-NEXT: }2114#line 65002115  (*LHS) |= RHS;2116}2117 2118// CHECK-LABEL: @unsigned_char_or_signed_char_signed_char2119void unsigned_char_or_signed_char_signed_char(unsigned char *LHS, signed char RHS) {2120  // CHECK: {2121  // CHECK-NEXT: entry:2122  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82123  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12124  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82125  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12126  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12127  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i322128  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82129  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12130  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i322131  // CHECK-NEXT: %[[SRC:.*]] = or i32 %[[LHSEXT]], %[[RHSEXT]]2132  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82133  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2134  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize2135  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2136  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2137  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2138  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2139  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2140  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2141  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2142  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2143  // CHECK-SANITIZE: [[CONT]]:2144  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12145  // CHECK-NEXT: ret void2146  // CHECK-NEXT: }2147#line 66002148  (*LHS) |= RHS;2149}2150 2151// CHECK-LABEL: @unsigned_char_or_signed_char_unsigned_int2152void unsigned_char_or_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {2153#line 67002154  (*LHS) |= RHS;2155}2156 2157// CHECK-LABEL: @unsigned_char_or_signed_char_signed_int2158void unsigned_char_or_signed_char_signed_int(unsigned char *LHS, signed int RHS) {2159  // CHECK: {2160  // CHECK-NEXT: entry:2161  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82162  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42163  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82164  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42165  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42166  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82167  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12168  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i322169  // CHECK-NEXT: %[[SRC:.*]] = or i32 %[[LHSEXT]], %[[RHS]]2170  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82171  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2172  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize2173  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2174  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2175  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2176  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2177  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2178  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2179  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2180  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2181  // CHECK-SANITIZE: [[CONT]]:2182  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12183  // CHECK-NEXT: ret void2184  // CHECK-NEXT: }2185#line 68002186  (*LHS) |= RHS;2187}2188 2189// CHECK-LABEL: @signed_char_or_unsigned_char2190void signed_char_or_unsigned_char(signed char *LHS, unsigned char RHS) {2191  // CHECK: {2192  // CHECK-NEXT: entry:2193  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82194  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12195  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82196  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12197  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12198  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i322199  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82200  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12201  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322202  // CHECK-NEXT: %[[SRC:.*]] = or i32 %[[LHSEXT]], %[[RHSEXT]]2203  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82204  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2205  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2206  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2207  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2208  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2209  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2210  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2211  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_6900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2212  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_6900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2213  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2214  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2215  // CHECK-SANITIZE: [[CONT]]:2216  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12217  // CHECK-NEXT: ret void2218  // CHECK-NEXT: }2219#line 69002220  (*LHS) |= RHS;2221}2222 2223// CHECK-LABEL: @signed_char_or_signed_char2224void signed_char_or_signed_char(signed char *LHS, signed char RHS) {2225  // CHECK: {2226  // CHECK-NEXT: entry:2227  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82228  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12229  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82230  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12231  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12232  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i322233  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82234  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12235  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322236  // CHECK-NEXT: %[[SRC:.*]] = or i32 %[[LHSEXT]], %[[RHSEXT]]2237  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82238  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2239  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2240  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2241  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2242  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2243  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2244  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2245  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2246  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2247  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2248  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2249  // CHECK-SANITIZE: [[CONT]]:2250  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12251  // CHECK-NEXT: ret void2252  // CHECK-NEXT: }2253#line 70002254  (*LHS) |= RHS;2255}2256 2257// CHECK-LABEL: @signed_char_or_signed_char_unsigned_int2258void signed_char_or_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {2259  // CHECK: {2260  // CHECK-NEXT: entry:2261  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82262  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42263  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82264  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42265  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42266  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82267  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12268  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322269  // CHECK-NEXT: %[[SRC:.*]] = or i32 %[[LHSEXT]], %[[RHS]]2270  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82271  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2272  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize2273  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2274  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2275  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2276  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2277  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2278  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7100_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2279  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2280  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2281  // CHECK-SANITIZE: [[CONT]]:2282  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12283  // CHECK-NEXT: ret void2284  // CHECK-NEXT: }2285#line 71002286  (*LHS) |= RHS;2287}2288 2289// CHECK-LABEL: @signed_char_or_signed_char_signed_int2290void signed_char_or_signed_char_signed_int(signed char *LHS, signed int RHS) {2291  // CHECK: {2292  // CHECK-NEXT: entry:2293  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82294  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42295  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82296  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42297  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42298  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82299  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12300  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322301  // CHECK-NEXT: %[[SRC:.*]] = or i32 %[[LHSEXT]], %[[RHS]]2302  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82303  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2304  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2305  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2306  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2307  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2308  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2309  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2310  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2311  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7200_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2312  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2313  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2314  // CHECK-SANITIZE: [[CONT]]:2315  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12316  // CHECK-NEXT: ret void2317  // CHECK-NEXT: }2318#line 72002319  (*LHS) |= RHS;2320}2321 2322//----------------------------------------------------------------------------//2323// Compound or operator.                                                      //2324//----------------------------------------------------------------------------//2325 2326// CHECK-LABEL: @unsigned_char_xor_signed_char_unsigned_char2327void unsigned_char_xor_signed_char_unsigned_char(unsigned char *LHS, unsigned char RHS) {2328  // CHECK: {2329  // CHECK-NEXT: entry:2330  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82331  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12332  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82333  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12334  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12335  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i322336  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82337  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12338  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i322339  // CHECK-NEXT: %[[SRC:.*]] = xor i32 %[[LHSEXT]], %[[RHSEXT]]2340  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82341  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2342  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize2343  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2344  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2345  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2346  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2347  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2348  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7300_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2349  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2350  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2351  // CHECK-SANITIZE: [[CONT]]:2352  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12353  // CHECK-NEXT: ret void2354  // CHECK-NEXT: }2355#line 73002356  (*LHS) ^= RHS;2357}2358 2359// CHECK-LABEL: @unsigned_char_xor_signed_char_signed_char2360void unsigned_char_xor_signed_char_signed_char(unsigned char *LHS, signed char RHS) {2361  // CHECK: {2362  // CHECK-NEXT: entry:2363  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82364  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12365  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82366  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12367  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12368  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i322369  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82370  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12371  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i322372  // CHECK-NEXT: %[[SRC:.*]] = xor i32 %[[LHSEXT]], %[[RHSEXT]]2373  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82374  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2375  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize2376  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2377  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2378  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2379  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2380  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2381  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7400_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2382  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2383  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2384  // CHECK-SANITIZE: [[CONT]]:2385  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12386  // CHECK-NEXT: ret void2387  // CHECK-NEXT: }2388#line 74002389  (*LHS) ^= RHS;2390}2391 2392// CHECK-LABEL: @unsigned_char_xor_signed_char_unsigned_int2393void unsigned_char_xor_signed_char_unsigned_int(unsigned char *LHS, unsigned int RHS) {2394#line 75002395  (*LHS) ^= RHS;2396}2397 2398// CHECK-LABEL: @unsigned_char_xor_signed_char_signed_int2399void unsigned_char_xor_signed_char_signed_int(unsigned char *LHS, signed int RHS) {2400  // CHECK: {2401  // CHECK-NEXT: entry:2402  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82403  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42404  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82405  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42406  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42407  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82408  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12409  // CHECK-NEXT: %[[LHSEXT:.*]] = zext i8 %[[LHS]] to i322410  // CHECK-NEXT: %[[SRC:.*]] = xor i32 %[[LHSEXT]], %[[RHS]]2411  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82412  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2413  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], false, !nosanitize2414  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2415  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2416  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2417  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2418  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2419  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7600_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2420  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2421  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2422  // CHECK-SANITIZE: [[CONT]]:2423  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12424  // CHECK-NEXT: ret void2425  // CHECK-NEXT: }2426#line 76002427  (*LHS) ^= RHS;2428}2429 2430// CHECK-LABEL: @signed_char_xor_unsigned_char2431void signed_char_xor_unsigned_char(signed char *LHS, unsigned char RHS) {2432  // CHECK: {2433  // CHECK-NEXT: entry:2434  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82435  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12436  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82437  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12438  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12439  // CHECK-NEXT: %[[RHSEXT:.*]] = zext i8 %[[RHS]] to i322440  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82441  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12442  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322443  // CHECK-NEXT: %[[SRC:.*]] = xor i32 %[[LHSEXT]], %[[RHSEXT]]2444  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82445  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2446  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2447  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2448  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2449  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2450  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2451  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2452  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2453  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7700_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2454  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2455  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2456  // CHECK-SANITIZE: [[CONT]]:2457  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12458  // CHECK-NEXT: ret void2459  // CHECK-NEXT: }2460#line 77002461  (*LHS) ^= RHS;2462}2463 2464// CHECK-LABEL: @signed_char_xor_signed_char2465void signed_char_xor_signed_char(signed char *LHS, signed char RHS) {2466  // CHECK: {2467  // CHECK-NEXT: entry:2468  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82469  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i8, align 12470  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82471  // CHECK-NEXT: store i8 %[[ARG1:.*]], ptr %[[RHSADDR]], align 12472  // CHECK-NEXT: %[[RHS:.*]] = load i8, ptr %[[RHSADDR]], align 12473  // CHECK-NEXT: %[[RHSEXT:.*]] = sext i8 %[[RHS]] to i322474  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82475  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12476  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322477  // CHECK-NEXT: %[[SRC:.*]] = xor i32 %[[LHSEXT]], %[[RHSEXT]]2478  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82479  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2480  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2481  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2482  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2483  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2484  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2485  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2486  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2487  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7800_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2488  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2489  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2490  // CHECK-SANITIZE: [[CONT]]:2491  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12492  // CHECK-NEXT: ret void2493  // CHECK-NEXT: }2494#line 78002495  (*LHS) ^= RHS;2496}2497 2498// CHECK-LABEL: @signed_char_xor_signed_char_unsigned_int2499void signed_char_xor_signed_char_unsigned_int(signed char *LHS, unsigned int RHS) {2500  // CHECK: {2501  // CHECK-NEXT: entry:2502  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82503  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42504  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82505  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42506  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42507  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82508  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12509  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322510  // CHECK-NEXT: %[[SRC:.*]] = xor i32 %[[LHSEXT]], %[[RHS]]2511  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82512  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2513  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 false, %[[DST_NEGATIVITYCHECK]], !nosanitize2514  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2515  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2516  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2517  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2518  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_7900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2519  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_7900_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2520  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2521  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2522  // CHECK-SANITIZE: [[CONT]]:2523  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12524  // CHECK-NEXT: ret void2525  // CHECK-NEXT: }2526#line 79002527  (*LHS) ^= RHS;2528}2529 2530// CHECK-LABEL: @signed_char_xor_signed_char_signed_int2531void signed_char_xor_signed_char_signed_int(signed char *LHS, signed int RHS) {2532  // CHECK: {2533  // CHECK-NEXT: entry:2534  // CHECK-NEXT: %[[ADDRESS:.*]] = alloca ptr, align 82535  // CHECK-NEXT: %[[RHSADDR:.*]] = alloca i32, align 42536  // CHECK-NEXT: store ptr %[[ARG0:.*]], ptr %[[ADDRESS]], align 82537  // CHECK-NEXT: store i32 %[[ARG1:.*]], ptr %[[RHSADDR]], align 42538  // CHECK-NEXT: %[[RHS:.*]] = load i32, ptr %[[RHSADDR]], align 42539  // CHECK-NEXT: %[[LHSADDR:.*]] = load ptr, ptr %[[ADDRESS]], align 82540  // CHECK-NEXT: %[[LHS:.*]] = load i8, ptr %[[LHSADDR]], align 12541  // CHECK-NEXT: %[[LHSEXT:.*]] = sext i8 %[[LHS]] to i322542  // CHECK-NEXT: %[[SRC:.*]] = xor i32 %[[LHSEXT]], %[[RHS]]2543  // CHECK-NEXT: %[[DST:.*]] = trunc i32 %[[SRC]] to i82544  // CHECK-SANITIZE-NEXT: %[[SRC_NEGATIVITYCHECK:.*]] = icmp slt i32 %[[SRC]], 0, !nosanitize2545  // CHECK-SANITIZE-NEXT: %[[DST_NEGATIVITYCHECK:.*]] = icmp slt i8 %[[DST]], 0, !nosanitize2546  // CHECK-SANITIZE-NEXT: %[[SIGNCHANGECHECK:.*]] = icmp eq i1 %[[SRC_NEGATIVITYCHECK]], %[[DST_NEGATIVITYCHECK]], !nosanitize2547  // CHECK-SANITIZE-NEXT: br i1 %[[SIGNCHANGECHECK]], label %[[CONT:.*]], label %[[HANDLER_IMPLICIT_CONVERSION:[^,]+]],{{.*}} !nosanitize2548  // CHECK-SANITIZE: [[HANDLER_IMPLICIT_CONVERSION]]:2549  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTSRC:.*]] = zext i32 %[[SRC]] to i64, !nosanitize2550  // CHECK-SANITIZE-ANYRECOVER-NEXT: %[[EXTDST:.*]] = zext i8 %[[DST]] to i64, !nosanitize2551  // CHECK-SANITIZE-NORECOVER-NEXT: call void @__ubsan_handle_implicit_conversion_abort(ptr @[[LINE_8000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2552  // CHECK-SANITIZE-RECOVER-NEXT: call void @__ubsan_handle_implicit_conversion(ptr @[[LINE_8000_SIGN_CHANGE]], i64 %[[EXTSRC]], i64 %[[EXTDST]]){{.*}}, !nosanitize2553  // CHECK-SANITIZE-TRAP-NEXT: call void @llvm.ubsantrap(i8 7){{.*}}, !nosanitize2554  // CHECK-SANITIZE-UNREACHABLE-NEXT: unreachable, !nosanitize2555  // CHECK-SANITIZE: [[CONT]]:2556  // CHECK-NEXT: store i8 %[[DST]], ptr %[[LHSADDR]], align 12557  // CHECK-NEXT: ret void2558  // CHECK-NEXT: }2559#line 80002560  (*LHS) ^= RHS;2561}2562