| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; Verify that strnlen calls that aren't folded into constants are annotated |
| ; with noundef, nonnull, and dereferenceable only when maxlen is known to |
| ; to be nonzero. |
| ; |
| ; RUN: opt < %s -passes=instcombine -S | FileCheck %s |
| |
| declare i64 @strnlen(ptr, i64) |
| |
| @ecp = external global ptr, align 8 |
| |
| |
| ; Annotate strnlen(ecp, 3) call with noundef, nonnull, and dereferenceable |
| ; based on the access to *ecp. |
| |
| define i64 @deref_strnlen_ecp_3() { |
| ; CHECK-LABEL: @deref_strnlen_ecp_3( |
| ; CHECK-NEXT: [[PTR:%.*]] = load ptr, ptr @ecp, align 8 |
| ; CHECK-NEXT: [[LEN:%.*]] = call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[PTR]], i64 3) |
| ; CHECK-NEXT: ret i64 [[LEN]] |
| ; |
| %ptr = load ptr, ptr @ecp |
| %len = call i64 @strnlen(ptr %ptr, i64 3) |
| ret i64 %len |
| } |
| |
| |
| ; Annotate strnlen(ecp, %n) call with nonzero %n with noundef, nonnull, and |
| ; dereferenceable based on the access to *ecp. |
| |
| define i64 @deref_strnlen_ecp_nz(i64 %n) { |
| ; CHECK-LABEL: @deref_strnlen_ecp_nz( |
| ; CHECK-NEXT: [[NONZERO:%.*]] = or i64 [[N:%.*]], 1 |
| ; CHECK-NEXT: [[PTR:%.*]] = load ptr, ptr @ecp, align 8 |
| ; CHECK-NEXT: [[LEN:%.*]] = call i64 @strnlen(ptr noundef nonnull dereferenceable(1) [[PTR]], i64 [[NONZERO]]) |
| ; CHECK-NEXT: ret i64 [[LEN]] |
| ; |
| %nonzero = or i64 %n, 1 |
| %ptr = load ptr, ptr @ecp |
| %len = call i64 @strnlen(ptr %ptr, i64 %nonzero) |
| ret i64 %len |
| } |
| |
| |
| |
| ; Do not annotate strnlen(ecp, %n) call with nonnull etc. because it need |
| ; not access *ecp. (Strictly, every pointer function argument must be |
| ; noundef, so this is overly conservative.) |
| |
| |
| define i64 @noderef_strnlen_ecp_n(i64 %n) { |
| ; CHECK-LABEL: @noderef_strnlen_ecp_n( |
| ; CHECK-NEXT: [[PTR:%.*]] = load ptr, ptr @ecp, align 8 |
| ; CHECK-NEXT: [[LEN:%.*]] = call i64 @strnlen(ptr [[PTR]], i64 [[N:%.*]]) |
| ; CHECK-NEXT: ret i64 [[LEN]] |
| ; |
| %ptr = load ptr, ptr @ecp |
| %len = call i64 @strnlen(ptr %ptr, i64 %n) |
| ret i64 %len |
| } |