[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / InstCombine / str-int-2.ll
blob37e64a31ee8cf44447acf547a9abdb0f9e1832c3
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
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
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)
19 define i64 @strtol_dec() #0 {
20 ; CHECK-LABEL: @strtol_dec(
21 ; CHECK-NEXT:    ret i64 12
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
27 define i64 @strtol_base_zero() #0 {
28 ; CHECK-LABEL: @strtol_base_zero(
29 ; CHECK-NEXT:    ret i64 12
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
35 define i64 @strtol_hex() #0 {
36 ; CHECK-LABEL: @strtol_hex(
37 ; CHECK-NEXT:    ret i64 18
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
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]]
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
54 define i32 @atoi_test() #0 {
55 ; CHECK-LABEL: @atoi_test(
56 ; CHECK-NEXT:    ret i32 12
58   %call = call i32 @atoi(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0)) #4
59   ret i32 %call
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]]
67   %call = call i64 @strtol(i8* %s, i8** null, i32 10) #3
68   ret i64 %call
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]]
76   %call = call i32 @atoi(i8* %s) #4
77   ret i32 %call
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]]
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
89 define i64 @strtol_long_int() #0 {
90 ; CHECK-LABEL: @strtol_long_int(
91 ; CHECK-NEXT:    ret i64 4294967296
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
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]]
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
107 define i64 @atol_test() #0 {
108 ; CHECK-LABEL: @atol_test(
109 ; CHECK-NEXT:    ret i64 499496729
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
116 define i64 @atoll_test() #0 {
117 ; CHECK-LABEL: @atoll_test(
118 ; CHECK-NEXT:    ret i64 4994967295
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
124 define i64 @strtoll_test() #0 {
125 ; CHECK-LABEL: @strtoll_test(
126 ; CHECK-NEXT:    ret i64 4994967295
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