[llvm] r263716 - propagate 'unpredictable' metadata on select instructions

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 17 08:30:53 PDT 2016


Author: spatel
Date: Thu Mar 17 10:30:52 2016
New Revision: 263716

URL: http://llvm.org/viewvc/llvm-project?rev=263716&view=rev
Log:
propagate 'unpredictable' metadata on select instructions 

This is similar to D18133 where we allowed profile weights on select instructions. 
This extends that change to also allow the 'unpredictable' attribute of branches to apply to selects.

A test to check that 'unpredictable' metadata is preserved when cloning instructions was checked in at:
http://reviews.llvm.org/rL263648

Differential Revision: http://reviews.llvm.org/D18220


Modified:
    llvm/trunk/include/llvm/IR/IRBuilder.h
    llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
    llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll

Modified: llvm/trunk/include/llvm/IR/IRBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IRBuilder.h?rev=263716&r1=263715&r2=263716&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/IRBuilder.h (original)
+++ llvm/trunk/include/llvm/IR/IRBuilder.h Thu Mar 17 10:30:52 2016
@@ -1569,15 +1569,18 @@ public:
   }
 
   Value *CreateSelect(Value *C, Value *True, Value *False,
-                      const Twine &Name = "", MDNode *ProfWeights = nullptr) {
+                      const Twine &Name = "", Instruction *MDFrom = nullptr) {
     if (Constant *CC = dyn_cast<Constant>(C))
       if (Constant *TC = dyn_cast<Constant>(True))
         if (Constant *FC = dyn_cast<Constant>(False))
           return Insert(Folder.CreateSelect(CC, TC, FC), Name);
 
     SelectInst *Sel = SelectInst::Create(C, True, False);
-    // TODO: "unpredictable" metadata can apply to a select too.
-    Sel->setMetadata(LLVMContext::MD_prof, ProfWeights);
+    if (MDFrom) {
+      MDNode *Prof = MDFrom->getMetadata(LLVMContext::MD_prof);
+      MDNode *Unpred = MDFrom->getMetadata(LLVMContext::MD_unpredictable);
+      Sel = addBranchMetadata(Sel, Prof, Unpred);
+    }
     return Insert(Sel, Name);
   }
 

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=263716&r1=263715&r2=263716&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Thu Mar 17 10:30:52 2016
@@ -1935,10 +1935,9 @@ static bool FoldTwoEntryPHINode(PHINode
     Value *TrueVal  = PN->getIncomingValue(PN->getIncomingBlock(0) == IfFalse);
     Value *FalseVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfTrue);
 
-    MDNode *MDN = InsertPt->getMetadata(LLVMContext::MD_prof);
-    Value *Select = Builder.CreateSelect(IfCond, TrueVal, FalseVal, "", MDN);
-    PN->replaceAllUsesWith(Select);
-    Select->takeName(PN);
+    Value *Sel = Builder.CreateSelect(IfCond, TrueVal, FalseVal, "", InsertPt);
+    PN->replaceAllUsesWith(Sel);
+    Sel->takeName(PN);
     PN->eraseFromParent();
   }
 

Modified: llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll?rev=263716&r1=263715&r2=263716&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll (original)
+++ llvm/trunk/test/Transforms/SimplifyCFG/PhiEliminate2.ll Thu Mar 17 10:30:52 2016
@@ -5,7 +5,7 @@
 
 define i32 @FoldTwoEntryPHINode(i1 %C, i32 %V1, i32 %V2, i16 %V3) {
 entry:
-        br i1 %C, label %then, label %else, !prof !0
+        br i1 %C, label %then, label %else, !prof !0, !unpredictable !1
 then:
         %V4 = or i32 %V2, %V1
         br label %Cont
@@ -21,12 +21,14 @@ Cont:
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:  %V5 = sext i16 %V3 to i32
 ; CHECK-NEXT:  %V4 = or i32 %V2, %V1
-; CHECK-NEXT:  %V6 = select i1 %C, i32 %V4, i32 %V5, !prof !0
+; CHECK-NEXT:  %V6 = select i1 %C, i32 %V4, i32 %V5, !prof !0, !unpredictable !1
 ; CHECK-NEXT:  %0 = call i32 @FoldTwoEntryPHINode(i1 false, i32 0, i32 0, i16 0)
 ; CHECK-NEXT:  ret i32 %V1
 }
 
 !0 = !{!"branch_weights", i32 3, i32 5}
+!1 = !{}
 
 ; CHECK: !0 = !{!"branch_weights", i32 3, i32 5}
+; CHECK: !1 = !{}
 




More information about the llvm-commits mailing list