[llvm] r328339 - [Hexagon] Two fixes in early if-conversion

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 23 10:46:10 PDT 2018


Author: kparzysz
Date: Fri Mar 23 10:46:09 2018
New Revision: 328339

URL: http://llvm.org/viewvc/llvm-project?rev=328339&view=rev
Log:
[Hexagon] Two fixes in early if-conversion

- Fix checking for vector predicate registers.
- Avoid speculating llvm.lifetime.end intrinsic.

Patch by Harsha Jagasia and Brendon Cahoon.

Added:
    llvm/trunk/test/CodeGen/Hexagon/early-if-conv-lifetime.mir
Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonEarlyIfConv.cpp

Modified: llvm/trunk/lib/Target/Hexagon/HexagonEarlyIfConv.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonEarlyIfConv.cpp?rev=328339&r1=328338&r2=328339&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonEarlyIfConv.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonEarlyIfConv.cpp Fri Mar 23 10:46:09 2018
@@ -191,6 +191,7 @@ namespace {
     bool isProfitable(const FlowPattern &FP) const;
     bool isPredicableStore(const MachineInstr *MI) const;
     bool isSafeToSpeculate(const MachineInstr *MI) const;
+    bool isPredicate(unsigned R) const;
 
     unsigned getCondStoreOpcode(unsigned Opc, bool IfTrue) const;
     void predicateInstr(MachineBasicBlock *ToB, MachineBasicBlock::iterator At,
@@ -387,13 +388,8 @@ bool HexagonEarlyIfConversion::isValidCa
       unsigned R = MO.getReg();
       if (!TargetRegisterInfo::isVirtualRegister(R))
         continue;
-      switch (MRI->getRegClass(R)->getID()) {
-        case Hexagon::PredRegsRegClassID:
-        case Hexagon::HvxQRRegClassID:
-          break;
-        default:
-          continue;
-      }
+      if (!isPredicate(R))
+        continue;
       for (auto U = MRI->use_begin(R); U != MRI->use_end(); ++U)
         if (U->getParent()->isPHI())
           return false;
@@ -443,8 +439,7 @@ bool HexagonEarlyIfConversion::isValid(c
       if (usesUndefVReg(&MI))
         return false;
       unsigned DefR = MI.getOperand(0).getReg();
-      const TargetRegisterClass *RC = MRI->getRegClass(DefR);
-      if (RC == &Hexagon::PredRegsRegClass)
+      if (isPredicate(DefR))
         return false;
     }
   }
@@ -680,10 +675,18 @@ bool HexagonEarlyIfConversion::isSafeToS
     return false;
   if (MI->hasUnmodeledSideEffects())
     return false;
+  if (MI->getOpcode() == TargetOpcode::LIFETIME_END)
+    return false;
 
   return true;
 }
 
+bool HexagonEarlyIfConversion::isPredicate(unsigned R) const {
+  const TargetRegisterClass *RC = MRI->getRegClass(R);
+  return RC == &Hexagon::PredRegsRegClass ||
+         RC == &Hexagon::HvxQRRegClass;
+}
+
 unsigned HexagonEarlyIfConversion::getCondStoreOpcode(unsigned Opc,
       bool IfTrue) const {
   return HII->getCondOpcode(Opc, !IfTrue);

Added: llvm/trunk/test/CodeGen/Hexagon/early-if-conv-lifetime.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/early-if-conv-lifetime.mir?rev=328339&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/early-if-conv-lifetime.mir (added)
+++ llvm/trunk/test/CodeGen/Hexagon/early-if-conv-lifetime.mir Fri Mar 23 10:46:09 2018
@@ -0,0 +1,75 @@
+# RUN: llc -march=hexagon -run-pass hexagon-early-if %s -o - | FileCheck %s
+
+# Test that the LIFETIME_END instruction is not speculated and moved to a
+# different basic block.
+
+# CHECK: bb.1.b1:
+# CHECK: LIFETIME_END
+# CHECK: bb.2.b2:
+
+--- |
+
+  %s.0 = type { %s.1 }
+  %s.1 = type { %s.2 }
+  %s.2 = type { %s.3 }
+  %s.3 = type { %s.4 }
+  %s.4 = type { %s.5 }
+  %s.5 = type { i32, i32, i8* }
+
+  declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #0
+
+  define hidden fastcc void @f0() {
+  b0:
+    %v0 = alloca %s.0, align 4
+    %v1 = load i8, i8* undef, align 1
+    %v2 = add i8 %v1, -102
+    %v3 = icmp ult i8 %v2, 1
+    br i1 %v3, label %b1, label %b2
+
+  b1:                                               ; preds = %b0
+    %v4 = bitcast %s.0* %v0 to i8*
+    call void @llvm.lifetime.end.p0i8(i64 12, i8* nonnull %v4)
+    br label %b2
+
+  b2:                                               ; preds = %b1, %b0
+    ret void
+  }
+
+  attributes #0 = { argmemonly nounwind }
+
+...
+---
+name:            f0
+alignment:       4
+registers:
+  - { id: 0, class: intregs, preferred-register: '' }
+  - { id: 1, class: intregs, preferred-register: '' }
+  - { id: 2, class: predregs, preferred-register: '' }
+  - { id: 3, class: predregs, preferred-register: '' }
+liveins:
+frameInfo:
+  maxAlignment:    4
+fixedStack:
+stack:
+  - { id: 0, name: v0, type: default, offset: 0, size: 12, alignment: 4 }
+constants:
+body:             |
+  bb.0.b0:
+    successors: %bb.1.b1(0x40000000), %bb.2.b2(0x40000000)
+
+    %1 = IMPLICIT_DEF
+    %0 = L2_loadrb_io killed %1, 0 :: (load 1 from `i8* undef`)
+    %2 = C2_cmpeqi killed %0, 102
+    %3 = COPY killed %2
+    J2_jumpf killed %3, %bb.2.b2, implicit-def dead $pc
+    J2_jump %bb.1.b1, implicit-def dead $pc
+
+  bb.1.b1:
+    successors: %bb.2.b2(0x80000000)
+
+    LIFETIME_END %stack.0.v0
+
+  bb.2.b2:
+    PS_jmpret $r31, implicit-def dead $pc
+
+...




More information about the llvm-commits mailing list