[llvm-branch-commits] [llvm] 96296d9 - [DAGCombiner] Precommit test case for D95086

2021-01-20 Thread Guozhi Wei via llvm-branch-commits

Author: Guozhi Wei
Date: 2021-01-20T17:15:47-08:00
New Revision: 96296d9220ee5193f6ad7ff181d42c10d9f3c7e3

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

LOG: [DAGCombiner] Precommit test case for D95086

This is the test case for D95086 with worse result.

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

Added: 
llvm/test/CodeGen/X86/select-ext.ll

Modified: 


Removed: 




diff  --git a/llvm/test/CodeGen/X86/select-ext.ll 
b/llvm/test/CodeGen/X86/select-ext.ll
new file mode 100644
index ..848d6fa5f0c7
--- /dev/null
+++ b/llvm/test/CodeGen/X86/select-ext.ll
@@ -0,0 +1,21 @@
+; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s
+
+; TODO: (zext(select c, load1, load2)) -> (select c, zextload1, zextload2)
+
+; CHECK-LABEL: foo
+; CHECK:movzbl  (%rdi), %eax
+; CHECK-NEXT:   movzbl  1(%rdi), %ecx
+; CHECK-NEXT:   testl   %esi, %esi
+; CHECK-NEXT:   cmovel  %eax, %ecx
+; CHECK-NEXT:   movzbl  %cl, %eax
+; CHECK-NEXT:   retq
+
+define i64 @foo(i8* %p, i1 zeroext %c) {
+  %ld1 = load volatile i8, i8* %p
+  %arrayidx1 = getelementptr inbounds i8, i8* %p, i64 1
+  %ld2 = load volatile i8, i8* %arrayidx1
+  %cond.v = select i1 %c, i8 %ld2, i8 %ld1
+  %cond = zext i8 %cond.v to i64
+  ret i64 %cond
+}
+



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] d50d7c3 - [MBP] Prevent rotating a chain contains entry block

2020-12-14 Thread Guozhi Wei via llvm-branch-commits

Author: Guozhi Wei
Date: 2020-12-14T12:48:55-08:00
New Revision: d50d7c37a159802c89454a6c53c0ec2e7949d84a

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

LOG: [MBP] Prevent rotating a chain contains entry block

The entry block should always be the first BB in a function.
So we should not rotate a chain contains the entry block.

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

Added: 


Modified: 
llvm/lib/CodeGen/MachineBlockPlacement.cpp

Removed: 




