forked from OSchip/llvm-project
				
			X86FrameLowering: Check subregs when deciding prolog kill flags
llvm-svn: 274057
This commit is contained in:
		
							parent
							
								
									91c66275e9
								
							
						
					
					
						commit
						0b9a07883d
					
				| 
						 | 
				
			
			@ -1893,17 +1893,29 @@ bool X86FrameLowering::spillCalleeSavedRegisters(
 | 
			
		|||
    if (!X86::GR64RegClass.contains(Reg) && !X86::GR32RegClass.contains(Reg))
 | 
			
		||||
      continue;
 | 
			
		||||
 | 
			
		||||
    bool isLiveIn = MF.getRegInfo().isLiveIn(Reg);
 | 
			
		||||
    const MachineRegisterInfo &MRI = MF.getRegInfo();
 | 
			
		||||
    bool isLiveIn = MRI.isLiveIn(Reg);
 | 
			
		||||
    if (!isLiveIn)
 | 
			
		||||
      MBB.addLiveIn(Reg);
 | 
			
		||||
 | 
			
		||||
    // Decide whether we can add a kill flag to the use.
 | 
			
		||||
    bool CanKill = !isLiveIn;
 | 
			
		||||
    // Check if any subregister is live-in
 | 
			
		||||
    if (CanKill) {
 | 
			
		||||
      for (MCRegAliasIterator AReg(Reg, TRI, false); AReg.isValid(); ++AReg) {
 | 
			
		||||
        if (MRI.isLiveIn(*AReg)) {
 | 
			
		||||
          CanKill = false;
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Do not set a kill flag on values that are also marked as live-in. This
 | 
			
		||||
    // happens with the @llvm-returnaddress intrinsic and with arguments
 | 
			
		||||
    // passed in callee saved registers.
 | 
			
		||||
    // Omitting the kill flags is conservatively correct even if the live-in
 | 
			
		||||
    // is not used after all.
 | 
			
		||||
    bool isKill = !isLiveIn;
 | 
			
		||||
    BuildMI(MBB, MI, DL, TII.get(Opc)).addReg(Reg, getKillRegState(isKill))
 | 
			
		||||
    BuildMI(MBB, MI, DL, TII.get(Opc)).addReg(Reg, getKillRegState(CanKill))
 | 
			
		||||
      .setMIFlag(MachineInstr::FrameSetup);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
; RUN: llc -verify-machineinstrs -o - %s | FileCheck %s
 | 
			
		||||
target triple = "x86_64--"
 | 
			
		||||
 | 
			
		||||
; This function gets a AL live-in and at same time saves+restores RAX. We must
 | 
			
		||||
; not add a kill flag to the "PUSHQ %rax" or the machine verifier will complain.
 | 
			
		||||
; CHECK-LABEL: test:
 | 
			
		||||
; CHECK: pushq %rax
 | 
			
		||||
; CHECK: testb %al, %al
 | 
			
		||||
; CHECK: je .LBB
 | 
			
		||||
define void @test(i64 %a, i8* %b, ...)  {
 | 
			
		||||
entry:
 | 
			
		||||
  %bar = alloca i8
 | 
			
		||||
  call void @llvm.va_start(i8* %bar)
 | 
			
		||||
  call void @llvm.eh.unwind.init()
 | 
			
		||||
  call void @llvm.eh.return.i64(i64 %a, i8* %b)
 | 
			
		||||
  unreachable
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare void @llvm.eh.return.i64(i64, i8*)
 | 
			
		||||
declare void @llvm.eh.unwind.init()
 | 
			
		||||
declare void @llvm.va_start(i8*)
 | 
			
		||||
		Loading…
	
		Reference in New Issue