[llvm] [DeadStoreElimination] Introduce test for #63473 (NFC) (PR #98737)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 13 03:28:52 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Antonio Frighetto (antoniofrighetto)
<details>
<summary>Changes</summary>
Preliminary tests addition.
---
Full diff: https://github.com/llvm/llvm-project/pull/98737.diff
1 Files Affected:
- (added) llvm/test/Transforms/DeadStoreElimination/dependencies-cross-iterations.ll (+126)
``````````diff
diff --git a/llvm/test/Transforms/DeadStoreElimination/dependencies-cross-iterations.ll b/llvm/test/Transforms/DeadStoreElimination/dependencies-cross-iterations.ll
new file mode 100644
index 0000000000000..d446ebc6d2bd4
--- /dev/null
+++ b/llvm/test/Transforms/DeadStoreElimination/dependencies-cross-iterations.ll
@@ -0,0 +1,126 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=dse -S %s | FileCheck %s
+
+; No final read after clobbering.
+define void @test1(i64 %arg) #0 {
+; CHECK-LABEL: @test1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[ARRAY:%.*]] = alloca [20 x i64], align 16
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[PTR_1:%.*]] = getelementptr inbounds [20 x i64], ptr [[ARRAY]], i64 0, i64 [[IV]]
+; CHECK-NEXT: store i64 0, ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[VAL]], [[ARG:%.*]]
+; CHECK-NEXT: store i64 [[ADD]], ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
+; CHECK-NEXT: [[COND:%.*]] = icmp ult i64 [[IV]], 4
+; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: ret void
+;
+entry:
+ %array = alloca [20 x i64], align 16
+ br label %loop
+
+loop: ; preds = %loop, %entry
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %ptr.1 = getelementptr inbounds [20 x i64], ptr %array, i64 0, i64 %iv
+ store i64 0, ptr %ptr.1, align 8
+ %val = load i64, ptr %ptr.1, align 8
+ %add = add nsw i64 %val, %arg
+ store i64 %add, ptr %ptr.1, align 8
+ %iv.next = add nuw nsw i64 %iv, 1
+ %cond = icmp ult i64 %iv, 4
+ br i1 %cond, label %loop, label %exit
+
+exit: ; preds = %loop
+ ret void
+}
+
+; Unused final read of %ptr.1 after clobbering it.
+define void @test2(i64 %arg) #0 {
+; CHECK-LABEL: @test2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[ARRAY:%.*]] = alloca [20 x i64], align 16
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[PTR_1:%.*]] = getelementptr inbounds [20 x i64], ptr [[ARRAY]], i64 0, i64 [[IV]]
+; CHECK-NEXT: store i64 0, ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[VAL]], [[ARG:%.*]]
+; CHECK-NEXT: store i64 [[ADD]], ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
+; CHECK-NEXT: [[COND:%.*]] = icmp ult i64 [[IV]], 4
+; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[PTR_FIRST_ELEM:%.*]] = getelementptr inbounds [20 x i64], ptr [[ARRAY]], i64 0, i64 0
+; CHECK-NEXT: [[UNUSED_RV:%.*]] = load i64, ptr [[PTR_FIRST_ELEM]], align 8
+; CHECK-NEXT: ret void
+;
+entry:
+ %array = alloca [20 x i64], align 16
+ br label %loop
+
+loop: ; preds = %loop, %entry
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %ptr.1 = getelementptr inbounds [20 x i64], ptr %array, i64 0, i64 %iv
+ store i64 0, ptr %ptr.1, align 8
+ %val = load i64, ptr %ptr.1, align 8
+ %add = add nsw i64 %val, %arg
+ store i64 %add, ptr %ptr.1, align 8
+ %iv.next = add nuw nsw i64 %iv, 1
+ %cond = icmp ult i64 %iv, 4
+ br i1 %cond, label %loop, label %exit
+
+exit: ; preds = %loop
+ %ptr.first.elem = getelementptr inbounds [20 x i64], ptr %array, i64 0, i64 0
+ %unused_rv = load i64, ptr %ptr.first.elem, align 8
+ ret void
+}
+
+; Used final read after clobbering %ptr.1.
+define i64 @test3(i64 %arg) #0 {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[ARRAY:%.*]] = alloca [20 x i64], align 16
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[PTR_1:%.*]] = getelementptr inbounds [20 x i64], ptr [[ARRAY]], i64 0, i64 [[IV]]
+; CHECK-NEXT: store i64 0, ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[VAL]], [[ARG:%.*]]
+; CHECK-NEXT: store i64 [[ADD]], ptr [[PTR_1]], align 8
+; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
+; CHECK-NEXT: [[COND:%.*]] = icmp ult i64 [[IV]], 4
+; CHECK-NEXT: br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[PTR_FIRST_ELEM:%.*]] = getelementptr inbounds [20 x i64], ptr [[ARRAY]], i64 0, i64 0
+; CHECK-NEXT: [[RV:%.*]] = load i64, ptr [[PTR_FIRST_ELEM]], align 8
+; CHECK-NEXT: ret i64 [[RV]]
+;
+entry:
+ %array = alloca [20 x i64], align 16
+ br label %loop
+
+loop: ; preds = %loop, %entry
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %ptr.1 = getelementptr inbounds [20 x i64], ptr %array, i64 0, i64 %iv
+ store i64 0, ptr %ptr.1, align 8
+ %val = load i64, ptr %ptr.1, align 8
+ %add = add nsw i64 %val, %arg
+ store i64 %add, ptr %ptr.1, align 8
+ %iv.next = add nuw nsw i64 %iv, 1
+ %cond = icmp ult i64 %iv, 4
+ br i1 %cond, label %loop, label %exit
+
+exit: ; preds = %loop
+ %ptr.first.elem = getelementptr inbounds [20 x i64], ptr %array, i64 0, i64 0
+ %rv = load i64, ptr %ptr.first.elem, align 8
+ ret i64 %rv
+}
+
+attributes #0 = { mustprogress }
``````````
</details>
https://github.com/llvm/llvm-project/pull/98737
More information about the llvm-commits
mailing list