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
13declare i64 @strtol(i8*, i8**, i32)
14declare i32 @atoi(i8*)
15declare i64 @atol(i8*)
16declare i64 @atoll(i8*)
17declare i64 @strtoll(i8*, i8**, i32)
18
19define 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
27define 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
35define 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
43define 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
54define 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
62define 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
71define 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
80define 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
89define 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
98define 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
107define 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
116define 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
124define 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