brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · 6fbe960 Raw
189 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -passes=aggressive-instcombine --memchr-inline-threshold=5 < %s | FileCheck %s3 4@str = constant [5 x i8] c"01\002\00", align 15@str_long = constant [8 x i8] c"0123456\00", align 16 7declare ptr @memchr(ptr, i32, i64)8 9define i1 @test_memchr_null(i32 %x) !prof !0 {10; CHECK-LABEL: define i1 @test_memchr_null(11; CHECK-SAME: i32 [[X:%.*]]) 12; CHECK: !prof [[PROF_0:![0-9]+]] {13; CHECK-NEXT:  [[ENTRY:.*]]:14; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[X]] to i815; CHECK-NEXT:    switch i8 [[TMP0]], label %[[ENTRY_SPLIT:.*]] [16; CHECK-NEXT:      i8 48, label %[[MEMCHR_CASE:.*]]17; CHECK-NEXT:      i8 49, label %[[MEMCHR_CASE1:.*]]18; CHECK-NEXT:      i8 0, label %[[MEMCHR_CASE2:.*]]19; CHECK-NEXT:      i8 50, label %[[MEMCHR_CASE3:.*]]20; CHECK-NEXT:    ]21; CHECK:       [[MEMCHR_CASE]]:22; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS:.*]]23; CHECK:       [[MEMCHR_CASE1]]:24; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]25; CHECK:       [[MEMCHR_CASE2]]:26; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]27; CHECK:       [[MEMCHR_CASE3]]:28; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]29; CHECK:       [[MEMCHR_SUCCESS]]:30; CHECK-NEXT:    [[MEMCHR_IDX:%.*]] = phi i64 [ 0, %[[MEMCHR_CASE]] ], [ 1, %[[MEMCHR_CASE1]] ], [ 2, %[[MEMCHR_CASE2]] ], [ 3, %[[MEMCHR_CASE3]] ]31; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @str, i64 [[MEMCHR_IDX]]32; CHECK-NEXT:    br label %[[ENTRY_SPLIT]]33; CHECK:       [[ENTRY_SPLIT]]:34; CHECK-NEXT:    [[MEMCHR4:%.*]] = phi ptr [ null, %[[ENTRY]] ], [ [[TMP1]], %[[MEMCHR_SUCCESS]] ]35; CHECK-NEXT:    [[ISNULL:%.*]] = icmp eq ptr [[MEMCHR4]], null36; CHECK-NEXT:    ret i1 [[ISNULL]]37;38entry:39  %memchr = call ptr @memchr(ptr @str, i32 %x, i64 5)40  %isnull = icmp eq ptr %memchr, null41  ret i1 %isnull42}43 44define ptr @test_memchr(i32 %x) !prof !0 {45; CHECK-LABEL: define ptr @test_memchr(46; CHECK-SAME: i32 [[X:%.*]]) 47; CHECK: !prof [[PROF_0]] {48; CHECK-NEXT:  [[ENTRY:.*]]:49; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[X]] to i850; CHECK-NEXT:    switch i8 [[TMP0]], label %[[ENTRY_SPLIT:.*]] [51; CHECK-NEXT:      i8 48, label %[[MEMCHR_CASE:.*]]52; CHECK-NEXT:      i8 49, label %[[MEMCHR_CASE1:.*]]53; CHECK-NEXT:      i8 0, label %[[MEMCHR_CASE2:.*]]54; CHECK-NEXT:      i8 50, label %[[MEMCHR_CASE3:.*]]55; CHECK-NEXT:    ]56; CHECK:       [[MEMCHR_CASE]]:57; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS:.*]]58; CHECK:       [[MEMCHR_CASE1]]:59; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]60; CHECK:       [[MEMCHR_CASE2]]:61; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]62; CHECK:       [[MEMCHR_CASE3]]:63; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]64; CHECK:       [[MEMCHR_SUCCESS]]:65; CHECK-NEXT:    [[MEMCHR_IDX:%.*]] = phi i64 [ 0, %[[MEMCHR_CASE]] ], [ 1, %[[MEMCHR_CASE1]] ], [ 2, %[[MEMCHR_CASE2]] ], [ 3, %[[MEMCHR_CASE3]] ]66; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @str, i64 [[MEMCHR_IDX]]67; CHECK-NEXT:    br label %[[ENTRY_SPLIT]]68; CHECK:       [[ENTRY_SPLIT]]:69; CHECK-NEXT:    [[MEMCHR4:%.*]] = phi ptr [ null, %[[ENTRY]] ], [ [[TMP1]], %[[MEMCHR_SUCCESS]] ]70; CHECK-NEXT:    ret ptr [[MEMCHR4]]71;72entry:73  %memchr = call ptr @memchr(ptr @str, i32 %x, i64 5)74  ret ptr %memchr75}76 77define ptr @test_memchr_smaller_n(i32 %x) !prof !0 {78; CHECK-LABEL: define ptr @test_memchr_smaller_n(79; CHECK-SAME: i32 [[X:%.*]]) 80; CHECK: !prof [[PROF_0]] {81; CHECK-NEXT:  [[ENTRY:.*]]:82; CHECK-NEXT:    [[TMP0:%.*]] = trunc i32 [[X]] to i883; CHECK-NEXT:    switch i8 [[TMP0]], label %[[ENTRY_SPLIT:.*]] [84; CHECK-NEXT:      i8 48, label %[[MEMCHR_CASE:.*]]85; CHECK-NEXT:      i8 49, label %[[MEMCHR_CASE1:.*]]86; CHECK-NEXT:      i8 0, label %[[MEMCHR_CASE2:.*]]87; CHECK-NEXT:    ], !prof [[PROF_1:![0-9]+]]88; CHECK:       [[MEMCHR_CASE]]:89; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS:.*]]90; CHECK:       [[MEMCHR_CASE1]]:91; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]92; CHECK:       [[MEMCHR_CASE2]]:93; CHECK-NEXT:    br label %[[MEMCHR_SUCCESS]]94; CHECK:       [[MEMCHR_SUCCESS]]:95; CHECK-NEXT:    [[MEMCHR_IDX:%.*]] = phi i64 [ 0, %[[MEMCHR_CASE]] ], [ 1, %[[MEMCHR_CASE1]] ], [ 2, %[[MEMCHR_CASE2]] ]96; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @str, i64 [[MEMCHR_IDX]]97; CHECK-NEXT:    br label %[[ENTRY_SPLIT]]98; CHECK:       [[ENTRY_SPLIT]]:99; CHECK-NEXT:    [[MEMCHR3:%.*]] = phi ptr [ null, %[[ENTRY]] ], [ [[TMP1]], %[[MEMCHR_SUCCESS]] ]100; CHECK-NEXT:    ret ptr [[MEMCHR3]]101;102entry:103  %memchr = call ptr @memchr(ptr @str, i32 %x, i64 3)104  ret ptr %memchr105}106 107; negative tests108 109define ptr @test_memchr_larger_n(i32 %x) !prof !0 {110; CHECK-LABEL: define ptr @test_memchr_larger_n(111; CHECK-SAME: i32 [[X:%.*]])112; CHECK: !prof [[PROF_0]] {113; CHECK-NEXT:  [[ENTRY:.*:]]114; CHECK-NEXT:    [[MEMCHR:%.*]] = call ptr @memchr(ptr @str, i32 [[X]], i64 6)115; CHECK-NEXT:    ret ptr [[MEMCHR]]116;117entry:118  %memchr = call ptr @memchr(ptr @str, i32 %x, i64 6)119  ret ptr %memchr120}121 122define ptr @test_memchr_non_constant(i32 %x, ptr %str) !prof !0 {123; CHECK-LABEL: define ptr @test_memchr_non_constant(124; CHECK-SAME: i32 [[X:%.*]], ptr [[STR:%.*]]) 125; CHECK: !prof [[PROF_0]] {126; CHECK-NEXT:  [[ENTRY:.*:]]127; CHECK-NEXT:    [[MEMCHR:%.*]] = call ptr @memchr(ptr [[STR]], i32 [[X]], i64 5)128; CHECK-NEXT:    ret ptr [[MEMCHR]]129;130entry:131  %memchr = call ptr @memchr(ptr %str, i32 %x, i64 5)132  ret ptr %memchr133}134 135define ptr @test_memchr_constant_ch() !prof !0 {136; CHECK-LABEL: define ptr @test_memchr_constant_ch() 137; CHECK: !prof [[PROF_0]] {138; CHECK-NEXT:  [[ENTRY:.*:]]139; CHECK-NEXT:    [[MEMCHR:%.*]] = call ptr @memchr(ptr @str, i32 49, i64 5)140; CHECK-NEXT:    ret ptr [[MEMCHR]]141;142entry:143  %memchr = call ptr @memchr(ptr @str, i32 49, i64 5)144  ret ptr %memchr145}146 147define ptr @test_memchr_dynamic_n(i32 %x, i32 %y) !prof !0 {148; CHECK-LABEL: define ptr @test_memchr_dynamic_n(149; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) 150; CHECK: !prof [[PROF_0]] {151; CHECK-NEXT:  [[ENTRY:.*:]]152; CHECK-NEXT:    [[MEMCHR:%.*]] = call ptr @memchr(ptr @str, i32 [[X]], i32 [[Y]])153; CHECK-NEXT:    ret ptr [[MEMCHR]]154;155entry:156  %memchr = call ptr @memchr(ptr @str, i32 %x, i32 %y)157  ret ptr %memchr158}159 160define ptr @test_memchr_long(i32 %x) !prof !0 {161; CHECK-LABEL: define ptr @test_memchr_long(162; CHECK-SAME: i32 [[X:%.*]])163; CHECK: !prof [[PROF_0]] {164; CHECK-NEXT:  [[ENTRY:.*:]]165; CHECK-NEXT:    [[MEMCHR:%.*]] = call ptr @memchr(ptr @str_long, i32 [[X]], i64 8)166; CHECK-NEXT:    ret ptr [[MEMCHR]]167;168entry:169  %memchr = call ptr @memchr(ptr @str_long, i32 %x, i64 8)170  ret ptr %memchr171}172 173; We want to check that the compiler still calls memchr if the length is non-constant:174define ptr @test_memchr_non_constant_length2(i32 %x, i64 %len) !prof !0 {175; CHECK-LABEL: define ptr @test_memchr_non_constant_length2(176; CHECK-SAME: i32 [[X:%.*]], i64 [[LEN:%.*]]) 177; CHECK: !prof [[PROF_0]] {178; CHECK-NEXT:  [[ENTRY:.*:]]179; CHECK-NEXT:    [[MEMCHR:%.*]] = call ptr @memchr(ptr @str, i32 [[X]], i64 [[LEN]])180; CHECK-NEXT:    ret ptr [[MEMCHR]]181;182entry:183  %memchr = call ptr @memchr(ptr @str, i32 %x, i64 %len)184  ret ptr %memchr185}186 187!0 = !{!"function_entry_count", i64 1000}188; CHECK: [[PROF_0]] = !{!"function_entry_count", i64 1000}189; CHECK: [[PROF_1]] = !{!"unknown", !"aggressive-instcombine"}