This patch adds another run of DropUnnecessaryAssumes after vectorization, to clean up assumes that are not longer needed after this point. The main example of such an assume is currently dereferenceable assumptions. This complements https://github.com/llvm/llvm-project/pull/166945, which avoids sinking code if it would mean remove a dereferenceable assumption. There are a few additional cases where some unneeded assumes are left over after vectorization that also get cleaned up. The main motivation is to work together with https://github.com/llvm/llvm-project/pull/166945, but there may be a better solution. Adding another instance of this pass to the pipeline is not great, but compile-time impact seems in the noise: https://llvm-compile-time-tracker.com/compare.php?from=55e71fe08b6406ec7ce2c81ce042e48717acf204&to=85da4ee3a74126f557cdc74c7b40e048dacb3fc4&stat=instructions:u PR: https://github.com/llvm/llvm-project/pull/166947
55 lines
2.4 KiB
LLVM
55 lines
2.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt -passes='drop-unnecessary-assumes' -S %s | FileCheck %s
|
|
; RUN: opt -passes='drop-unnecessary-assumes<drop-deref>' -S %s | FileCheck --check-prefix=DROP-DEREF %s
|
|
|
|
declare void @use(ptr)
|
|
|
|
define i8 @test_dereferenceable_assume_ptr_not_used(ptr %p, i64 %size) {
|
|
; CHECK-LABEL: define i8 @test_dereferenceable_assume_ptr_not_used(
|
|
; CHECK-SAME: ptr [[P:%.*]], i64 [[SIZE:%.*]]) {
|
|
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[SIZE]]) ]
|
|
; CHECK-NEXT: ret i8 0
|
|
;
|
|
; DROP-DEREF-LABEL: define i8 @test_dereferenceable_assume_ptr_not_used(
|
|
; DROP-DEREF-SAME: ptr [[P:%.*]], i64 [[SIZE:%.*]]) {
|
|
; DROP-DEREF-NEXT: ret i8 0
|
|
;
|
|
call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %size) ]
|
|
ret i8 0
|
|
}
|
|
|
|
define i8 @test_dereferenceable_assume_ptr_used_variable_size(ptr %p, i64 %size) {
|
|
; CHECK-LABEL: define i8 @test_dereferenceable_assume_ptr_used_variable_size(
|
|
; CHECK-SAME: ptr [[P:%.*]], i64 [[SIZE:%.*]]) {
|
|
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[SIZE]]) ]
|
|
; CHECK-NEXT: [[VAL:%.*]] = load i8, ptr [[P]], align 1
|
|
; CHECK-NEXT: ret i8 [[VAL]]
|
|
;
|
|
; DROP-DEREF-LABEL: define i8 @test_dereferenceable_assume_ptr_used_variable_size(
|
|
; DROP-DEREF-SAME: ptr [[P:%.*]], i64 [[SIZE:%.*]]) {
|
|
; DROP-DEREF-NEXT: [[VAL:%.*]] = load i8, ptr [[P]], align 1
|
|
; DROP-DEREF-NEXT: ret i8 [[VAL]]
|
|
;
|
|
call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %size) ]
|
|
%val = load i8, ptr %p
|
|
ret i8 %val
|
|
}
|
|
|
|
define i8 @test_dereferenceable_with_align_ptr_used(ptr %p, i64 %size) {
|
|
; CHECK-LABEL: define i8 @test_dereferenceable_with_align_ptr_used(
|
|
; CHECK-SAME: ptr [[P:%.*]], i64 [[SIZE:%.*]]) {
|
|
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 [[SIZE]]), "align"(ptr [[P]], i64 8) ]
|
|
; CHECK-NEXT: [[VAL:%.*]] = load i8, ptr [[P]], align 1
|
|
; CHECK-NEXT: ret i8 [[VAL]]
|
|
;
|
|
; DROP-DEREF-LABEL: define i8 @test_dereferenceable_with_align_ptr_used(
|
|
; DROP-DEREF-SAME: ptr [[P:%.*]], i64 [[SIZE:%.*]]) {
|
|
; DROP-DEREF-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 8) ]
|
|
; DROP-DEREF-NEXT: [[VAL:%.*]] = load i8, ptr [[P]], align 1
|
|
; DROP-DEREF-NEXT: ret i8 [[VAL]]
|
|
;
|
|
call void @llvm.assume(i1 true) [ "dereferenceable"(ptr %p, i64 %size), "align"(ptr %p, i64 8) ]
|
|
%val = load i8, ptr %p
|
|
ret i8 %val
|
|
}
|