[llvm] 267ddbb - [Test] [GVN] Add test showing equivalent PHIs generation by GVN

Dmitry Makogon via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 9 01:41:00 PST 2021


Author: Dmitry Makogon
Date: 2021-12-09T16:40:23+07:00
New Revision: 267ddbb581228c54cb224324900aebcab330cae7

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

LOG: [Test] [GVN] Add test showing equivalent PHIs generation by GVN

Added: 
    llvm/test/Transforms/GVN/duplicate-phis.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/GVN/duplicate-phis.ll b/llvm/test/Transforms/GVN/duplicate-phis.ll
new file mode 100644
index 0000000000000..1345a04347942
--- /dev/null
+++ b/llvm/test/Transforms/GVN/duplicate-phis.ll
@@ -0,0 +1,124 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -gvn -S %s | FileCheck %s
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+
+declare void @foo(i64 %v) readonly
+
+define void @non_local_load(i32* %ptr) {
+; CHECK-LABEL: @non_local_load(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i32 0, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[VAL:%.*]] = phi i32 [ [[VAL_INC:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[VAL_INC]] = add i32 [[VAL]], 1
+; CHECK-NEXT:    store i32 [[VAL_INC]], i32* [[PTR]], align 4
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp eq i32 [[IV]], 1000
+; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[LOOP]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i32 0, i32* %ptr
+  br label %loop
+
+loop:
+  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
+  %val = load i32, i32* %ptr
+  %val.inc = add i32 %val, 1
+  store i32 %val.inc, i32* %ptr
+  %iv.next = add i32 %iv, 1
+  %loop.cond = icmp eq i32 %iv, 1000
+  br i1 %loop.cond, label %exit, label %loop
+
+exit:
+  ret void
+}
+
+define void @non_local_load_with_iv_zext(i32* %ptr) {
+; CHECK-LABEL: @non_local_load_with_iv_zext(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    store i32 0, i32* [[PTR:%.*]], align 4
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[VAL:%.*]] = phi i32 [ [[VAL_INC:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[VAL_INC]] = add i32 [[VAL]], 1
+; CHECK-NEXT:    store i32 [[VAL_INC]], i32* [[PTR]], align 4
+; CHECK-NEXT:    [[IV_WIDE:%.*]] = zext i32 [[IV]] to i64
+; CHECK-NEXT:    call void @foo(i64 [[IV_WIDE]])
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp eq i32 [[IV]], 1000
+; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[LOOP]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  store i32 0, i32* %ptr
+  br label %loop
+
+loop:
+  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
+  %val = load i32, i32* %ptr
+  %val.inc = add i32 %val, 1
+  store i32 %val.inc, i32* %ptr
+  %iv.wide = zext i32 %iv to i64
+  call void @foo(i64 %iv.wide)
+  %iv.next = add i32 %iv, 1
+  %loop.cond = icmp eq i32 %iv, 1000
+  br i1 %loop.cond, label %exit, label %loop
+
+exit:
+  ret void
+}
+
+define void @two_non_local_loads(i32* %ptr1) {
+; CHECK-LABEL: @two_non_local_loads(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[PTR2:%.*]] = getelementptr inbounds i32, i32* [[PTR1:%.*]], i64 1
+; CHECK-NEXT:    store i32 0, i32* [[PTR1]], align 4
+; CHECK-NEXT:    store i32 0, i32* [[PTR2]], align 4
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[VAL2:%.*]] = phi i32 [ [[VAL2_INC:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[VAL1:%.*]] = phi i32 [ [[VAL1_INC:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[VAL1_INC]] = add i32 [[VAL1]], 1
+; CHECK-NEXT:    store i32 [[VAL1_INC]], i32* [[PTR1]], align 4
+; CHECK-NEXT:    [[VAL2_INC]] = add i32 [[VAL2]], 1
+; CHECK-NEXT:    store i32 [[VAL2_INC]], i32* [[PTR2]], align 4
+; CHECK-NEXT:    [[IV_WIDE:%.*]] = zext i32 [[IV]] to i64
+; CHECK-NEXT:    call void @foo(i64 [[IV_WIDE]])
+; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1
+; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp eq i32 [[IV]], 1000
+; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[LOOP]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %ptr2 = getelementptr inbounds i32, i32* %ptr1, i64 1
+  store i32 0, i32* %ptr1
+  store i32 0, i32* %ptr2
+  br label %loop
+
+loop:
+  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
+  %val1 = load i32, i32* %ptr1
+  %val1.inc = add i32 %val1, 1
+  store i32 %val1.inc, i32* %ptr1
+  %val2 = load i32, i32* %ptr2
+  %val2.inc = add i32 %val2, 1
+  store i32 %val2.inc, i32* %ptr2
+  %iv.wide = zext i32 %iv to i64
+  call void @foo(i64 %iv.wide)
+  %iv.next = add i32 %iv, 1
+  %loop.cond = icmp eq i32 %iv, 1000
+  br i1 %loop.cond, label %exit, label %loop
+
+exit:
+  ret void
+}
+


        


More information about the llvm-commits mailing list