1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=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 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 12 22; 23 %call = call i32 @strtol(ptr @.str, ptr null, i32 10) #2 24 ret i32 %call 25} 26 27define i32 @strtol_base_zero() #0 { 28; CHECK-LABEL: @strtol_base_zero( 29; CHECK-NEXT: ret i32 12 30; 31 %call = call i32 @strtol(ptr @.str, ptr null, i32 0) #2 32 ret i32 %call 33} 34 35define i32 @strtol_hex() #0 { 36; CHECK-LABEL: @strtol_hex( 37; CHECK-NEXT: ret i32 18 38; 39 %call = call i32 @strtol(ptr @.str, ptr null, i32 16) #2 40 ret i32 %call 41} 42 43; Fold a call to strtol with an endptr known to be nonnull (the result 44; 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 8 49; CHECK-NEXT: store ptr getelementptr inbounds nuw (i8, ptr @.str, i64 2), ptr [[ENDP1]], align 8 50; CHECK-NEXT: ret i32 12 51; 52 %endp1 = getelementptr inbounds ptr, ptr %pend, i32 1 53 %call = call i32 @strtol(ptr @.str, ptr %endp1, i32 10) 54 ret i32 %call 55} 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 %call 66} 67 68define i32 @atoi_test() #0 { 69; CHECK-LABEL: @atoi_test( 70; CHECK-NEXT: ret i32 12 71; 72 %call = call i32 @atoi(ptr @.str) #4 73 ret i32 %call 74} 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) #3 82 ret i32 %call 83} 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) #4 91 ret i32 %call 92} 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) #2 100 ret i32 %call 101} 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) #3 109 ret i32 %call 110} 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) #2 119 ret i32 %call 120} 121 122define i32 @atol_test() #0 { 123; CHECK-LABEL: @atol_test( 124; CHECK-NEXT: ret i32 499496729 125; 126; CHECK-NEXT 127 %call = call i32 @atol(ptr @.str.6) #4 128 ret i32 %call 129} 130 131define i64 @atoll_test() #0 { 132; CHECK-LABEL: @atoll_test( 133; CHECK-NEXT: ret i64 4994967295 134; 135 %call = call i64 @atoll(ptr @.str.5) #3 136 ret i64 %call 137} 138 139define i64 @strtoll_test() #0 { 140; CHECK-LABEL: @strtoll_test( 141; CHECK-NEXT: ret i64 4994967295 142; 143; CHECK-NEXT 144 %call = call i64 @strtoll(ptr @.str.7, ptr null, i32 10) #5 145 ret i64 %call 146} 147