Index: llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp =================================================================== --- llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp +++ llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp @@ -1059,6 +1059,7 @@ Register SrcLoReg, SrcHiReg; Register DstReg = MI.getOperand(0).getReg(); Register SrcReg = MI.getOperand(1).getReg(); + bool DstIsUndef = MI.getOperand(0).isUndef(); bool SrcIsKill = MI.getOperand(1).isKill(); unsigned OpLo = AVR::STPtrRr; unsigned OpHi = AVR::STDPtrQRr; @@ -1066,11 +1067,11 @@ //:TODO: need to reverse this order like inw and stsw? auto MIBLO = buildMI(MBB, MBBI, OpLo) - .addReg(DstReg) + .addReg(DstReg, getUndefRegState(DstIsUndef)) .addReg(SrcLoReg, getKillRegState(SrcIsKill)); auto MIBHI = buildMI(MBB, MBBI, OpHi) - .addReg(DstReg) + .addReg(DstReg, getUndefRegState(DstIsUndef)) .addImm(1) .addReg(SrcHiReg, getKillRegState(SrcIsKill)); @@ -1417,7 +1418,7 @@ buildMI(MBB, MBBI, AVR::EORRdRr) .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead)) .addReg(DstHiReg, getKillRegState(DstIsKill)) - .addReg(DstLoReg, getKillRegState(DstIsKill)); + .addReg(DstLoReg); // SREG is implicitly dead. MI1->getOperand(3).setIsDead(); @@ -1435,7 +1436,7 @@ buildMI(MBB, MBBI, AVR::EORRdRr) .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead)) .addReg(DstHiReg, getKillRegState(DstIsKill)) - .addReg(DstLoReg, getKillRegState(DstIsKill)); + .addReg(DstLoReg); if (ImpIsDead) MI3->getOperand(3).setIsDead(); @@ -1456,7 +1457,7 @@ // mov Rh, Rl buildMI(MBB, MBBI, AVR::MOVRdRr) .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead)) - .addReg(DstLoReg, getKillRegState(DstIsKill)); + .addReg(DstLoReg); // clr Rl auto MIBLO = @@ -1484,7 +1485,7 @@ // mov Rh, Rl buildMI(MBB, MBBI, AVR::MOVRdRr) .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead)) - .addReg(DstLoReg, getKillRegState(DstIsKill)); + .addReg(DstLoReg); // swap Rh buildMI(MBB, MBBI, AVR::SWAPRd) @@ -1577,7 +1578,7 @@ buildMI(MBB, MBBI, AVR::EORRdRr) .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead)) .addReg(DstLoReg, getKillRegState(DstIsKill)) - .addReg(DstHiReg, getKillRegState(DstIsKill)); + .addReg(DstHiReg); // SREG is implicitly dead. MI1->getOperand(3).setIsDead(); @@ -1595,7 +1596,7 @@ buildMI(MBB, MBBI, AVR::EORRdRr) .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead)) .addReg(DstLoReg, getKillRegState(DstIsKill)) - .addReg(DstHiReg, getKillRegState(DstIsKill)); + .addReg(DstHiReg); if (ImpIsDead) MI3->getOperand(3).setIsDead(); @@ -1729,7 +1730,7 @@ // Move upper byte to lower byte. buildMI(MBB, MBBI, AVR::MOVRdRr) .addReg(DstLoReg, RegState::Define | getDeadRegState(DstIsDead)) - .addReg(DstHiReg, getKillRegState(DstIsKill)); + .addReg(DstHiReg); // Move the sign bit to the C flag. buildMI(MBB, MBBI, AVR::ADDRdRr) @@ -1764,7 +1765,8 @@ buildMI(MBB, MBBI, AVR::RORRd) .addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead)) - .addReg(DstReg, getKillRegState(DstIsKill)); + .addReg(DstReg, getKillRegState(DstIsKill)) + ->getOperand(3).setIsUndef(true); buildMI(MBB, MBBI, AVR::EORRdRr) .addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead)) @@ -1801,7 +1803,8 @@ buildMI(MBB, MBBI, AVR::ADCRdRr) .addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead)) .addReg(DstReg, getKillRegState(DstIsKill)) - .addReg(DstReg, getKillRegState(DstIsKill)); + .addReg(DstReg, getKillRegState(DstIsKill)) + ->getOperand(4).setIsUndef(true); buildMI(MBB, MBBI, AVR::EORRdRr) .addReg(DstReg, RegState::Define | getDeadRegState(DstIsDead)) @@ -1940,8 +1943,8 @@ auto EOR = buildMI(MBB, MBBI, AVR::EORRdRr) .addReg(DstHiReg, RegState::Define | getDeadRegState(DstIsDead)) - .addReg(DstHiReg, RegState::Kill) - .addReg(DstHiReg, RegState::Kill); + .addReg(DstHiReg, RegState::Kill | RegState::Undef) + .addReg(DstHiReg, RegState::Kill | RegState::Undef); if (ImpIsDead) EOR->getOperand(3).setIsDead(); Index: llvm/lib/Target/AVR/AVRFrameLowering.cpp =================================================================== --- llvm/lib/Target/AVR/AVRFrameLowering.cpp +++ llvm/lib/Target/AVR/AVRFrameLowering.cpp @@ -362,7 +362,7 @@ New->getOperand(3).setIsDead(); BuildMI(MBB, MI, DL, TII.get(AVR::SPWRITE), AVR::SP) - .addReg(AVR::R31R30, RegState::Kill); + .addReg(AVR::R31R30); // Make sure the remaining stack stores are converted to real store // instructions. Index: llvm/test/CodeGen/AVR/pseudo/ADCWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ADCWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/ADCWRdRr.mir @@ -14,6 +14,7 @@ name: test_adcwrdrr body: | bb.0.entry: + liveins: $r15r14, $r21r20, $sreg ; CHECK-LABEL: test_adcwrdrr Index: llvm/test/CodeGen/AVR/pseudo/ADDWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ADDWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/ADDWRdRr.mir @@ -14,6 +14,7 @@ name: test_addwrdrr body: | bb.0.entry: + liveins: $r15r14, $r21r20 ; CHECK-LABEL: test_addwrdrr Index: llvm/test/CodeGen/AVR/pseudo/ANDIWRdK.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ANDIWRdK.mir +++ llvm/test/CodeGen/AVR/pseudo/ANDIWRdK.mir @@ -14,6 +14,7 @@ name: test_andiwrdrr body: | bb.0.entry: + liveins: $r17r16 ; CHECK-LABEL: test_andiwrdrr Index: llvm/test/CodeGen/AVR/pseudo/ANDWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ANDWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/ANDWRdRr.mir @@ -14,6 +14,7 @@ name: test_andwrdrr body: | bb.0.entry: + liveins: $r15r14, $r21r20 ; CHECK-LABEL: test_andwrdrr Index: llvm/test/CodeGen/AVR/pseudo/ASRWRd.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ASRWRd.mir +++ llvm/test/CodeGen/AVR/pseudo/ASRWRd.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r15r14 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/COMWRd.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/COMWRd.mir +++ llvm/test/CodeGen/AVR/pseudo/COMWRd.mir @@ -14,6 +14,7 @@ name: test_comwrd body: | bb.0.entry: + liveins: $r15r14 ; CHECK-LABEL: test_comwrd Index: llvm/test/CodeGen/AVR/pseudo/CPCWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/CPCWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/CPCWRdRr.mir @@ -14,6 +14,7 @@ name: test_cpcwrdrr body: | bb.0.entry: + liveins: $r21r20, $r23r22, $sreg ; CHECK-LABEL: test_cpcwrdrr Index: llvm/test/CodeGen/AVR/pseudo/CPWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/CPWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/CPWRdRr.mir @@ -14,6 +14,7 @@ name: test_cpwrdrr body: | bb.0.entry: + liveins: $r15r14, $r21r20 ; CHECK-LABEL: test_cpwrdrr Index: llvm/test/CodeGen/AVR/pseudo/EORWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/EORWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/EORWRdRr.mir @@ -14,6 +14,7 @@ name: test_eorwrdrr body: | bb.0.entry: + liveins: $r15r14, $r21r20 ; CHECK-LABEL: test_eorwrdrr Index: llvm/test/CodeGen/AVR/pseudo/FRMIDX.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/FRMIDX.mir +++ llvm/test/CodeGen/AVR/pseudo/FRMIDX.mir @@ -18,6 +18,7 @@ - { id: 0, class: _ } body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/LDDWRdPtrQ.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/LDDWRdPtrQ.mir +++ llvm/test/CodeGen/AVR/pseudo/LDDWRdPtrQ.mir @@ -15,6 +15,7 @@ tracksRegLiveness: true body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test_lddwrdptrq Index: llvm/test/CodeGen/AVR/pseudo/LDWRdPtr-same-src-dst.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/LDWRdPtr-same-src-dst.mir +++ llvm/test/CodeGen/AVR/pseudo/LDWRdPtr-same-src-dst.mir @@ -15,6 +15,7 @@ tracksRegLiveness: true body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test_ldwrdptr Index: llvm/test/CodeGen/AVR/pseudo/LDWRdPtr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/LDWRdPtr.mir +++ llvm/test/CodeGen/AVR/pseudo/LDWRdPtr.mir @@ -14,6 +14,7 @@ name: test_ldwrdptr body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test_ldwrdptr Index: llvm/test/CodeGen/AVR/pseudo/LDWRdPtrPd.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/LDWRdPtrPd.mir +++ llvm/test/CodeGen/AVR/pseudo/LDWRdPtrPd.mir @@ -14,6 +14,7 @@ name: test_ldwrdptrpd body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test_ldwrdptrpd Index: llvm/test/CodeGen/AVR/pseudo/LDWRdPtrPi.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/LDWRdPtrPi.mir +++ llvm/test/CodeGen/AVR/pseudo/LDWRdPtrPi.mir @@ -14,6 +14,7 @@ name: test_ldwrdptrpi body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test_ldwrdptrpi Index: llvm/test/CodeGen/AVR/pseudo/LSLWRd.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/LSLWRd.mir +++ llvm/test/CodeGen/AVR/pseudo/LSLWRd.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r15r14 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/LSRWRd.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/LSRWRd.mir +++ llvm/test/CodeGen/AVR/pseudo/LSRWRd.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r15r14 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/NEGWRd.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/NEGWRd.mir +++ llvm/test/CodeGen/AVR/pseudo/NEGWRd.mir @@ -14,6 +14,7 @@ name: test_negwrd body: | bb.0.entry: + liveins: $r15r14 ; CHECK-LABEL: test_negwrd Index: llvm/test/CodeGen/AVR/pseudo/ORIWRdK.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ORIWRdK.mir +++ llvm/test/CodeGen/AVR/pseudo/ORIWRdK.mir @@ -14,6 +14,7 @@ name: test_oriwrdrr body: | bb.0.entry: + liveins: $r21r20 ; CHECK-LABEL: test_oriwrdrr Index: llvm/test/CodeGen/AVR/pseudo/ORWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ORWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/ORWRdRr.mir @@ -14,6 +14,7 @@ name: test_orwrdrr body: | bb.0.entry: + liveins: $r15r14, $r21r20 ; CHECK-LABEL: test_orwrdrr Index: llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir +++ llvm/test/CodeGen/AVR/pseudo/OUTWARr.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r15r14 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/SBCIWRdK.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/SBCIWRdK.mir +++ llvm/test/CodeGen/AVR/pseudo/SBCIWRdK.mir @@ -14,6 +14,7 @@ name: test_sbciwrdk body: | bb.0.entry: + liveins: $r21r20, $sreg ; CHECK-LABEL: test_sbciwrdk Index: llvm/test/CodeGen/AVR/pseudo/SBCWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/SBCWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/SBCWRdRr.mir @@ -14,6 +14,7 @@ name: test_sbcwrdrr body: | bb.0.entry: + liveins: $r15r14, $r21r20, $sreg ; CHECK-LABEL: test_sbcwrdrr Index: llvm/test/CodeGen/AVR/pseudo/SEXT.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/SEXT.mir +++ llvm/test/CodeGen/AVR/pseudo/SEXT.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r31 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir +++ llvm/test/CodeGen/AVR/pseudo/STSWKRr.mir @@ -14,6 +14,7 @@ name: test_stswkrr body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test_stswkrr Index: llvm/test/CodeGen/AVR/pseudo/STWPtrPdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/STWPtrPdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/STWPtrPdRr.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/STWPtrPiRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/STWPtrPiRr.mir +++ llvm/test/CodeGen/AVR/pseudo/STWPtrPiRr.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r31r30 ; CHECK-LABEL: test Index: llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir +++ llvm/test/CodeGen/AVR/pseudo/STWPtrRr.mir @@ -14,6 +14,7 @@ name: test_stwptrrr body: | bb.0.entry: + liveins: $r31r30, $r17r16 ; CHECK-LABEL: test_stwptrrr Index: llvm/test/CodeGen/AVR/pseudo/SUBIWRdK.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/SUBIWRdK.mir +++ llvm/test/CodeGen/AVR/pseudo/SUBIWRdK.mir @@ -14,6 +14,7 @@ name: test_subiwrdrr body: | bb.0.entry: + liveins: $r21r20 ; CHECK-LABEL: test_subiwrdrr Index: llvm/test/CodeGen/AVR/pseudo/SUBWRdRr.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/SUBWRdRr.mir +++ llvm/test/CodeGen/AVR/pseudo/SUBWRdRr.mir @@ -14,6 +14,7 @@ name: test_subwrdrr body: | bb.0.entry: + liveins: $r21r20, $r15r14 ; CHECK-LABEL: test_subwrdrr Index: llvm/test/CodeGen/AVR/pseudo/ZEXT.mir =================================================================== --- llvm/test/CodeGen/AVR/pseudo/ZEXT.mir +++ llvm/test/CodeGen/AVR/pseudo/ZEXT.mir @@ -12,6 +12,7 @@ name: test body: | bb.0.entry: + liveins: $r31 ; CHECK-LABEL: test