diff options
Diffstat (limited to 'llvm/test/Transforms/SROA/preserve-nonnull.ll')
| -rw-r--r-- | llvm/test/Transforms/SROA/preserve-nonnull.ll | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SROA/preserve-nonnull.ll b/llvm/test/Transforms/SROA/preserve-nonnull.ll index a29da6dc2c3..5d0e22c728b 100644 --- a/llvm/test/Transforms/SROA/preserve-nonnull.ll +++ b/llvm/test/Transforms/SROA/preserve-nonnull.ll @@ -3,6 +3,8 @@ ; Make sure that SROA doesn't lose nonnull metadata ; on loads from allocas that get optimized out. +%pair = type { i64, [0 x i64], [1 x i64] } + declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) ; Check that we do basic propagation of nonnull when rewriting. @@ -42,6 +44,23 @@ entry: ret float* %ret } +; Make sure we propagate the !range attribute when we expand loads. +define i64 @propagate_range(%pair* dereferenceable(16)) { +; CHECK-LABEL: define i64 @propagate_range( +; CHECK-NEXT: start: +; CHECK-NEXT: %[[SROA_IDX:.*]] = getelementptr inbounds %pair +; CHECK-NEXT: %[[RESULT:.*]] = load i64, i64* %[[SROA_IDX]], align 8, !range !1 +; CHECK: ret i64 %[[RESULT]] +start: + %a = alloca %pair + %1 = bitcast %pair* %0 to i8* + %2 = bitcast %pair* %a to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %2, i8* %1, i64 16, i32 8, i1 false) + %3 = getelementptr inbounds %pair, %pair* %a, i32 0, i32 0 + %4 = load i64, i64* %3, !range !1 + ret i64 %4 +} + ; Make sure we properly handle the !nonnull attribute when we convert ; a pointer load to an integer load. ; FIXME: While this doesn't do anythnig actively harmful today, it really @@ -90,3 +109,4 @@ entry: } !0 = !{} +!1 = !{i64 0, i64 2} |

