147 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4@.str = private unnamed_addr constant [3 x i8] c"12\00", align 15@.str.1 = private unnamed_addr constant [2 x i8] c"0\00", align 16@.str.2 = private unnamed_addr constant [11 x i8] c"4294967296\00", align 17@.str.3 = private unnamed_addr constant [24 x i8] c"10000000000000000000000\00", align 18@.str.4 = private unnamed_addr constant [20 x i8] c"9923372036854775807\00", align 19@.str.5 = private unnamed_addr constant [11 x i8] c"4994967295\00", align 110@.str.6 = private unnamed_addr constant [10 x i8] c"499496729\00", align 111@.str.7 = private unnamed_addr constant [11 x i8] c"4994967295\00", align 112 13declare i32 @strtol(ptr, ptr, i32)14declare i32 @atoi(ptr)15declare i32 @atol(ptr)16declare i64 @atoll(ptr)17declare i64 @strtoll(ptr, ptr, i32)18 19define i32 @strtol_dec() #0 {20; CHECK-LABEL: @strtol_dec(21; CHECK-NEXT: ret i32 1222;23 %call = call i32 @strtol(ptr @.str, ptr null, i32 10) #224 ret i32 %call25}26 27define i32 @strtol_base_zero() #0 {28; CHECK-LABEL: @strtol_base_zero(29; CHECK-NEXT: ret i32 1230;31 %call = call i32 @strtol(ptr @.str, ptr null, i32 0) #232 ret i32 %call33}34 35define i32 @strtol_hex() #0 {36; CHECK-LABEL: @strtol_hex(37; CHECK-NEXT: ret i32 1838;39 %call = call i32 @strtol(ptr @.str, ptr null, i32 16) #240 ret i32 %call41}42 43; Fold a call to strtol with an endptr known to be nonnull (the result44; of pointer increment).45 46define i32 @strtol_endptr_not_null(ptr %pend) {47; CHECK-LABEL: @strtol_endptr_not_null(48; CHECK-NEXT: [[ENDP1:%.*]] = getelementptr inbounds nuw i8, ptr [[PEND:%.*]], i64 849; CHECK-NEXT: store ptr getelementptr inbounds nuw (i8, ptr @.str, i64 2), ptr [[ENDP1]], align 850; CHECK-NEXT: ret i32 1251;52 %endp1 = getelementptr inbounds ptr, ptr %pend, i32 153 %call = call i32 @strtol(ptr @.str, ptr %endp1, i32 10)54 ret i32 %call55}56 57; Don't fold a call to strtol with an endptr that's not known to be nonnull.58 59define i32 @strtol_endptr_maybe_null(ptr %end) {60; CHECK-LABEL: @strtol_endptr_maybe_null(61; CHECK-NEXT: [[CALL:%.*]] = call i32 @strtol(ptr nonnull @.str.1, ptr [[END:%.*]], i32 10)62; CHECK-NEXT: ret i32 [[CALL]]63;64 %call = call i32 @strtol(ptr @.str.1, ptr %end, i32 10)65 ret i32 %call66}67 68define i32 @atoi_test() #0 {69; CHECK-LABEL: @atoi_test(70; CHECK-NEXT: ret i32 1271;72 %call = call i32 @atoi(ptr @.str) #473 ret i32 %call74}75 76define i32 @strtol_not_const_str(ptr %s) #0 {77; CHECK-LABEL: @strtol_not_const_str(78; CHECK-NEXT: [[CALL:%.*]] = call i32 @strtol(ptr captures(none) [[S:%.*]], ptr null, i32 10)79; CHECK-NEXT: ret i32 [[CALL]]80;81 %call = call i32 @strtol(ptr %s, ptr null, i32 10) #382 ret i32 %call83}84 85define i32 @atoi_not_const_str(ptr %s) #0 {86; CHECK-LABEL: @atoi_not_const_str(87; CHECK-NEXT: [[CALL:%.*]] = call i32 @atoi(ptr [[S:%.*]])88; CHECK-NEXT: ret i32 [[CALL]]89;90 %call = call i32 @atoi(ptr %s) #491 ret i32 %call92}93 94define i32 @strtol_not_const_base(i32 %b) #0 {95; CHECK-LABEL: @strtol_not_const_base(96; CHECK-NEXT: [[CALL:%.*]] = call i32 @strtol(ptr nonnull captures(none) @.str, ptr null, i32 [[B:%.*]])97; CHECK-NEXT: ret i32 [[CALL]]98;99 %call = call i32 @strtol(ptr @.str, ptr null, i32 %b) #2100 ret i32 %call101}102 103define i32 @strtol_long_int() #0 {104; CHECK-LABEL: @strtol_long_int(105; CHECK-NEXT: [[CALL:%.*]] = call i32 @strtol(ptr nonnull captures(none) @.str.2, ptr null, i32 10)106; CHECK-NEXT: ret i32 [[CALL]]107;108 %call = call i32 @strtol(ptr @.str.2, ptr null, i32 10) #3109 ret i32 %call110}111 112 113define i32 @strtol_big_overflow() #0 {114; CHECK-LABEL: @strtol_big_overflow(115; CHECK-NEXT: [[CALL:%.*]] = call i32 @strtol(ptr nonnull captures(none) @.str.3, ptr null, i32 10)116; CHECK-NEXT: ret i32 [[CALL]]117;118 %call = call i32 @strtol(ptr nocapture @.str.3, ptr null, i32 10) #2119 ret i32 %call120}121 122define i32 @atol_test() #0 {123; CHECK-LABEL: @atol_test(124; CHECK-NEXT: ret i32 499496729125;126; CHECK-NEXT127 %call = call i32 @atol(ptr @.str.6) #4128 ret i32 %call129}130 131define i64 @atoll_test() #0 {132; CHECK-LABEL: @atoll_test(133; CHECK-NEXT: ret i64 4994967295134;135 %call = call i64 @atoll(ptr @.str.5) #3136 ret i64 %call137}138 139define i64 @strtoll_test() #0 {140; CHECK-LABEL: @strtoll_test(141; CHECK-NEXT: ret i64 4994967295142;143; CHECK-NEXT144 %call = call i64 @strtoll(ptr @.str.7, ptr null, i32 10) #5145 ret i64 %call146}147