diff  --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp 
b/llvm/lib/CodeGen/MachineBlockPlacement.cpp
index bd4640822a63..42586cbe06e0 100644
--- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp
+++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp
@@ -2306,6 +2306,10 @@ void MachineBlockPlacement::rotateLoop(BlockChain 
&LoopChain,
   if (Bottom == ExitingBB)
 return;
 
+  // The entry block should always be the first BB in a function.
+  if (Top->isEntryBlock())
+return;
+
   bool ViableTopFallthrough = hasViableTopFallthrough(Top, LoopBlockSet);
 
   // If the header has viable fallthrough, check whether the current loop
@@ -2380,6 +2384,11 @@ void MachineBlockPlacement::rotateLoopWithProfile(
 BlockChain &LoopChain, const MachineLoop &L,
 const BlockFilterSet &LoopBlockSet) {
   auto RotationPos = LoopChain.end();
+  MachineBasicBlock *ChainHeaderBB = *LoopChain.begin();
+
+  // The entry block should always be the first BB in a function.
+  if (ChainHeaderBB->isEntryBlock())
+return;
 
   BlockFrequency SmallestRotationCost = BlockFrequency::getMaxFrequency();
 
@@ -2398,7 +2407,6 @@ void MachineBlockPlacement::rotateLoopWithProfile(
   // chain head is not the loop header. As we only consider natural loops with
   // single header, this computation can be done only once.
   BlockFrequency HeaderFallThroughCost(0);
-  MachineBasicBlock *ChainHeaderBB = *LoopChain.begin();
   for (auto *Pred : ChainHeaderBB->predecessors()) {
 BlockChain *PredChain = BlockToChain[Pred];
 if (!LoopBlockSet.count(Pred) &&



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [llvm] 687e80b - [MBP] Add whole chain to BlockFilterSet instead of individual BB

2020-12-16 Thread Guozhi Wei via llvm-branch-commits

Author: Guozhi Wei
Date: 2020-12-16T15:45:47-08:00
New Revision: 687e80be7fcf75900c354152d8b21500c3b08850

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

LOG: [MBP] Add whole chain to BlockFilterSet instead of individual BB

Currently we add individual BB to BlockFilterSet if its frequency satisfies

  LoopFreq / Freq <= LoopToColdBlockRatio

LoopFreq is edge frequency from outside to loop header.
LoopToColdBlockRatio is a command line parameter.

It doesn't make sense since we always layout whole chain, not individual BBs.

It may also cause a tricky problem. Sometimes it is possible that the LoopFreq
of an inner loop is smaller than LoopFreq of outer loop. So a BB can be in
BlockFilterSet of inner loop, but not in BlockFilterSet of outer loop,
like .cold in the test case. So it is added to the chain of inner loop. When
work on the outer loop, .cold is not added to BlockFilterSet, so the edge to
successor .problem is not counted in UnscheduledPredecessors of .problem chain.
But other blocks in the inner loop are added BlockFilterSet, so the whole inner
loop chain can be layout, and markChainSuccessors is called to decrease
UnscheduledPredecessors of following chains. markChainSuccessors calls
markBlockSuccessors for every BB, even it is not in BlockFilterSet, like .cold,
so .problem chain's UnscheduledPredecessors is decreased, but this edge was not
counted on in fillWorkLists, so .problem chain's UnscheduledPredecessors
becomes 0 when it still has an unscheduled predecessor .pred! And it causes
problems in following various successor BB selection algorithms.

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

Added: 
llvm/test/CodeGen/X86/block_set.ll

Modified: 
llvm/lib/CodeGen/MachineBlockPlacement.cpp

Removed: 




diff  --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp 
b/llvm/lib/CodeGen/MachineBlockPlacement.cpp
index 42586cbe06e0..8850dab30fa5 100644
--- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp
+++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp
@@ -2543,10 +2543,14 @@ MachineBlockPlacement::collectLoopBlockSet(const 
MachineLoop &L) {
 MBPI->getEdgeProbability(LoopPred, L.getHeader());
 
 for (MachineBasicBlock *LoopBB : L.getBlocks()) {
+  if (LoopBlockSet.count(LoopBB))
+continue;
   auto Freq = MBFI->getBlockFreq(LoopBB).getFrequency();
   if (Freq == 0 || LoopFreq.getFrequency() / Freq > LoopToColdBlockRatio)
 continue;
-  LoopBlockSet.insert(LoopBB);
+  BlockChain *Chain = BlockToChain[LoopBB];
+  for (MachineBasicBlock *ChainBB : *Chain)
+LoopBlockSet.insert(ChainBB);
 }
   } else
 LoopBlockSet.insert(L.block_begin(), L.block_end());

diff  --git a/llvm/test/CodeGen/X86/block_set.ll 
b/llvm/test/CodeGen/X86/block_set.ll
new file mode 100644
index ..bfe391d5b464
--- /dev/null
+++ b/llvm/test/CodeGen/X86/block_set.ll
@@ -0,0 +1,64 @@
+; RUN: llc -mtriple=i686-linux < %s | FileCheck %s
+
+define i1 @block_filter() !prof !22{
+; CHECK-LABEL: block_filter
+; CHECK: %.entry
+; CHECK: %.header1
+; CHECK: %.bb1
+; CHECK: %.header2
+; CHECK: %.latch2
+; CHECK: %.cold
+; CHECK: %.pred
+; CHECK: %.problem
+; CHECK: %.latch1
+; CHECK: %.exit
+.entry:
+  %val0 = call i1 @bar()
+  br label %.header1
+
+.header1:
+  %val1 = call i1 @foo()
+  br i1 %val1, label %.bb1, label %.pred, !prof !2
+
+.bb1:
+  %val11 = call i1 @foo()
+  br i1 %val11, label %.header2, label %.pred, !prof !2
+
+.header2:
+  %val2 = call i1 @foo()
+  br i1 %val2, label %.latch2, label %.cold, !prof !10
+
+.cold:
+  %val4 = call i1 @bar()
+  br i1 %val4, label %.latch2, label %.problem
+
+.latch2:
+  %val5 = call i1 @foo()
+  br i1 %val5, label %.header2, label %.latch1, !prof !1
+
+.pred:
+  %valp = call i1 @foo()
+  br label %.problem
+
+.problem:
+  %val3 = call i1 @foo()
+  br label %.latch1
+
+.latch1:
+  %val6 = call i1 @foo()
+  br i1 %val6, label %.header1, label %.exit, !prof !1
+
+.exit:
+  %val7 = call i1 @foo()
+  ret i1 %val7
+}
+
+declare i1 @foo()
+declare i1 @bar()
+
+!1 = !{!"branch_weights", i32 5, i32 5}
+!2 = !{!"branch_weights", i32 60, i32 40}
+!3 = !{!"branch_weights", i32 90, i32 10}
+!10 = !{!"branch_weights", i32 90, i32 10}
+
+!22 = !{!"function_entry_count", i64 100}



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits