[PATCH] D44324: [TwoAddressInstructionPass] Improve tryInstructionCommute X86 FMA and vpternlog instructions

Phabricator via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 9 15:39:34 PST 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL327188: [TwoAddressInstructionPass] Improve tryInstructionCommute of X86 FMA and… (authored by ctopper, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D44324?vs=137831&id=137856#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D44324

Files:
  llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp
  llvm/trunk/test/CodeGen/X86/avx512-vpternlog-commute.ll


Index: llvm/trunk/test/CodeGen/X86/avx512-vpternlog-commute.ll
===================================================================
--- llvm/trunk/test/CodeGen/X86/avx512-vpternlog-commute.ll
+++ llvm/trunk/test/CodeGen/X86/avx512-vpternlog-commute.ll
@@ -27,8 +27,7 @@
 define <16 x i32> @vpternlog_v16i32_210(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2) {
 ; CHECK-LABEL: vpternlog_v16i32_210:
 ; CHECK:       ## %bb.0:
-; CHECK-NEXT:    vpternlogd $78, %zmm0, %zmm2, %zmm1
-; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
+; CHECK-NEXT:    vpternlogd $92, %zmm1, %zmm2, %zmm0
 ; CHECK-NEXT:    retq
   %res = call <16 x i32> @llvm.x86.avx512.mask.pternlog.d.512(<16 x i32> %x2, <16 x i32> %x1, <16 x i32> %x0, i32 114, i16 -1)
   ret <16 x i32> %res
@@ -434,8 +433,7 @@
 ; CHECK-LABEL: vpternlog_v16i32_210_maskz:
 ; CHECK:       ## %bb.0:
 ; CHECK-NEXT:    kmovd %edi, %k1
-; CHECK-NEXT:    vpternlogd $78, %zmm0, %zmm2, %zmm1 {%k1} {z}
-; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
+; CHECK-NEXT:    vpternlogd $92, %zmm1, %zmm2, %zmm0 {%k1} {z}
 ; CHECK-NEXT:    retq
   %res = call <16 x i32> @llvm.x86.avx512.maskz.pternlog.d.512(<16 x i32> %x2, <16 x i32> %x1, <16 x i32> %x0, i32 114, i16 %mask)
   ret <16 x i32> %res
Index: llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp
===================================================================
--- llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp
+++ llvm/trunk/lib/CodeGen/TwoAddressInstructionPass.cpp
@@ -1205,6 +1205,7 @@
   if (!MI->isCommutable())
     return false;
 
+  bool MadeChange = false;
   unsigned DstOpReg = MI->getOperand(DstOpIdx).getReg();
   unsigned BaseOpReg = MI->getOperand(BaseOpIdx).getReg();
   unsigned OpsNum = MI->getDesc().getNumOperands();
@@ -1223,8 +1224,8 @@
 
     // If OtherOp dies but BaseOp does not, swap the OtherOp and BaseOp
     // operands. This makes the live ranges of DstOp and OtherOp joinable.
-    bool DoCommute =
-        !BaseOpKilled && isKilled(*MI, OtherOpReg, MRI, TII, LIS, false);
+    bool OtherOpKilled = isKilled(*MI, OtherOpReg, MRI, TII, LIS, false);
+    bool DoCommute = !BaseOpKilled && OtherOpKilled;
 
     if (!DoCommute &&
         isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg, MI, Dist)) {
@@ -1235,13 +1236,21 @@
     // If it's profitable to commute, try to do so.
     if (DoCommute && commuteInstruction(MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
                                         Dist)) {
+      MadeChange = true;
       ++NumCommuted;
-      if (AggressiveCommute)
+      if (AggressiveCommute) {
         ++NumAggrCommuted;
-      return true;
+        // There might be more than two commutable operands, update BaseOp and
+        // continue scanning.
+        BaseOpReg = OtherOpReg;
+        BaseOpKilled = OtherOpKilled;
+        continue;
+      }
+      // If this was a commute based on kill, we won't do better continuing.
+      return MadeChange;
     }
   }
-  return false;
+  return MadeChange;
 }
 
 /// For the case where an instruction has a single pair of tied register


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44324.137856.patch
Type: text/x-patch
Size: 3039 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180309/26a935e6/attachment.bin>


More information about the llvm-commits mailing list