]> granicus.if.org Git - llvm/commitdiff
Merging r278086:
authorHans Wennborg <hans@hanshq.net>
Tue, 9 Aug 2016 15:48:01 +0000 (15:48 +0000)
committerHans Wennborg <hans@hanshq.net>
Tue, 9 Aug 2016 15:48:01 +0000 (15:48 +0000)
------------------------------------------------------------------------
r278086 | matze | 2016-08-08 18:47:26 -0700 (Mon, 08 Aug 2016) | 6 lines

X86InstrInfo: Update liveness in classifyLea()

We need to update liveness information when we create COPYs in
classifyLea().

This fixes http://llvm.org/28301
------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_39@278128 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrInfo.cpp
lib/Target/X86/X86InstrInfo.h
test/CodeGen/X86/twoaddr-lea.ll

index 1672b3855b7981a07b1c154e10a5278e2c556acb..5f0aab9ddc68b75e35c5dbc90db83c420c931e6a 100644 (file)
@@ -2661,7 +2661,8 @@ inline static bool isTruncatedShiftCountForLEA(unsigned ShAmt) {
 bool X86InstrInfo::classifyLEAReg(MachineInstr &MI, const MachineOperand &Src,
                                   unsigned Opc, bool AllowSP, unsigned &NewSrc,
                                   bool &isKill, bool &isUndef,
-                                  MachineOperand &ImplicitOp) const {
+                                  MachineOperand &ImplicitOp,
+                                  LiveVariables *LV) const {
   MachineFunction &MF = *MI.getParent()->getParent();
   const TargetRegisterClass *RC;
   if (AllowSP) {
@@ -2715,13 +2716,17 @@ bool X86InstrInfo::classifyLEAReg(MachineInstr &MI, const MachineOperand &Src,
     // Virtual register of the wrong class, we have to create a temporary 64-bit
     // vreg to feed into the LEA.
     NewSrc = MF.getRegInfo().createVirtualRegister(RC);
-    BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), get(TargetOpcode::COPY))
+    MachineInstr *Copy = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
+                                 get(TargetOpcode::COPY))
         .addReg(NewSrc, RegState::Define | RegState::Undef, X86::sub_32bit)
         .addOperand(Src);
 
     // Which is obviously going to be dead after we're done with it.
     isKill = true;
     isUndef = false;
+
+    if (LV)
+      LV->replaceKillInstruction(SrcReg, MI, *Copy);
   }
 
   // We've set all the parameters without issue.
@@ -2900,7 +2905,7 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
     unsigned SrcReg;
     MachineOperand ImplicitOp = MachineOperand::CreateReg(0, false);
     if (!classifyLEAReg(MI, Src, Opc, /*AllowSP=*/ false,
-                        SrcReg, isKill, isUndef, ImplicitOp))
+                        SrcReg, isKill, isUndef, ImplicitOp, LV))
       return nullptr;
 
     MachineInstrBuilder MIB =
@@ -2943,7 +2948,7 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
     unsigned SrcReg;
     MachineOperand ImplicitOp = MachineOperand::CreateReg(0, false);
     if (!classifyLEAReg(MI, Src, Opc, /*AllowSP=*/ false,
-                        SrcReg, isKill, isUndef, ImplicitOp))
+                        SrcReg, isKill, isUndef, ImplicitOp, LV))
       return nullptr;
 
     MachineInstrBuilder MIB =
@@ -2977,7 +2982,7 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
     unsigned SrcReg;
     MachineOperand ImplicitOp = MachineOperand::CreateReg(0, false);
     if (!classifyLEAReg(MI, Src, Opc, /*AllowSP=*/ false,
-                        SrcReg, isKill, isUndef, ImplicitOp))
+                        SrcReg, isKill, isUndef, ImplicitOp, LV))
       return nullptr;
 
     MachineInstrBuilder MIB = BuildMI(MF, MI.getDebugLoc(), get(Opc))
@@ -3016,7 +3021,7 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
     unsigned SrcReg;
     MachineOperand ImplicitOp = MachineOperand::CreateReg(0, false);
     if (!classifyLEAReg(MI, Src, Opc, /*AllowSP=*/ true,
-                        SrcReg, isKill, isUndef, ImplicitOp))
+                        SrcReg, isKill, isUndef, ImplicitOp, LV))
       return nullptr;
 
     const MachineOperand &Src2 = MI.getOperand(2);
@@ -3024,7 +3029,7 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
     unsigned SrcReg2;
     MachineOperand ImplicitOp2 = MachineOperand::CreateReg(0, false);
     if (!classifyLEAReg(MI, Src2, Opc, /*AllowSP=*/ false,
-                        SrcReg2, isKill2, isUndef2, ImplicitOp2))
+                        SrcReg2, isKill2, isUndef2, ImplicitOp2, LV))
       return nullptr;
 
     MachineInstrBuilder MIB =
@@ -3087,7 +3092,7 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
     unsigned SrcReg;
     MachineOperand ImplicitOp = MachineOperand::CreateReg(0, false);
     if (!classifyLEAReg(MI, Src, Opc, /*AllowSP=*/ true,
-                        SrcReg, isKill, isUndef, ImplicitOp))
+                        SrcReg, isKill, isUndef, ImplicitOp, LV))
       return nullptr;
 
     MachineInstrBuilder MIB = BuildMI(MF, MI.getDebugLoc(), get(Opc))
index 858f35d1cbf0dad98b566b3b8d0c85c07142f608..a8a9f629fc1d37a19ab72b6f5265daf6649a5f5a 100644 (file)
@@ -230,7 +230,7 @@ public:
   bool classifyLEAReg(MachineInstr &MI, const MachineOperand &Src,
                       unsigned LEAOpcode, bool AllowSP, unsigned &NewSrc,
                       bool &isKill, bool &isUndef,
-                      MachineOperand &ImplicitOp) const;
+                      MachineOperand &ImplicitOp, LiveVariables *LV) const;
 
   /// convertToThreeAddress - This method must be implemented by targets that
   /// set the M_CONVERTIBLE_TO_3_ADDR flag.  When this flag is set, the target
index 5779cf33ac84ceb8a0cbfc2085305752201d7f80..2944b17c6c163da5cdae18904e5a47f0cb0ea0e2 100644 (file)
@@ -44,3 +44,60 @@ entry:
   %0 = shl i64 %x, 1
   ret i64 %0
 }
+
+@global = external global i32, align 4
+@global2 = external global i64, align 8
+
+; Test that liveness is properly updated and we do not encounter the
+; assert/crash from http://llvm.org/PR28301
+; CHECK-LABEL: ham
+define void @ham() {
+bb:
+  br label %bb1
+
+bb1:
+  %tmp = phi i64 [ %tmp40, %bb9 ], [ 0, %bb ]
+  %tmp2 = phi i32 [ %tmp39, %bb9 ], [ 0, %bb ]
+  %tmp3 = icmp sgt i32 undef, 10
+  br i1 %tmp3, label %bb2, label %bb3
+
+bb2:
+  %tmp6 = load i32, i32* @global, align 4
+  %tmp8 = add nsw i32 %tmp6, %tmp2
+  %tmp9 = sext i32 %tmp8 to i64
+  br label %bb6
+
+bb3:
+; CHECK: subl %e[[REG0:[a-z0-9]+]],
+; CHECK: leaq 4({{%[a-z0-9]+}}), %r[[REG0]]
+  %tmp14 = phi i64 [ %tmp15, %bb5 ], [ 0, %bb1 ]
+  %tmp15 = add nuw i64 %tmp14, 4
+  %tmp16 = trunc i64 %tmp14 to i32
+  %tmp17 = sub i32 %tmp2, %tmp16
+  br label %bb4
+
+bb4:
+  %tmp20 = phi i64 [ %tmp14, %bb3 ], [ %tmp34, %bb5 ]
+  %tmp28 = icmp eq i32 %tmp17, 0
+  br i1 %tmp28, label %bb5, label %bb8
+
+bb5:
+  %tmp34 = add nuw nsw i64 %tmp20, 1
+  %tmp35 = icmp slt i64 %tmp34, %tmp15
+  br i1 %tmp35, label %bb4, label %bb3
+
+bb6:
+  store volatile i64 %tmp, i64* @global2, align 8
+  store volatile i64 %tmp9, i64* @global2, align 8
+  store volatile i32 %tmp6, i32* @global, align 4
+  %tmp45 = icmp slt i32 undef, undef
+  br i1 %tmp45, label %bb6, label %bb9
+
+bb8:
+  unreachable
+
+bb9:
+  %tmp39 = add nuw nsw i32 %tmp2, 4
+  %tmp40 = add nuw i64 %tmp, 4
+  br label %bb1
+}