brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.9 KiB · f0e6a06 Raw
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