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