; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -S -passes=expand-memcmp -mtriple=x86_64-unknown-unknown < %s | FileCheck %s ; ; Verify that ExpandMemCmp does not expand memcmp calls in functions with ; sanitizer attributes, so sanitizer interceptors can catch memory errors. declare i32 @memcmp(ptr nocapture, ptr nocapture, i64) define i32 @cmp_asan(ptr nocapture readonly %x, ptr nocapture readonly %y) sanitize_address { ; CHECK-LABEL: define i32 @cmp_asan( ; CHECK-SAME: ptr readonly captures(none) [[X:%.*]], ptr readonly captures(none) [[Y:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X]], ptr [[Y]], i64 4) ; CHECK-NEXT: ret i32 [[CALL]] ; %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4) ret i32 %call } define i32 @cmp_msan(ptr nocapture readonly %x, ptr nocapture readonly %y) sanitize_memory { ; CHECK-LABEL: define i32 @cmp_msan( ; CHECK-SAME: ptr readonly captures(none) [[X:%.*]], ptr readonly captures(none) [[Y:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X]], ptr [[Y]], i64 4) ; CHECK-NEXT: ret i32 [[CALL]] ; %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4) ret i32 %call } define i32 @cmp_tsan(ptr nocapture readonly %x, ptr nocapture readonly %y) sanitize_thread { ; CHECK-LABEL: define i32 @cmp_tsan( ; CHECK-SAME: ptr readonly captures(none) [[X:%.*]], ptr readonly captures(none) [[Y:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X]], ptr [[Y]], i64 4) ; CHECK-NEXT: ret i32 [[CALL]] ; %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4) ret i32 %call } define i32 @cmp_hwasan(ptr nocapture readonly %x, ptr nocapture readonly %y) sanitize_hwaddress { ; CHECK-LABEL: define i32 @cmp_hwasan( ; CHECK-SAME: ptr readonly captures(none) [[X:%.*]], ptr readonly captures(none) [[Y:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @memcmp(ptr [[X]], ptr [[Y]], i64 4) ; CHECK-NEXT: ret i32 [[CALL]] ; %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4) ret i32 %call } define i32 @cmp_no_sanitizer(ptr nocapture readonly %x, ptr nocapture readonly %y) { ; CHECK-LABEL: define i32 @cmp_no_sanitizer( ; CHECK-SAME: ptr readonly captures(none) [[X:%.*]], ptr readonly captures(none) [[Y:%.*]]) { ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 1 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[Y]], align 1 ; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP1]]) ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP2]]) ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @llvm.ucmp.i32.i32(i32 [[TMP3]], i32 [[TMP4]]) ; CHECK-NEXT: ret i32 [[TMP5]] ; %call = tail call i32 @memcmp(ptr %x, ptr %y, i64 4) ret i32 %call }