[PATCH] D24169: [Profile] Preserve branch meta data in CGP lowering of select instruction

David Li via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 2 17:01:38 PDT 2016


davidxl updated this revision to Diff 70257.
davidxl added a comment.

The builder interface should copy all branch related meta data if-available. The new interface will also replace similar code in loop unswitch (followup).

Dehao, the new change also copies over debug location meta data to the branch. What is the potential impact of this to Sample PGO?


https://reviews.llvm.org/D24169

Files:
  include/llvm/IR/IRBuilder.h
  lib/CodeGen/CodeGenPrepare.cpp
  test/CodeGen/X86/cmov-into-branch.ll
  test/CodeGen/X86/select_meta.ll

Index: test/CodeGen/X86/cmov-into-branch.ll
===================================================================
--- test/CodeGen/X86/cmov-into-branch.ll
+++ test/CodeGen/X86/cmov-into-branch.ll
@@ -103,11 +103,11 @@
 ; CHECK-LABEL: weighted_select3:
 ; CHECK:       # BB#0:
 ; CHECK-NEXT:    testl %edi, %edi
-; CHECK-NEXT:    jne [[LABEL_BB6:.*]]
-; CHECK:         movl %esi, %edi
-; CHECK-NEXT:  [[LABEL_BB6]]
-; CHECK-NEXT:    movl %edi, %eax
-; CHECK-NEXT:    retq
+; CHECK-NEXT:    je [[LABEL_BB6:.*]]
+; CHECK:         movl %edi, %eax
+; CHECK:         [[LABEL_BB6]]
+; CHECK-NEXT:    movl %esi, %edi
+; CHECK-NEXT:    jmp
 ;
   %cmp = icmp ne i32 %a, 0
   %sel = select i1 %cmp, i32 %a, i32 %b, !prof !2
Index: test/CodeGen/X86/select_meta.ll
===================================================================
--- test/CodeGen/X86/select_meta.ll
+++ test/CodeGen/X86/select_meta.ll
@@ -0,0 +1,16 @@
+; RUN: llc -mtriple=x86_64-unknown-unknown -print-after-all < %s 2>&1 | FileCheck %s
+
+; Function Attrs: norecurse nounwind readnone uwtable
+define i32 @foo(i32, i32, i32) {
+  %4 = and i32 %0, 3
+  %5 = icmp eq i32 %4, 1
+  %6 = select i1 %5, i32 %1, i32 %2, !prof  !1
+; CHECK: br {{.*}}label{{.*}}, label{{.*}}, !prof ![[WT:.*]]
+  ret i32 %6
+}
+
+!llvm.ident = !{!0}
+
+!0 = !{!"clang version 4.0.0 (trunk 279683)"}
+!1 = !{!"branch_weights", i32 1000, i32 1 }
+; CHECK ![[WT]] = !{!"branch_weights", i32 1000, i32 1 }
Index: lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- lib/CodeGen/CodeGenPrepare.cpp
+++ lib/CodeGen/CodeGenPrepare.cpp
@@ -4676,15 +4676,20 @@
   // of the condition, it means that side of the branch goes to the end block
   // directly and the path originates from the start block from the point of
   // view of the new PHI.
+  BasicBlock *TT, *FT;
   if (TrueBlock == nullptr) {
-    BranchInst::Create(EndBlock, FalseBlock, SI->getCondition(), SI);
+    TT = EndBlock;
+    FT = FalseBlock;
     TrueBlock = StartBlock;
   } else if (FalseBlock == nullptr) {
-    BranchInst::Create(TrueBlock, EndBlock, SI->getCondition(), SI);
+    TT = TrueBlock;
+    FT = EndBlock;
     FalseBlock = StartBlock;
   } else {
-    BranchInst::Create(TrueBlock, FalseBlock, SI->getCondition(), SI);
+    TT = TrueBlock;
+    FT = FalseBlock;
   }
+  IRBuilder<>(SI).CreateCondBr(SI->getCondition(), TT, FT, SI);
 
   // The select itself is replaced with a PHI Node.
   PHINode *PN = PHINode::Create(SI->getType(), 2, "", &EndBlock->front());
Index: include/llvm/IR/IRBuilder.h
===================================================================
--- include/llvm/IR/IRBuilder.h
+++ include/llvm/IR/IRBuilder.h
@@ -703,6 +703,19 @@
                                     BranchWeights, Unpredictable));
   }
 
+  /// \brief Create a conditional 'br Cond, TrueDest, FalseDest'
+  /// instruction. Copy branch meta data if available.
+  BranchInst *CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False,
+                           Instruction *MDSrc) {
+    BranchInst *Br = BranchInst::Create(True, False, Cond);
+    if (MDSrc) {
+      unsigned WL[4] = {LLVMContext::MD_prof, LLVMContext::MD_unpredictable,
+                        LLVMContext::MD_make_implicit, LLVMContext::MD_dbg};
+      Br->copyMetadata(*MDSrc, makeArrayRef(&WL[0], 4));
+    }
+    return Insert(Br);
+  }
+
   /// \brief Create a switch instruction with the specified value, default dest,
   /// and with a hint for the number of cases that will be added (for efficient
   /// allocation).


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D24169.70257.patch
Type: text/x-patch
Size: 3551 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160903/a8bce492/attachment.bin>


More information about the llvm-commits mailing list