[llvm] eef3033 - [DSE] Precommit test case for invalid elimination of store in loop.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 14 04:07:20 PDT 2020


Author: Florian Hahn
Date: 2020-09-14T12:06:58+01:00
New Revision: eef30334d1daaddf8b4e465be7c0f4aa4f98e208

URL: https://github.com/llvm/llvm-project/commit/eef30334d1daaddf8b4e465be7c0f4aa4f98e208
DIFF: https://github.com/llvm/llvm-project/commit/eef30334d1daaddf8b4e465be7c0f4aa4f98e208.diff

LOG: [DSE] Precommit test case for invalid elimination of store in loop.

Added: 
    

Modified: 
    llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll b/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll
index c898cf9bee8a..75f17d964b13 100644
--- a/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/MSSA/multiblock-loops.ll
@@ -9,7 +9,7 @@ define void @test13(i32* noalias %P) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[FOR:%.*]]
 ; CHECK:       for:
-; CHECK-NEXT:    store i32 0, i32* [[P:%.*]]
+; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
 ; CHECK-NEXT:    br i1 false, label [[FOR]], label [[END:%.*]]
 ; CHECK:       end:
 ; CHECK-NEXT:    ret void
@@ -29,7 +29,7 @@ define void @test14(i32* noalias %P) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    br label [[FOR:%.*]]
 ; CHECK:       for:
-; CHECK-NEXT:    store i32 0, i32* [[P:%.*]]
+; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
 ; CHECK-NEXT:    br i1 false, label [[FOR]], label [[END:%.*]]
 ; CHECK:       end:
 ; CHECK-NEXT:    ret void
@@ -48,12 +48,12 @@ define void @test18(i32* noalias %P) {
 ; CHECK-LABEL: @test18(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[P2:%.*]] = bitcast i32* [[P:%.*]] to i8*
-; CHECK-NEXT:    store i32 0, i32* [[P]]
+; CHECK-NEXT:    store i32 0, i32* [[P]], align 4
 ; CHECK-NEXT:    br label [[FOR:%.*]]
 ; CHECK:       for:
-; CHECK-NEXT:    store i8 1, i8* [[P2]]
-; CHECK-NEXT:    [[X:%.*]] = load i32, i32* [[P]]
-; CHECK-NEXT:    store i8 2, i8* [[P2]]
+; CHECK-NEXT:    store i8 1, i8* [[P2]], align 1
+; CHECK-NEXT:    [[X:%.*]] = load i32, i32* [[P]], align 4
+; CHECK-NEXT:    store i8 2, i8* [[P2]], align 1
 ; CHECK-NEXT:    br i1 false, label [[FOR]], label [[END:%.*]]
 ; CHECK:       end:
 ; CHECK-NEXT:    ret void
@@ -183,7 +183,7 @@ define void @loop_multiple_def_uses(i32* noalias %P) {
 ; CHECK-NEXT:    br i1 [[C1]], label [[FOR_BODY:%.*]], label [[END:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    store i32 1, i32* [[P]], align 4
-; CHECK-NEXT:    [[LV:%.*]] = load i32, i32* [[P]]
+; CHECK-NEXT:    [[LV:%.*]] = load i32, i32* [[P]], align 4
 ; CHECK-NEXT:    br label [[FOR_HEADER]]
 ; CHECK:       end:
 ; CHECK-NEXT:    store i32 3, i32* [[P]], align 4
@@ -220,7 +220,7 @@ define void @loop_multiple_def_uses_partial_write(i32* noalias %p) {
 ; CHECK:       for.body:
 ; CHECK-NEXT:    [[C:%.*]] = bitcast i32* [[P]] to i8*
 ; CHECK-NEXT:    store i8 1, i8* [[C]], align 4
-; CHECK-NEXT:    [[LV:%.*]] = load i32, i32* [[P]]
+; CHECK-NEXT:    [[LV:%.*]] = load i32, i32* [[P]], align 4
 ; CHECK-NEXT:    br label [[FOR_HEADER]]
 ; CHECK:       end:
 ; CHECK-NEXT:    store i32 3, i32* [[P]], align 4
@@ -257,7 +257,7 @@ define void @loop_multiple_def_uses_mayalias_write(i32* %p, i32* %q) {
 ; CHECK-NEXT:    br i1 [[C1]], label [[FOR_BODY:%.*]], label [[END:%.*]]
 ; CHECK:       for.body:
 ; CHECK-NEXT:    store i32 1, i32* [[Q:%.*]], align 4
-; CHECK-NEXT:    [[LV:%.*]] = load i32, i32* [[P]]
+; CHECK-NEXT:    [[LV:%.*]] = load i32, i32* [[P]], align 4
 ; CHECK-NEXT:    br label [[FOR_HEADER]]
 ; CHECK:       end:
 ; CHECK-NEXT:    store i32 3, i32* [[P]], align 4
@@ -314,3 +314,43 @@ bb1:                                              ; preds = %bb1, %bb
 }
 
 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg)
+
+ at x = global [10 x i16] zeroinitializer, align 1
+
+; Make sure we do not eliminate the store in %do.body, because it writes to
+; multiple locations in the loop and the store in %if.end10 only stores to
+; the last one.
+define i16 @test_loop_carried_dep() {
+; CHECK-LABEL: @test_loop_carried_dep(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[DO_BODY:%.*]]
+; CHECK:       do.body:
+; CHECK-NEXT:    [[I_0:%.*]] = phi i16 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]
+; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds [10 x i16], [10 x i16]* @x, i16 0, i16 [[I_0]]
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i16 [[I_0]], 4
+; CHECK-NEXT:    br i1 [[EXITCOND]], label [[IF_END10:%.*]], label [[IF_END]]
+; CHECK:       if.end:
+; CHECK-NEXT:    [[INC]] = add nuw nsw i16 [[I_0]], 1
+; CHECK-NEXT:    br label [[DO_BODY]]
+; CHECK:       if.end10:
+; CHECK-NEXT:    store i16 1, i16* [[ARRAYIDX2]], align 1
+; CHECK-NEXT:    ret i16 0
+;
+entry:
+  br label %do.body
+
+do.body:                                          ; preds = %if.end, %entry
+  %i.0 = phi i16 [ 0, %entry ], [ %inc, %if.end ]
+  %arrayidx2 = getelementptr inbounds [10 x i16], [10 x i16]* @x, i16 0, i16 %i.0
+  store i16 2, i16* %arrayidx2, align 1
+  %exitcond = icmp eq i16 %i.0, 4
+  br i1 %exitcond, label %if.end10, label %if.end
+
+if.end:                                           ; preds = %do.body
+  %inc = add nuw nsw i16 %i.0, 1
+  br label %do.body
+
+if.end10:                                         ; preds = %do.body
+  store i16 1, i16* %arrayidx2, align 1
+  ret i16 0
+}


        


More information about the llvm-commits mailing list