493 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:e-i64:64-f80:128-n8:16:32:64-S128"5 6@key = constant [4 x i8] c"key\00", align 17@abc = constant [8 x i8] c"abc\00de\00\00", align 18 9declare void @use(i32)10 11define i32 @strcmp_memcmp(ptr dereferenceable (12) %buf) nofree nosync {12; CHECK-LABEL: @strcmp_memcmp(13; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)14; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 015; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i3216; CHECK-NEXT: ret i32 [[CONV]]17;18 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)19 %cmp = icmp eq i32 %call, 020 %conv = zext i1 %cmp to i3221 ret i32 %conv22}23 24declare i32 @strcmp(ptr nocapture, ptr nocapture)25 26define i32 @strcmp_memcmp2(ptr dereferenceable (12) %buf) nofree nosync {27; CHECK-LABEL: @strcmp_memcmp2(28; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)29; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 030; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i3231; CHECK-NEXT: ret i32 [[CONV]]32;33 %call = call i32 @strcmp(ptr @key, ptr nonnull %buf)34 %cmp = icmp eq i32 %call, 035 %conv = zext i1 %cmp to i3236 ret i32 %conv37}38 39define i32 @strcmp_memcmp3(ptr dereferenceable (12) %buf) nofree nosync {40; CHECK-LABEL: @strcmp_memcmp3(41; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)42; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[MEMCMP]], 043; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i3244; CHECK-NEXT: ret i32 [[CONV]]45;46 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)47 %cmp = icmp ne i32 %call, 048 %conv = zext i1 %cmp to i3249 ret i32 %conv50}51 52define i32 @strcmp_memcmp4(ptr dereferenceable (12) %buf) nofree nosync {53; CHECK-LABEL: @strcmp_memcmp4(54; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)55; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[MEMCMP]], 056; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i3257; CHECK-NEXT: ret i32 [[CONV]]58;59 %call = call i32 @strcmp(ptr @key, ptr nonnull %buf)60 %cmp = icmp ne i32 %call, 061 %conv = zext i1 %cmp to i3262 ret i32 %conv63}64 65define i32 @strcmp_memcmp5(ptr dereferenceable (5) %buf) nofree nosync {66; CHECK-LABEL: @strcmp_memcmp5(67; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)68; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 069; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i3270; CHECK-NEXT: ret i32 [[CONV]]71;72 %call = call i32 @strcmp(ptr nonnull align 1 %buf, ptr @key)73 %cmp = icmp eq i32 %call, 074 %conv = zext i1 %cmp to i3275 ret i32 %conv76}77 78define i32 @strcmp_memcmp6(ptr dereferenceable (12) %buf) nofree nosync {79; CHECK-LABEL: @strcmp_memcmp6(80; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)81; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[MEMCMP]], 082; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i3283; CHECK-NEXT: ret i32 [[CONV]]84;85 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)86 %cmp = icmp sgt i32 %call, 087 %conv = zext i1 %cmp to i3288 ret i32 %conv89}90 91define i32 @strcmp_memcmp7(ptr dereferenceable (12) %buf) nofree nosync {92; CHECK-LABEL: @strcmp_memcmp7(93; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)94; CHECK-NEXT: [[MEMCMP_LOBIT:%.*]] = lshr i32 [[MEMCMP]], 3195; CHECK-NEXT: ret i32 [[MEMCMP_LOBIT]]96;97 %call = call i32 @strcmp(ptr @key, ptr nonnull %buf)98 %cmp = icmp slt i32 %call, 099 %conv = zext i1 %cmp to i32100 ret i32 %conv101}102 103define i32 @strcmp_memcmp8(ptr dereferenceable (4) %buf) nofree nosync {104; CHECK-LABEL: @strcmp_memcmp8(105; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)106; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0107; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32108; CHECK-NEXT: ret i32 [[CONV]]109;110 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)111 %cmp = icmp eq i32 %call, 0112 %conv = zext i1 %cmp to i32113 ret i32 %conv114}115 116define i32 @strcmp_memcmp9(ptr dereferenceable (12) %buf) nofree nosync {117; CHECK-LABEL: @strcmp_memcmp9(118; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @abc, i64 4)119; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0120; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32121; CHECK-NEXT: ret i32 [[CONV]]122;123 %call = call i32 @strcmp(ptr nonnull %buf, ptr @abc)124 %cmp = icmp eq i32 %call, 0125 %conv = zext i1 %cmp to i32126 ret i32 %conv127}128 129 130define i32 @strncmp_memcmp(ptr dereferenceable (12) %buf) nofree nosync {131; CHECK-LABEL: @strncmp_memcmp(132; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(2) [[BUF:%.*]], ptr noundef nonnull dereferenceable(2) @key, i64 2)133; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0134; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32135; CHECK-NEXT: ret i32 [[CONV]]136;137 %call = call i32 @strncmp(ptr nonnull %buf, ptr @key, i64 2)138 %cmp = icmp eq i32 %call, 0139 %conv = zext i1 %cmp to i32140 ret i32 %conv141}142 143declare i32 @strncmp(ptr nocapture, ptr nocapture, i64)144 145define i32 @strncmp_memcmp2(ptr dereferenceable (12) %buf) nofree nosync {146; CHECK-LABEL: @strncmp_memcmp2(147; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)148; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[MEMCMP]], 0149; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32150; CHECK-NEXT: ret i32 [[CONV]]151;152 %call = call i32 @strncmp(ptr nonnull %buf, ptr @key, i64 11)153 %cmp = icmp ne i32 %call, 0154 %conv = zext i1 %cmp to i32155 ret i32 %conv156}157 158define i32 @strncmp_memcmp3(ptr dereferenceable (12) %buf) nofree nosync {159; CHECK-LABEL: @strncmp_memcmp3(160; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)161; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0162; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32163; CHECK-NEXT: ret i32 [[CONV]]164;165 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 11)166 %cmp = icmp eq i32 %call, 0167 %conv = zext i1 %cmp to i32168 ret i32 %conv169}170 171define i32 @strncmp_memcmp4(ptr dereferenceable (12) %buf) nofree nosync {172; CHECK-LABEL: @strncmp_memcmp4(173; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)174; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0175; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32176; CHECK-NEXT: ret i32 [[CONV]]177;178 %call = call i32 @strncmp(ptr nonnull %buf, ptr @key, i64 5)179 %cmp = icmp eq i32 %call, 0180 %conv = zext i1 %cmp to i32181 ret i32 %conv182}183 184define i32 @strncmp_memcmp5(ptr dereferenceable (12) %buf) nofree nosync {185; CHECK-LABEL: @strncmp_memcmp5(186; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)187; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0188; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32189; CHECK-NEXT: ret i32 [[CONV]]190;191 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 5)192 %cmp = icmp eq i32 %call, 0193 %conv = zext i1 %cmp to i32194 ret i32 %conv195}196 197 198define i32 @strncmp_memcmp6(ptr dereferenceable (12) %buf) nofree nosync {199; CHECK-LABEL: @strncmp_memcmp6(200; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)201; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[MEMCMP]], 0202; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32203; CHECK-NEXT: ret i32 [[CONV]]204;205 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 5)206 %cmp = icmp ne i32 %call, 0207 %conv = zext i1 %cmp to i32208 ret i32 %conv209}210 211define i32 @strncmp_memcmp7(ptr dereferenceable (12) %buf) nofree nosync {212; CHECK-LABEL: @strncmp_memcmp7(213; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 4)214; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0215; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32216; CHECK-NEXT: ret i32 [[CONV]]217;218 %call = call i32 @strncmp(ptr nonnull %buf, ptr @key, i64 4)219 %cmp = icmp eq i32 %call, 0220 %conv = zext i1 %cmp to i32221 ret i32 %conv222}223 224define i32 @strncmp_memcmp8(ptr dereferenceable (12) %buf) nofree nosync {225; CHECK-LABEL: @strncmp_memcmp8(226; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(3) [[BUF:%.*]], ptr noundef nonnull dereferenceable(3) @key, i64 3)227; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0228; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32229; CHECK-NEXT: ret i32 [[CONV]]230;231 %call = call i32 @strncmp(ptr nonnull %buf, ptr @key, i64 3)232 %cmp = icmp eq i32 %call, 0233 %conv = zext i1 %cmp to i32234 ret i32 %conv235}236 237define i32 @strncmp_memcmp9(ptr dereferenceable (12) %buf) nofree nosync {238; CHECK-LABEL: @strncmp_memcmp9(239; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)240; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[MEMCMP]], 0241; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32242; CHECK-NEXT: ret i32 [[CONV]]243;244 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 5)245 %cmp = icmp sgt i32 %call, 0246 %conv = zext i1 %cmp to i32247 ret i32 %conv248}249 250define i32 @strncmp_memcmp10(ptr dereferenceable (12) %buf) nofree nosync {251; CHECK-LABEL: @strncmp_memcmp10(252; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)253; CHECK-NEXT: [[MEMCMP_LOBIT:%.*]] = lshr i32 [[MEMCMP]], 31254; CHECK-NEXT: ret i32 [[MEMCMP_LOBIT]]255;256 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 5)257 %cmp = icmp slt i32 %call, 0258 %conv = zext i1 %cmp to i32259 ret i32 %conv260}261 262define i32 @strncmp_memcmp11(ptr dereferenceable (12) %buf) nofree nosync {263; CHECK-LABEL: @strncmp_memcmp11(264; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)265; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0266; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32267; CHECK-NEXT: ret i32 [[CONV]]268;269 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 12)270 %cmp = icmp eq i32 %call, 0271 %conv = zext i1 %cmp to i32272 ret i32 %conv273}274 275define i32 @strncmp_memcmp12(ptr dereferenceable (12) %buf) nofree nosync {276; CHECK-LABEL: @strncmp_memcmp12(277; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], i64 4)278; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0279; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32280; CHECK-NEXT: ret i32 [[CONV]]281;282 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 12)283 %cmp = icmp eq i32 %call, 0284 %conv = zext i1 %cmp to i32285 ret i32 %conv286}287 288define i32 @strncmp_memcmp13(ptr dereferenceable (12) %buf) nofree nosync {289; CHECK-LABEL: @strncmp_memcmp13(290; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(2) [[BUF:%.*]], ptr noundef nonnull dereferenceable(2) @abc, i64 2)291; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0292; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32293; CHECK-NEXT: ret i32 [[CONV]]294;295 %call = call i32 @strncmp(ptr nonnull %buf, ptr @abc, i64 2)296 %cmp = icmp eq i32 %call, 0297 %conv = zext i1 %cmp to i32298 ret i32 %conv299}300 301define i32 @strncmp_memcmp14(ptr dereferenceable (12) %buf) nofree nosync {302; CHECK-LABEL: @strncmp_memcmp14(303; CHECK-NEXT: [[MEMCMP:%.*]] = call i32 @memcmp(ptr noundef nonnull dereferenceable(4) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @abc, i64 4)304; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[MEMCMP]], 0305; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32306; CHECK-NEXT: ret i32 [[CONV]]307;308 %call = call i32 @strncmp(ptr nonnull %buf, ptr @abc, i64 12)309 %cmp = icmp eq i32 %call, 0310 %conv = zext i1 %cmp to i32311 ret i32 %conv312}313 314; Negative tests315define i32 @strcmp_memcmp_bad(ptr dereferenceable (12) %buf) nofree nosync {316; CHECK-LABEL: @strcmp_memcmp_bad(317; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key)318; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CALL]], 3319; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32320; CHECK-NEXT: ret i32 [[CONV]]321;322 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)323 %cmp = icmp sgt i32 %call, 3324 %conv = zext i1 %cmp to i32325 ret i32 %conv326}327 328define i32 @strcmp_memcmp_bad2(ptr dereferenceable (12) %buf) nofree nosync {329; CHECK-LABEL: @strcmp_memcmp_bad2(330; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(1) [[BUF:%.*]])331; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[CALL]], 3332; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32333; CHECK-NEXT: ret i32 [[CONV]]334;335 %call = call i32 @strcmp(ptr @key, ptr nonnull %buf)336 %cmp = icmp slt i32 %call, 3337 %conv = zext i1 %cmp to i32338 ret i32 %conv339}340 341define i32 @strcmp_memcmp_bad3(ptr dereferenceable (12) %buf) nofree nosync {342; CHECK-LABEL: @strcmp_memcmp_bad3(343; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key)344; CHECK-NEXT: ret i32 [[CALL]]345;346 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)347 ret i32 %call348}349 350 351define i32 @strcmp_memcmp_bad4(ptr nocapture readonly %buf) nofree nosync {352; CHECK-LABEL: @strcmp_memcmp_bad4(353; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(1) [[BUF:%.*]])354; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], 0355; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32356; CHECK-NEXT: ret i32 [[CONV]]357;358 %call = tail call i32 @strcmp(ptr @key, ptr %buf)359 %cmp = icmp eq i32 %call, 0360 %conv = zext i1 %cmp to i32361 ret i32 %conv362}363 364 365define i32 @strcmp_memcmp_bad5(ptr dereferenceable (3) %buf) nofree nosync {366; CHECK-LABEL: @strcmp_memcmp_bad5(367; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key)368; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], 0369; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32370; CHECK-NEXT: ret i32 [[CONV]]371;372 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)373 %cmp = icmp eq i32 %call, 0374 %conv = zext i1 %cmp to i32375 ret i32 %conv376}377 378define i32 @strcmp_memcmp_bad6(ptr dereferenceable (4) %buf, ptr nocapture readonly %k) nofree nosync {379; CHECK-LABEL: @strcmp_memcmp_bad6(380; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], ptr noundef nonnull dereferenceable(1) [[K:%.*]])381; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], 0382; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32383; CHECK-NEXT: ret i32 [[CONV]]384;385 %call = call i32 @strcmp(ptr nonnull %buf, ptr %k)386 %cmp = icmp eq i32 %call, 0387 %conv = zext i1 %cmp to i32388 ret i32 %conv389}390 391define i32 @strcmp_memcmp_bad7(ptr nocapture readonly %k) nofree nosync {392; CHECK-LABEL: @strcmp_memcmp_bad7(393; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @strcmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(1) [[K:%.*]])394; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], 0395; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32396; CHECK-NEXT: ret i32 [[CONV]]397;398 %call = tail call i32 @strcmp(ptr @key, ptr %k)399 %cmp = icmp eq i32 %call, 0400 %conv = zext i1 %cmp to i32401 ret i32 %conv402}403 404define i32 @strcmp_memcmp_bad8(ptr dereferenceable (4) %buf) nofree nosync {405; CHECK-LABEL: @strcmp_memcmp_bad8(406; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key)407; CHECK-NEXT: tail call void @use(i32 [[CALL]])408; CHECK-NEXT: ret i32 0409;410 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)411 tail call void @use(i32 %call)412 ret i32 0413}414 415define i32 @strncmp_memcmp_bad(ptr dereferenceable (12) %buf) nofree nosync {416; CHECK-LABEL: @strncmp_memcmp_bad(417; CHECK-NEXT: [[CALL:%.*]] = call i32 @strncmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], i64 5)418; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CALL]], 3419; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32420; CHECK-NEXT: ret i32 [[CONV]]421;422 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 5)423 %cmp = icmp sgt i32 %call, 3424 %conv = zext i1 %cmp to i32425 ret i32 %conv426}427 428 429define i32 @strncmp_memcmp_bad1(ptr dereferenceable (12) %buf) nofree nosync {430; CHECK-LABEL: @strncmp_memcmp_bad1(431; CHECK-NEXT: [[CALL:%.*]] = call i32 @strncmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], i64 5)432; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[CALL]], 3433; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32434; CHECK-NEXT: ret i32 [[CONV]]435;436 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 5)437 %cmp = icmp slt i32 %call, 3438 %conv = zext i1 %cmp to i32439 ret i32 %conv440}441 442define i32 @strncmp_memcmp_bad2(ptr dereferenceable (12) %buf, i64 %n) nofree nosync {443; CHECK-LABEL: @strncmp_memcmp_bad2(444; CHECK-NEXT: [[CALL:%.*]] = call i32 @strncmp(ptr nonnull @key, ptr nonnull [[BUF:%.*]], i64 [[N:%.*]])445; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[CALL]], 1446; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32447; CHECK-NEXT: ret i32 [[CONV]]448;449 %call = call i32 @strncmp(ptr @key, ptr nonnull %buf, i64 %n)450 %cmp = icmp slt i32 %call, 1451 %conv = zext i1 %cmp to i32452 ret i32 %conv453}454 455define i32 @strncmp_memcmp_bad3(ptr nocapture readonly %k) nofree nosync {456; CHECK-LABEL: @strncmp_memcmp_bad3(457; CHECK-NEXT: [[CALL:%.*]] = tail call i32 @strncmp(ptr noundef nonnull dereferenceable(4) @key, ptr noundef nonnull dereferenceable(1) [[K:%.*]], i64 2)458; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], 0459; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32460; CHECK-NEXT: ret i32 [[CONV]]461;462 %call = tail call i32 @strncmp(ptr @key, ptr %k, i64 2)463 %cmp = icmp eq i32 %call, 0464 %conv = zext i1 %cmp to i32465 ret i32 %conv466}467 468define i32 @strncmp_memcmp_bad4(ptr dereferenceable (4) %buf) nofree nosync {469; CHECK-LABEL: @strncmp_memcmp_bad4(470; CHECK-NEXT: [[CALL:%.*]] = call i32 @strncmp(ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key, i64 2)471; CHECK-NEXT: tail call void @use(i32 [[CALL]])472; CHECK-NEXT: ret i32 0473;474 %call = call i32 @strncmp(ptr nonnull %buf, ptr @key, i64 2)475 tail call void @use(i32 %call)476 ret i32 0477}478 479define i32 @strcmp_memcmp_msan(ptr dereferenceable (12) %buf) sanitize_memory {480; CHECK-LABEL: @strcmp_memcmp_msan(481; CHECK-NEXT: [[CALL:%.*]] = call i32 @strcmp(ptr noundef nonnull dereferenceable(1) [[BUF:%.*]], ptr noundef nonnull dereferenceable(4) @key)482; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[CALL]], 0483; CHECK-NEXT: [[CONV:%.*]] = zext i1 [[CMP]] to i32484; CHECK-NEXT: ret i32 [[CONV]]485;486 %call = call i32 @strcmp(ptr nonnull %buf, ptr @key)487 %cmp = icmp eq i32 %call, 0488 %conv = zext i1 %cmp to i32489 ret i32 %conv490}491 492declare i32 @memcmp(ptr nocapture, ptr nocapture, i64)493