306 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"5 6@a = common global [60 x i8] zeroinitializer, align 17@b = common global [60 x i8] zeroinitializer, align 18@.str = private constant [12 x i8] c"abcdefghijk\00"9 10%struct.__va_list_tag = type { i32, i32, ptr, ptr }11 12define ptr @test_memccpy() {13; CHECK-LABEL: @test_memccpy(14; CHECK-NEXT: [[MEMCCPY:%.*]] = call ptr @memccpy(ptr nonnull @a, ptr nonnull @b, i32 0, i64 60)15; CHECK-NEXT: ret ptr [[MEMCCPY]]16;17 %ret = call ptr @__memccpy_chk(ptr @a, ptr @b, i32 0, i64 60, i64 -1)18 ret ptr %ret19}20 21define ptr @test_not_memccpy() {22; CHECK-LABEL: @test_not_memccpy(23; CHECK-NEXT: [[RET:%.*]] = call ptr @__memccpy_chk(ptr nonnull @a, ptr nonnull @b, i32 0, i64 60, i64 59)24; CHECK-NEXT: ret ptr [[RET]]25;26 %ret = call ptr @__memccpy_chk(ptr @a, ptr @b, i32 0, i64 60, i64 59)27 ret ptr %ret28}29 30define ptr @test_memccpy_tail() {31; CHECK-LABEL: @test_memccpy_tail(32; CHECK-NEXT: [[MEMCCPY:%.*]] = tail call ptr @memccpy(ptr nonnull @a, ptr nonnull @b, i32 0, i64 60)33; CHECK-NEXT: ret ptr [[MEMCCPY]]34;35 %ret = tail call ptr @__memccpy_chk(ptr @a, ptr @b, i32 0, i64 60, i64 -1)36 ret ptr %ret37}38 39define ptr @test_mempcpy() {40; CHECK-LABEL: @test_mempcpy(41; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(15) @a, ptr noundef nonnull align 1 dereferenceable(15) @b, i64 15, i1 false)42; CHECK-NEXT: ret ptr getelementptr inbounds nuw (i8, ptr @a, i64 15)43;44 %ret = call ptr @__mempcpy_chk(ptr @a, ptr @b, i64 15, i64 -1)45 ret ptr %ret46}47 48define ptr @test_not_mempcpy() {49; CHECK-LABEL: @test_not_mempcpy(50; CHECK-NEXT: [[RET:%.*]] = call ptr @__mempcpy_chk(ptr nonnull @a, ptr nonnull @b, i64 60, i64 59)51; CHECK-NEXT: ret ptr [[RET]]52;53 %ret = call ptr @__mempcpy_chk(ptr @a, ptr @b, i64 60, i64 59)54 ret ptr %ret55}56 57define ptr @test_mempcpy_tail() {58; CHECK-LABEL: @test_mempcpy_tail(59; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(15) @a, ptr noundef nonnull align 1 dereferenceable(15) @b, i64 15, i1 false)60; CHECK-NEXT: ret ptr getelementptr inbounds nuw (i8, ptr @a, i64 15)61;62 %ret = tail call ptr @__mempcpy_chk(ptr @a, ptr @b, i64 15, i64 -1)63 ret ptr %ret64}65 66define i32 @test_snprintf() {67; CHECK-LABEL: @test_snprintf(68; CHECK-NEXT: [[SNPRINTF:%.*]] = call i32 (ptr, i64, ptr, ...) @snprintf(ptr nonnull dereferenceable(1) @a, i64 60, ptr nonnull @b)69; CHECK-NEXT: ret i32 [[SNPRINTF]]70;71 %ret = call i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chk(ptr @a, i64 60, i32 0, i64 -1, ptr @b)72 ret i32 %ret73}74 75define i32 @test_not_snprintf() {76; CHECK-LABEL: @test_not_snprintf(77; CHECK-NEXT: [[RET:%.*]] = call i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chk(ptr nonnull @a, i64 60, i32 0, i64 59, ptr nonnull @b)78; CHECK-NEXT: [[IGN:%.*]] = call i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chk(ptr nonnull @a, i64 60, i32 1, i64 -1, ptr nonnull @b)79; CHECK-NEXT: ret i32 [[RET]]80;81 %ret = call i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chk(ptr @a, i64 60, i32 0, i64 59, ptr @b)82 %ign = call i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chk(ptr @a, i64 60, i32 1, i64 -1, ptr @b)83 ret i32 %ret84}85 86define i32 @test_snprintf_tail() {87; CHECK-LABEL: @test_snprintf_tail(88; CHECK-NEXT: [[SNPRINTF:%.*]] = tail call i32 (ptr, i64, ptr, ...) @snprintf(ptr nonnull dereferenceable(1) @a, i64 60, ptr nonnull @b)89; CHECK-NEXT: ret i32 [[SNPRINTF]]90;91 %ret = tail call i32 (ptr, i64, i32, i64, ptr, ...) @__snprintf_chk(ptr @a, i64 60, i32 0, i64 -1, ptr @b)92 ret i32 %ret93}94 95define i32 @test_sprintf() {96; CHECK-LABEL: @test_sprintf(97; CHECK-NEXT: [[SPRINTF:%.*]] = call i32 (ptr, ptr, ...) @sprintf(ptr nonnull dereferenceable(1) @a, ptr nonnull dereferenceable(1) @b)98; CHECK-NEXT: ret i32 [[SPRINTF]]99;100 %ret = call i32 (ptr, i32, i64, ptr, ...) @__sprintf_chk(ptr @a, i32 0, i64 -1, ptr @b)101 ret i32 %ret102}103 104define i32 @test_not_sprintf() {105; CHECK-LABEL: @test_not_sprintf(106; CHECK-NEXT: [[RET:%.*]] = call i32 (ptr, i32, i64, ptr, ...) @__sprintf_chk(ptr nonnull @a, i32 0, i64 59, ptr nonnull @b)107; CHECK-NEXT: [[IGNORED:%.*]] = call i32 (ptr, i32, i64, ptr, ...) @__sprintf_chk(ptr nonnull @a, i32 1, i64 -1, ptr nonnull @b)108; CHECK-NEXT: ret i32 [[RET]]109;110 %ret = call i32 (ptr, i32, i64, ptr, ...) @__sprintf_chk(ptr @a, i32 0, i64 59, ptr @b)111 %ignored = call i32 (ptr, i32, i64, ptr, ...) @__sprintf_chk(ptr @a, i32 1, i64 -1, ptr @b)112 ret i32 %ret113}114 115define i32 @test_sprintf_tail() {116; CHECK-LABEL: @test_sprintf_tail(117; CHECK-NEXT: [[SPRINTF:%.*]] = tail call i32 (ptr, ptr, ...) @sprintf(ptr nonnull dereferenceable(1) @a, ptr nonnull dereferenceable(1) @b)118; CHECK-NEXT: ret i32 [[SPRINTF]]119;120 %ret = tail call i32 (ptr, i32, i64, ptr, ...) @__sprintf_chk(ptr @a, i32 0, i64 -1, ptr @b)121 ret i32 %ret122}123 124define ptr @test_strcat() {125; CHECK-LABEL: @test_strcat(126; CHECK-NEXT: [[STRCAT:%.*]] = call ptr @strcat(ptr noundef nonnull dereferenceable(1) @a, ptr noundef nonnull dereferenceable(1) @b)127; CHECK-NEXT: ret ptr @a128;129 %ret = call ptr @__strcat_chk(ptr @a, ptr @b, i64 -1)130 ret ptr %ret131}132 133define ptr @test_not_strcat() {134; CHECK-LABEL: @test_not_strcat(135; CHECK-NEXT: [[RET:%.*]] = call ptr @__strcat_chk(ptr nonnull @a, ptr nonnull @b, i64 0)136; CHECK-NEXT: ret ptr [[RET]]137;138 %ret = call ptr @__strcat_chk(ptr @a, ptr @b, i64 0)139 ret ptr %ret140}141 142define ptr @test_strcat_tail() {143; CHECK-LABEL: @test_strcat_tail(144; CHECK-NEXT: [[STRCAT:%.*]] = tail call ptr @strcat(ptr noundef nonnull dereferenceable(1) @a, ptr noundef nonnull dereferenceable(1) @b)145; CHECK-NEXT: ret ptr @a146;147 %ret = tail call ptr @__strcat_chk(ptr @a, ptr @b, i64 -1)148 ret ptr %ret149}150 151define i64 @test_strlcat() {152; CHECK-LABEL: @test_strlcat(153; CHECK-NEXT: [[STRLCAT:%.*]] = call i64 @strlcat(ptr nonnull @a, ptr nonnull @b, i64 22)154; CHECK-NEXT: ret i64 [[STRLCAT]]155;156 %ret = call i64 @__strlcat_chk(ptr @a, ptr @b, i64 22, i64 -1)157 ret i64 %ret158}159 160define i64 @test_not_strlcat() {161; CHECK-LABEL: @test_not_strlcat(162; CHECK-NEXT: [[RET:%.*]] = call i64 @__strlcat_chk(ptr nonnull @a, ptr nonnull @b, i64 22, i64 0)163; CHECK-NEXT: ret i64 [[RET]]164;165 %ret = call i64 @__strlcat_chk(ptr @a, ptr @b, i64 22, i64 0)166 ret i64 %ret167}168 169define i64 @test_strlcat_tail() {170; CHECK-LABEL: @test_strlcat_tail(171; CHECK-NEXT: [[STRLCAT:%.*]] = tail call i64 @strlcat(ptr nonnull @a, ptr nonnull @b, i64 22)172; CHECK-NEXT: ret i64 [[STRLCAT]]173;174 %ret = tail call i64 @__strlcat_chk(ptr @a, ptr @b, i64 22, i64 -1)175 ret i64 %ret176}177 178define ptr @test_strncat() {179; CHECK-LABEL: @test_strncat(180; CHECK-NEXT: [[STRNCAT:%.*]] = call ptr @strncat(ptr noundef nonnull dereferenceable(1) @a, ptr noundef nonnull dereferenceable(1) @b, i64 22)181; CHECK-NEXT: ret ptr @a182;183 %ret = call ptr @__strncat_chk(ptr @a, ptr @b, i64 22, i64 -1)184 ret ptr %ret185}186 187define ptr @test_not_strncat() {188; CHECK-LABEL: @test_not_strncat(189; CHECK-NEXT: [[RET:%.*]] = call ptr @__strncat_chk(ptr nonnull @a, ptr nonnull @b, i64 22, i64 3)190; CHECK-NEXT: ret ptr [[RET]]191;192 %ret = call ptr @__strncat_chk(ptr @a, ptr @b, i64 22, i64 3)193 ret ptr %ret194}195 196define ptr @test_strncat_tail() {197; CHECK-LABEL: @test_strncat_tail(198; CHECK-NEXT: [[STRNCAT:%.*]] = tail call ptr @strncat(ptr noundef nonnull dereferenceable(1) @a, ptr noundef nonnull dereferenceable(1) @b, i64 22)199; CHECK-NEXT: ret ptr @a200;201 %ret = tail call ptr @__strncat_chk(ptr @a, ptr @b, i64 22, i64 -1)202 ret ptr %ret203}204 205define i64 @test_strlcpy() {206; CHECK-LABEL: @test_strlcpy(207; CHECK-NEXT: [[STRLCPY:%.*]] = call i64 @strlcpy(ptr noundef nonnull dereferenceable(1) @a, ptr noundef nonnull dereferenceable(1) @b, i64 22)208; CHECK-NEXT: ret i64 [[STRLCPY]]209;210 %ret = call i64 @__strlcpy_chk(ptr @a, ptr @b, i64 22, i64 -1)211 ret i64 %ret212}213 214define i64 @test_not_strlcpy() {215; CHECK-LABEL: @test_not_strlcpy(216; CHECK-NEXT: [[RET:%.*]] = call i64 @__strlcpy_chk(ptr nonnull @a, ptr nonnull @b, i64 22, i64 2)217; CHECK-NEXT: ret i64 [[RET]]218;219 %ret = call i64 @__strlcpy_chk(ptr @a, ptr @b, i64 22, i64 2)220 ret i64 %ret221}222 223define i64 @test_strlcpy_tail() {224; CHECK-LABEL: @test_strlcpy_tail(225; CHECK-NEXT: [[STRLCPY:%.*]] = tail call i64 @strlcpy(ptr noundef nonnull dereferenceable(1) @a, ptr noundef nonnull dereferenceable(1) @b, i64 22)226; CHECK-NEXT: ret i64 [[STRLCPY]]227;228 %ret = tail call i64 @__strlcpy_chk(ptr @a, ptr @b, i64 22, i64 -1)229 ret i64 %ret230}231 232define i32 @test_vsnprintf() {233; CHECK-LABEL: @test_vsnprintf(234; CHECK-NEXT: [[VSNPRINTF:%.*]] = call i32 @vsnprintf(ptr nonnull @a, i64 4, ptr nonnull @b, ptr null)235; CHECK-NEXT: ret i32 [[VSNPRINTF]]236;237 ; ret i32238 %ret = call i32 @__vsnprintf_chk(ptr @a, i64 4, i32 0, i64 -1, ptr @b, ptr null)239 ret i32 %ret240}241 242define i32 @test_not_vsnprintf() {243; CHECK-LABEL: @test_not_vsnprintf(244; CHECK-NEXT: [[RET:%.*]] = call i32 @__vsnprintf_chk(ptr nonnull @a, i64 4, i32 0, i64 3, ptr nonnull @b, ptr null)245; CHECK-NEXT: [[IGN:%.*]] = call i32 @__vsnprintf_chk(ptr nonnull @a, i64 4, i32 1, i64 -1, ptr nonnull @b, ptr null)246; CHECK-NEXT: ret i32 [[RET]]247;248 ; ret i32249 %ret = call i32 @__vsnprintf_chk(ptr @a, i64 4, i32 0, i64 3, ptr @b, ptr null)250 %ign = call i32 @__vsnprintf_chk(ptr @a, i64 4, i32 1, i64 -1, ptr @b, ptr null)251 ret i32 %ret252}253 254define i32 @test_vsnprintf_tail() {255; CHECK-LABEL: @test_vsnprintf_tail(256; CHECK-NEXT: [[VSNPRINTF:%.*]] = tail call i32 @vsnprintf(ptr nonnull @a, i64 4, ptr nonnull @b, ptr null)257; CHECK-NEXT: ret i32 [[VSNPRINTF]]258;259 ; ret i32260 %ret = tail call i32 @__vsnprintf_chk(ptr @a, i64 4, i32 0, i64 -1, ptr @b, ptr null)261 ret i32 %ret262}263 264define i32 @test_vsprintf() {265; CHECK-LABEL: @test_vsprintf(266; CHECK-NEXT: [[VSPRINTF:%.*]] = call i32 @vsprintf(ptr nonnull @a, ptr nonnull @b, ptr null)267; CHECK-NEXT: ret i32 [[VSPRINTF]]268;269 ; ret i32270 %ret = call i32 @__vsprintf_chk(ptr @a, i32 0, i64 -1, ptr @b, ptr null)271 ret i32 %ret272}273 274define i32 @test_not_vsprintf() {275; CHECK-LABEL: @test_not_vsprintf(276; CHECK-NEXT: [[RET:%.*]] = call i32 @__vsprintf_chk(ptr nonnull @a, i32 0, i64 3, ptr nonnull @b, ptr null)277; CHECK-NEXT: [[IGN:%.*]] = call i32 @__vsprintf_chk(ptr nonnull @a, i32 1, i64 -1, ptr nonnull @b, ptr null)278; CHECK-NEXT: ret i32 [[RET]]279;280 ; ret i32281 %ret = call i32 @__vsprintf_chk(ptr @a, i32 0, i64 3, ptr @b, ptr null)282 %ign = call i32 @__vsprintf_chk(ptr @a, i32 1, i64 -1, ptr @b, ptr null)283 ret i32 %ret284}285 286define i32 @test_vsprintf_tail() {287; CHECK-LABEL: @test_vsprintf_tail(288; CHECK-NEXT: [[VSPRINTF:%.*]] = tail call i32 @vsprintf(ptr nonnull @a, ptr nonnull @b, ptr null)289; CHECK-NEXT: ret i32 [[VSPRINTF]]290;291 ; ret i32292 %ret = tail call i32 @__vsprintf_chk(ptr @a, i32 0, i64 -1, ptr @b, ptr null)293 ret i32 %ret294}295 296declare ptr @__mempcpy_chk(ptr, ptr, i64, i64)297declare ptr @__memccpy_chk(ptr, ptr, i32, i64, i64)298declare i32 @__snprintf_chk(ptr, i64, i32, i64, ptr, ...)299declare i32 @__sprintf_chk(ptr, i32, i64, ptr, ...)300declare ptr @__strcat_chk(ptr, ptr, i64)301declare i64 @__strlcat_chk(ptr, ptr, i64, i64)302declare ptr @__strncat_chk(ptr, ptr, i64, i64)303declare i64 @__strlcpy_chk(ptr, ptr, i64, i64)304declare i32 @__vsnprintf_chk(ptr, i64, i32, i64, ptr, ptr)305declare i32 @__vsprintf_chk(ptr, i32, i64, ptr, ptr)306