[PATCH] D64795: [PowerPC] exclude more icmps in LSR which is converted in later hardware loop pass

ChenZheng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 16 06:14:44 PDT 2019


shchenz created this revision.
shchenz added reviewers: hfinkel, jsji, nemanjai.
Herald added subscribers: llvm-commits, wuzish, MaskRay, hiraditya.
Herald added a project: LLVM.

In https://reviews.llvm.org/D63477, we add a target hook `canSaveCmp` to let LSR get hardware loop converting result, so LSR can choose more accurate formulae set.

Here we use the target hook for more icmp instead of equality cmp as hardware loop pass can convert many icmps including equality cmp.


https://reviews.llvm.org/D64795

Files:
  llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
  llvm/test/CodeGen/PowerPC/ctrloop-le.ll
  llvm/test/CodeGen/PowerPC/ctrloop-lt.ll


Index: llvm/test/CodeGen/PowerPC/ctrloop-lt.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/ctrloop-lt.ll
+++ llvm/test/CodeGen/PowerPC/ctrloop-lt.ll
@@ -2,9 +2,6 @@
 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
 target triple = "powerpc64-unknown-linux-gnu"
 
-; XFAIL: *
-; SE needs improvement
-
 ; CHECK: test_pos1_ir_slt
 ; CHECK: bdnz
 ; a < b
@@ -35,7 +32,6 @@
 
 
 ; CHECK: test_pos2_ir_slt
-; FIXME: Support this loop!
 ; CHECK: bdnz
 ; a < b
 define void @test_pos2_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
@@ -65,7 +61,6 @@
 
 
 ; CHECK: test_pos4_ir_slt
-; FIXME: Support this loop!
 ; CHECK: bdnz
 ; a < b
 define void @test_pos4_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
Index: llvm/test/CodeGen/PowerPC/ctrloop-le.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/ctrloop-le.ll
+++ llvm/test/CodeGen/PowerPC/ctrloop-le.ll
@@ -2,9 +2,6 @@
 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
 target triple = "powerpc64-unknown-linux-gnu"
 
-; XFAIL: *
-; SE needs improvement
-
 ; CHECK: test_pos1_ir_sle
 ; CHECK: bdnz
 ; a < b
Index: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -3265,12 +3265,12 @@
     // requirements for both N and i at the same time. Limiting this code to
     // equality icmps is not a problem because all interesting loops use
     // equality icmps, thanks to IndVarSimplify.
-    if (ICmpInst *CI = dyn_cast<ICmpInst>(UserInst))
+    if (ICmpInst *CI = dyn_cast<ICmpInst>(UserInst)) {
+      // If CI can be saved in some target, like replaced inside hardware loop
+      // in PowerPC, no need to generate initial formulae for it.
+      if (SaveCmp && CI == dyn_cast<ICmpInst>(ExitBranch->getCondition()))
+        continue;
       if (CI->isEquality()) {
-        // If CI can be saved in some target, like replaced inside hardware loop
-        // in PowerPC, no need to generate initial formulae for it.
-        if (SaveCmp && CI == dyn_cast<ICmpInst>(ExitBranch->getCondition()))
-          continue;
         // Swap the operands if needed to put the OperandValToReplace on the
         // left, for consistency.
         Value *NV = CI->getOperand(1);
@@ -3298,6 +3298,7 @@
             Factors.insert(-(uint64_t)Factors[i]);
         Factors.insert(-1);
       }
+    }
 
     // Get or create an LSRUse.
     std::pair<size_t, int64_t> P = getUse(S, Kind, AccessTy);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D64795.210078.patch
Type: text/x-patch
Size: 2772 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190716/a65ca8f6/attachment.bin>


More information about the llvm-commits mailing list