[PATCH] D76048: [CodeGenPrepare] Expand freeze conversion to support fcmp and icmp with null

Juneyoung Lee via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 13 01:33:31 PDT 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rGc39cb1c0ddcc: [CodeGenPrepare] Expand freeze conversion to support fcmp and icmp with null (authored by aqjune).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D76048/new/

https://reviews.llvm.org/D76048

Files:
  llvm/lib/CodeGen/CodeGenPrepare.cpp
  llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll


Index: llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll
===================================================================
--- llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll
+++ llvm/test/Transforms/CodeGenPrepare/X86/freeze-cmp.ll
@@ -73,9 +73,9 @@
 
 define i1 @ptrcmp(i8* %p) {
 ; CHECK-LABEL: @ptrcmp(
-; CHECK-NEXT:    [[C:%.*]] = icmp eq i8* [[P:%.*]], null
-; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[C]]
-; CHECK-NEXT:    ret i1 [[FR]]
+; CHECK-NEXT:    [[FR:%.*]] = freeze i8* [[P:%.*]]
+; CHECK-NEXT:    [[C:%.*]] = icmp eq i8* [[FR]], null
+; CHECK-NEXT:    ret i1 [[C]]
 ;
   %c = icmp eq i8* %p, null
   %fr = freeze i1 %c
@@ -85,9 +85,9 @@
 
 define i1 @fcmp(float %a) {
 ; CHECK-LABEL: @fcmp(
-; CHECK-NEXT:    [[C:%.*]] = fcmp oeq float [[A:%.*]], 0.000000e+00
-; CHECK-NEXT:    [[FR:%.*]] = freeze i1 [[C]]
-; CHECK-NEXT:    ret i1 [[FR]]
+; CHECK-NEXT:    [[FR:%.*]] = freeze float [[A:%.*]]
+; CHECK-NEXT:    [[C:%.*]] = fcmp oeq float [[FR]], 0.000000e+00
+; CHECK-NEXT:    ret i1 [[C]]
 ;
   %c = fcmp oeq float %a, 0.0
   %fr = freeze i1 %c
@@ -104,5 +104,6 @@
   %fr = freeze i1 %c
   ret i1 %fr
 }
+
 declare void @g1()
 declare void @g2()
Index: llvm/lib/CodeGen/CodeGenPrepare.cpp
===================================================================
--- llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -7198,16 +7198,25 @@
   if (FreezeInst *FI = dyn_cast<FreezeInst>(I)) {
     // br(freeze(icmp a, const)) -> br(icmp (freeze a), const)
     // This helps generate efficient conditional jumps.
-    if (ICmpInst *II = dyn_cast<ICmpInst>(FI->getOperand(0))) {
-      auto Op0 = II->getOperand(0), Op1 = II->getOperand(1);
-      bool Const0 = isa<ConstantInt>(Op0), Const1 = isa<ConstantInt>(Op1);
-      if (II->hasOneUse() && (Const0 || Const1)) {
+    Instruction *CmpI = nullptr;
+    if (ICmpInst *II = dyn_cast<ICmpInst>(FI->getOperand(0)))
+      CmpI = II;
+    else if (FCmpInst *F = dyn_cast<FCmpInst>(FI->getOperand(0)))
+      CmpI = F->getFastMathFlags().none() ? F : nullptr;
+
+    if (CmpI && CmpI->hasOneUse()) {
+      auto Op0 = CmpI->getOperand(0), Op1 = CmpI->getOperand(1);
+      bool Const0 = isa<ConstantInt>(Op0) || isa<ConstantFP>(Op0) ||
+                    isa<ConstantPointerNull>(Op0);
+      bool Const1 = isa<ConstantInt>(Op1) || isa<ConstantFP>(Op1) ||
+                    isa<ConstantPointerNull>(Op1);
+      if (Const0 || Const1) {
         if (!Const0 || !Const1) {
-          auto *F = new FreezeInst(Const0 ? Op1 : Op0, "", II);
+          auto *F = new FreezeInst(Const0 ? Op1 : Op0, "", CmpI);
           F->takeName(FI);
-          II->setOperand(Const0 ? 1 : 0, F);
+          CmpI->setOperand(Const0 ? 1 : 0, F);
         }
-        FI->replaceAllUsesWith(II);
+        FI->replaceAllUsesWith(CmpI);
         FI->eraseFromParent();
         return true;
       }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76048.250148.patch
Type: text/x-patch
Size: 2878 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200313/1ffb61c3/attachment.bin>


More information about the llvm-commits mailing list