Home | History | Annotate | Download | only in InstCombine
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -instcombine -S | FileCheck %s
      3 
      4 @.str = private unnamed_addr constant [3 x i8] c"12\00", align 1
      5 @.str.1 = private unnamed_addr constant [2 x i8] c"0\00", align 1
      6 @.str.2 = private unnamed_addr constant [11 x i8] c"4294967296\00", align 1
      7 @.str.3 = private unnamed_addr constant [24 x i8] c"10000000000000000000000\00", align 1
      8 @.str.4 = private unnamed_addr constant [20 x i8] c"9923372036854775807\00", align 1
      9 @.str.5 = private unnamed_addr constant [11 x i8] c"4994967295\00", align 1
     10 @.str.6 = private unnamed_addr constant [10 x i8] c"499496729\00", align 1
     11 @.str.7 = private unnamed_addr constant [11 x i8] c"4994967295\00", align 1
     12 
     13 declare i64 @strtol(i8*, i8**, i32)
     14 declare i32 @atoi(i8*)
     15 declare i64 @atol(i8*)
     16 declare i64 @atoll(i8*)
     17 declare i64 @strtoll(i8*, i8**, i32)
     18 
     19 define i64 @strtol_dec() #0 {
     20 ; CHECK-LABEL: @strtol_dec(
     21 ; CHECK-NEXT:    ret i64 12
     22 ;
     23   %call = call i64 @strtol(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8** null, i32 10) #2
     24   ret i64 %call
     25 }
     26 
     27 define i64 @strtol_base_zero() #0 {
     28 ; CHECK-LABEL: @strtol_base_zero(
     29 ; CHECK-NEXT:    ret i64 12
     30 ;
     31   %call = call i64 @strtol(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8** null, i32 0) #2
     32   ret i64 %call
     33 }
     34 
     35 define i64 @strtol_hex() #0 {
     36 ; CHECK-LABEL: @strtol_hex(
     37 ; CHECK-NEXT:    ret i64 18
     38 ;
     39   %call = call i64 @strtol(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8** null, i32 16) #2
     40   ret i64 %call
     41 }
     42 
     43 define i64 @strtol_endptr_not_null() #0 {
     44 ; CHECK-LABEL: @strtol_endptr_not_null(
     45 ; CHECK-NEXT:    [[END:%.*]] = alloca i8*, align 4
     46 ; CHECK-NEXT:    [[CALL:%.*]] = call i64 @strtol(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0), i8** nonnull [[END]], i32 10)
     47 ; CHECK-NEXT:    ret i64 [[CALL]]
     48 ;
     49   %end = alloca i8*, align 4
     50   %call = call i64 @strtol(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0), i8** %end, i32 10) #2
     51   ret i64 %call
     52 }
     53 
     54 define i32 @atoi_test() #0 {
     55 ; CHECK-LABEL: @atoi_test(
     56 ; CHECK-NEXT:    ret i32 12
     57 ;
     58   %call = call i32 @atoi(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0)) #4
     59   ret i32 %call
     60 }
     61 
     62 define i64 @strtol_not_const_str(i8* %s) #0 {
     63 ; CHECK-LABEL: @strtol_not_const_str(
     64 ; CHECK-NEXT:    [[CALL:%.*]] = call i64 @strtol(i8* nocapture [[S:%.*]], i8** null, i32 10)
     65 ; CHECK-NEXT:    ret i64 [[CALL]]
     66 ;
     67   %call = call i64 @strtol(i8* %s, i8** null, i32 10) #3
     68   ret i64 %call
     69 }
     70 
     71 define i32 @atoi_not_const_str(i8* %s) #0 {
     72 ; CHECK-LABEL: @atoi_not_const_str(
     73 ; CHECK-NEXT:    [[CALL:%.*]] = call i32 @atoi(i8* [[S:%.*]])
     74 ; CHECK-NEXT:    ret i32 [[CALL]]
     75 ;
     76   %call = call i32 @atoi(i8* %s) #4
     77   ret i32 %call
     78 }
     79 
     80 define i64 @strtol_not_const_base(i32 %b) #0 {
     81 ; CHECK-LABEL: @strtol_not_const_base(
     82 ; CHECK-NEXT:    [[CALL:%.*]] = call i64 @strtol(i8* nocapture getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8** null, i32 [[B:%.*]])
     83 ; CHECK-NEXT:    ret i64 [[CALL]]
     84 ;
     85   %call = call i64 @strtol(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8** null, i32 %b) #2
     86   ret i64 %call
     87 }
     88 
     89 define i64 @strtol_long_int() #0 {
     90 ; CHECK-LABEL: @strtol_long_int(
     91 ; CHECK-NEXT:    ret i64 4294967296
     92 ;
     93   %call = call i64 @strtol(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), i8** null, i32 10) #3
     94   ret i64 %call
     95 }
     96 
     97 
     98 define i64 @strtol_big_overflow() #0 {
     99 ; CHECK-LABEL: @strtol_big_overflow(
    100 ; CHECK-NEXT:    [[CALL:%.*]] = call i64 @strtol(i8* nocapture getelementptr inbounds ([24 x i8], [24 x i8]* @.str.3, i64 0, i64 0), i8** null, i32 10)
    101 ; CHECK-NEXT:    ret i64 [[CALL]]
    102 ;
    103   %call = call i64 @strtol(i8* nocapture getelementptr inbounds ([24 x i8], [24 x i8]* @.str.3, i64 0, i64 0), i8** null, i32 10) #2
    104   ret i64 %call
    105 }
    106 
    107 define i64 @atol_test() #0 {
    108 ; CHECK-LABEL: @atol_test(
    109 ; CHECK-NEXT:    ret i64 499496729
    110 ;
    111 ; CHECK-NEXT
    112   %call = call i64 @atol(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i32 0, i32 0)) #4
    113   ret i64 %call
    114 }
    115 
    116 define i64 @atoll_test() #0 {
    117 ; CHECK-LABEL: @atoll_test(
    118 ; CHECK-NEXT:    ret i64 4994967295
    119 ;
    120   %call = call i64 @atoll(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i32 0, i32 0)) #3
    121   ret i64 %call
    122 }
    123 
    124 define i64 @strtoll_test() #0 {
    125 ; CHECK-LABEL: @strtoll_test(
    126 ; CHECK-NEXT:    ret i64 4994967295
    127 ;
    128 ; CHECK-NEXT
    129   %call = call i64 @strtoll(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.7, i32 0, i32 0), i8** null, i32 10) #5
    130   ret i64 %call
    131 }
    132