[llvm] eff5c3e - [LSR] Precommit test for D132443

via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 19 19:07:02 PDT 2022


Author: eopXD
Date: 2022-09-19T19:06:52-07:00
New Revision: eff5c3e6c60274f62f3c7f69170ff1896425fcc3

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

LOG: [LSR] Precommit test for D132443

Pre-commit test for D132443

Reviewed By: craig.topper

Differential Revision: https://reviews.llvm.org/D132452

Added: 
    llvm/test/Transforms/LoopStrengthReduce/lsr-term-fold.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/LoopStrengthReduce/lsr-term-fold.ll b/llvm/test/Transforms/LoopStrengthReduce/lsr-term-fold.ll
new file mode 100644
index 0000000000000..aea8b6e8a68de
--- /dev/null
+++ b/llvm/test/Transforms/LoopStrengthReduce/lsr-term-fold.ll
@@ -0,0 +1,135 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes="loop-reduce" -S | FileCheck %s
+
+; There are 3 test cases here regarding the replacing the primary iv with
+; other affine AddRec IV.
+; 1. Loop with constant tripcount
+; 2. Loop with runtime tripcount
+; 3. The replacing AddRec IV is a complicated AddRec. This tests whether
+;    the fold terminating condition transformation is writing new terminating
+;    condition in the correct type.
+
+target datalayout = "e-p:32:32:32-n32"
+
+; This is equivalent to the following code, loop guard is removed.
+;   void const_tripcount(int *a) {
+;     for (int i = 21; i < 400; i++)
+;       a[i] = 1;
+;   }
+define void @const_tripcount(ptr %a) {
+; CHECK-LABEL: @const_tripcount(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[UGLYGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 84
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
+; CHECK:       for.body:
+; CHECK-NEXT:    [[LSR_IV1:%.*]] = phi ptr [ [[UGLYGEP2:%.*]], [[FOR_BODY]] ], [ [[UGLYGEP]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[LSR_IV:%.*]] = phi i64 [ [[LSR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ 379, [[ENTRY]] ]
+; CHECK-NEXT:    store i32 1, ptr [[LSR_IV1]], align 4
+; CHECK-NEXT:    [[LSR_IV_NEXT]] = add nsw i64 [[LSR_IV]], -1
+; CHECK-NEXT:    [[UGLYGEP2]] = getelementptr i8, ptr [[LSR_IV1]], i64 4
+; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[LSR_IV_NEXT]], 0
+; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY]]
+; CHECK:       for.end:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %uglygep = getelementptr i8, ptr %a, i64 84
+  br label %for.body
+
+for.body:                                         ; preds = %for.body, %entry
+  %lsr.iv1 = phi ptr [ %uglygep2, %for.body ], [ %uglygep, %entry ]
+  %lsr.iv = phi i64 [ %lsr.iv.next, %for.body ], [ 379, %entry ]
+  store i32 1, ptr %lsr.iv1, align 4
+  %lsr.iv.next = add nsw i64 %lsr.iv, -1
+  %uglygep2 = getelementptr i8, ptr %lsr.iv1, i64 4
+  %exitcond.not = icmp eq i64 %lsr.iv.next, 0
+  br i1 %exitcond.not, label %for.end, label %for.body
+
+for.end:                                          ; preds = %for.body
+  ret void
+}
+
+; This is equivalent to the following code, loop guard is removed.
+;   void runtime_tripcount(int *a, int N) {
+;     for (int i = 21; i < N; i++)
+;       a[i] = 1;
+;   }
+
+define void @runtime_tripcount(ptr %a, i32 %N) {
+; CHECK-LABEL: @runtime_tripcount(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[UGLYGEP:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 84
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
+; CHECK:       for.body:
+; CHECK-NEXT:    [[LSR_IV1:%.*]] = phi ptr [ [[UGLYGEP2:%.*]], [[FOR_BODY]] ], [ [[UGLYGEP]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[N:%.*]], [[ENTRY]] ]
+; CHECK-NEXT:    store i32 1, ptr [[LSR_IV1]], align 4
+; CHECK-NEXT:    [[LSR_IV_NEXT]] = add nsw i32 [[LSR_IV]], -1
+; CHECK-NEXT:    [[UGLYGEP2]] = getelementptr i8, ptr [[LSR_IV1]], i64 4
+; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[LSR_IV_NEXT]], 0
+; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY]]
+; CHECK:       for.end:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %uglygep = getelementptr i8, ptr %a, i32 84
+  br label %for.body
+
+for.body:                                         ; preds = %for.body, %entry
+  %lsr.iv1 = phi ptr [ %uglygep2, %for.body ], [ %uglygep, %entry ]
+  %lsr.iv = phi i32 [ %lsr.iv.next, %for.body ], [ %N, %entry ]
+  store i32 1, ptr %lsr.iv1, align 4
+  %lsr.iv.next = add nsw i32 %lsr.iv, -1
+  %uglygep2 = getelementptr i8, ptr %lsr.iv1, i64 4
+  %exitcond.not = icmp eq i32 %lsr.iv.next, 0
+  br i1 %exitcond.not, label %for.end, label %for.body
+
+for.end:                                          ; preds = %for.body
+  ret void
+}
+
+; This is modified from IR of the following code, loop guard is removed.
+;   void foo(int*);
+;   void ptr_of_ptr_addrec(int **ptrptr, int length) {
+;     int **it = ptrptr;
+;       for (int i = length; i; i--) {
+;           foo(*it);
+;           it++;
+;       }
+;   }
+define void @ptr_of_ptr_addrec(ptr %ptrptr, i32 %length) {
+; CHECK-LABEL: @ptr_of_ptr_addrec(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[START_PTRPTR:%.*]] = getelementptr inbounds ptr, ptr [[PTRPTR:%.*]]
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
+; CHECK:       for.body:
+; CHECK-NEXT:    [[I_05:%.*]] = phi i32 [ [[DEC:%.*]], [[FOR_BODY]] ], [ [[LENGTH:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[IT_04:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[START_PTRPTR]], [[ENTRY]] ]
+; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[IT_04]], align 8
+; CHECK-NEXT:    tail call void @foo(ptr [[TMP0]])
+; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds ptr, ptr [[IT_04]], i64 1
+; CHECK-NEXT:    [[DEC]] = add i32 [[I_05]], -1
+; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[DEC]], 0
+; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label [[FOR_END:%.*]], label [[FOR_BODY]]
+; CHECK:       for.end:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %start.ptrptr = getelementptr inbounds ptr, ptr %ptrptr
+  br label %for.body
+
+for.body:                                         ; preds = %entry, %for.body
+  %i.05 = phi i32 [ %dec, %for.body ], [ %length, %entry ]
+  %it.04 = phi ptr [ %incdec.ptr, %for.body ], [ %start.ptrptr, %entry ]
+  %0 = load ptr, ptr %it.04, align 8
+  tail call void @foo(ptr %0)
+  %incdec.ptr = getelementptr inbounds ptr, ptr %it.04, i64 1
+  %dec = add nsw i32 %i.05, -1
+  %tobool.not = icmp eq i32 %dec, 0
+  br i1 %tobool.not, label %for.end, label %for.body
+
+for.end:                                 ; preds = %for.body
+  ret void
+}
+
+declare void @foo(ptr)


        


More information about the llvm-commits mailing list