-
Notifications
You must be signed in to change notification settings - Fork 12.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DSE: pre-commit tests for scalable vectors #110669
Conversation
@llvm/pr-subscribers-llvm-transforms Author: Ramkumar Ramachandra (artagnon) ChangesAs AliasAnalysis now has support for scalable sizes, add tests to DeadStoreElimination covering the scalable vectors case, in preparation to extend it. Full diff: https://github.com/llvm/llvm-project/pull/110669.diff 2 Files Affected:
diff --git a/llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll b/llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll
index fbab350008f4ee..c2f7adde7a22ee 100644
--- a/llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll
@@ -47,6 +47,29 @@ bb:
ret void
}
+define void @ScalableVectorTestFullyOverlapping(ptr %arg, i32 %i) {
+; CHECK-LABEL: @ScalableVectorTestFullyOverlapping(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[I7:%.*]] = add nuw nsw i32 [[I:%.*]], 1
+; CHECK-NEXT: [[I8:%.*]] = zext i32 [[I7]] to i64
+; CHECK-NEXT: [[I9:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[I8]]
+; CHECK-NEXT: store float 0.000000e+00, ptr [[I9]], align 4
+; CHECK-NEXT: [[I2:%.*]] = zext i32 [[I]] to i64
+; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[I2]]
+; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I3]], align 16
+; CHECK-NEXT: ret void
+;
+bb:
+ %i7 = add nuw nsw i32 %i, 1
+ %i8 = zext i32 %i7 to i64
+ %i9 = getelementptr inbounds float, ptr %arg, i64 %i8
+ store float 0.0, ptr %i9, align 4
+ %i2 = zext i32 %i to i64
+ %i3 = getelementptr inbounds float, ptr %arg, i64 %i2
+ store <vscale x 2 x float> zeroinitializer, ptr %i3, align 16
+ ret void
+}
+
define void @ArrayTestPartiallyOverlapping(i64 %0) {
;
; The DSE pass will not kill the store because the overlap is partial
@@ -55,9 +78,9 @@ define void @ArrayTestPartiallyOverlapping(i64 %0) {
; CHECK-LABEL: @ArrayTestPartiallyOverlapping(
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP0:%.*]], 10
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP2]]
-; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[TMP0]], 15
-; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP5]]
-; CHECK-NEXT: store i32 1, ptr [[TMP6]], align 4
+; CHECK-NEXT: [[TMP4:%.*]] = add i64 [[TMP0]], 15
+; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [0 x i8], ptr @BUFFER, i64 0, i64 [[TMP4]]
+; CHECK-NEXT: store i32 1, ptr [[TMP5]], align 4
; CHECK-NEXT: store i64 0, ptr [[TMP3]], align 4
; CHECK-NEXT: ret void
;
@@ -97,3 +120,30 @@ bb:
ret void
}
+define void @ScalableVectorTestPartiallyOverlapping(ptr %arg, i32 %i) {
+;
+; The DSE pass will not kill the store because the overlap is partial
+; and won't fully clobber the original store.
+;
+; CHECK-LABEL: @ScalableVectorTestPartiallyOverlapping(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[I2:%.*]] = zext i32 [[I:%.*]] to i64
+; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds float, ptr [[ARG:%.*]], i64 [[I2]]
+; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I3]], align 16
+; CHECK-NEXT: [[I5:%.*]] = add nuw nsw i32 [[I]], 1
+; CHECK-NEXT: [[I6:%.*]] = zext i32 [[I5]] to i64
+; CHECK-NEXT: [[I7:%.*]] = getelementptr inbounds float, ptr [[ARG]], i64 [[I6]]
+; CHECK-NEXT: store <vscale x 2 x float> zeroinitializer, ptr [[I7]], align 16
+; CHECK-NEXT: ret void
+;
+bb:
+ %i2 = zext i32 %i to i64
+ %i3 = getelementptr inbounds float, ptr %arg, i64 %i2
+ store <vscale x 2 x float> zeroinitializer, ptr %i3, align 16
+ %i5 = add nuw nsw i32 %i, 1
+ %i6 = zext i32 %i5 to i64
+ %i7 = getelementptr inbounds float, ptr %arg, i64 %i6
+ store <vscale x 2 x float> zeroinitializer, ptr %i7, align 16
+ ret void
+}
+
diff --git a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
index c9a0943de8cd98..ae203dfba7ddc1 100644
--- a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
@@ -655,3 +655,55 @@ exit:
call void @use(ptr %p) argmemonly
ret void
}
+
+define void @scalable_scalable_redundant_store(ptr %ptr) {
+; CHECK-LABEL: @scalable_scalable_redundant_store(
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 2
+; CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[GEP]], align 16
+; CHECK-NEXT: store <vscale x 4 x i64> zeroinitializer, ptr [[PTR]], align 32
+; CHECK-NEXT: ret void
+;
+ %gep = getelementptr i64, ptr %ptr, i64 2
+ store <vscale x 2 x i64> zeroinitializer, ptr %gep
+ store <vscale x 4 x i64> zeroinitializer, ptr %ptr
+ ret void
+}
+
+define void @scalable_fixed_redundant_store(ptr %ptr) {
+; CHECK-LABEL: @scalable_fixed_redundant_store(
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 2
+; CHECK-NEXT: store <2 x i64> zeroinitializer, ptr [[GEP]], align 16
+; CHECK-NEXT: store <vscale x 4 x i64> zeroinitializer, ptr [[PTR]], align 32
+; CHECK-NEXT: ret void
+;
+ %gep = getelementptr i64, ptr %ptr, i64 2
+ store <2 x i64> zeroinitializer, ptr %gep
+ store <vscale x 4 x i64> zeroinitializer, ptr %ptr
+ ret void
+}
+
+define void @fixed_scalable_redundant_store(ptr %ptr) {
+; CHECK-LABEL: @fixed_scalable_redundant_store(
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 2
+; CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[GEP]], align 16
+; CHECK-NEXT: store <128 x i64> zeroinitializer, ptr [[PTR]], align 1024
+; CHECK-NEXT: ret void
+;
+ %gep = getelementptr i64, ptr %ptr, i64 2
+ store <vscale x 2 x i64> zeroinitializer, ptr %gep
+ store <128 x i64> zeroinitializer, ptr %ptr
+ ret void
+}
+
+define void @scalable_scalable_neg(ptr %ptr) {
+; CHECK-LABEL: @scalable_scalable_neg(
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, ptr [[PTR:%.*]], i64 8
+; CHECK-NEXT: store <vscale x 4 x i64> zeroinitializer, ptr [[GEP]], align 32
+; CHECK-NEXT: store <vscale x 2 x i64> zeroinitializer, ptr [[PTR]], align 16
+; CHECK-NEXT: ret void
+;
+ %gep = getelementptr i64, ptr %ptr, i64 8
+ store <vscale x 4 x i64> zeroinitializer, ptr %gep
+ store <vscale x 2 x i64> zeroinitializer, ptr %ptr
+ ret void
+}
|
45de0d8
to
870743f
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
Left a few optional suggestions on improving the naming to make the tests a bit easier to read
llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
Outdated
Show resolved
Hide resolved
llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll
Outdated
Show resolved
Hide resolved
llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll
Outdated
Show resolved
Hide resolved
llvm/test/Transforms/DeadStoreElimination/offsetted-overlapping-stores.ll
Outdated
Show resolved
Hide resolved
As AliasAnalysis now has support for scalable sizes, add tests to DeadStoreElimination covering the scalable vectors case, in preparation to extend it.
870743f
to
2a7de12
Compare
As AliasAnalysis now has support for scalable sizes, add tests to DeadStoreElimination covering the scalable vectors case, in preparation to extend it.