Index: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -2420,7 +2420,8 @@ MachineOperand &MO = MI->getOperand(i); RegList.push_back(MO); - if (MO.isReg() && TRI->getEncodingValue(MO.getReg()) < FirstRegEnc) + if (MO.isReg() && !MO.isImplicit() && + TRI->getEncodingValue(MO.getReg()) < FirstRegEnc) FirstRegEnc = TRI->getEncodingValue(MO.getReg()); } @@ -2430,7 +2431,7 @@ for (int CurRegEnc = FirstRegEnc - 1; CurRegEnc >= 0 && RegsNeeded; --CurRegEnc) { unsigned CurReg = RegClass->getRegister(CurRegEnc); - if (IsT1PushPop && CurReg > ARM::R7) + if (IsT1PushPop && CurRegEnc > TRI->getEncodingValue(ARM::R7)) continue; if (!IsPop) { // Pushing any register is completely harmless, mark the register involved Index: llvm/trunk/test/CodeGen/ARM/fold-stack-adjust.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/fold-stack-adjust.ll +++ llvm/trunk/test/CodeGen/ARM/fold-stack-adjust.ll @@ -42,6 +42,19 @@ ret void } +define i32 @check_simple_ret() minsize { +; CHECK-FNSTART-LABEL: check_simple_ret: +; CHECK: push {r5, r6, r7, lr} +; CHECK-NOT: sub sp, +; ... +; CHECK-NOT: add sp, +; CHECK: pop {r2, r3, r7, pc} + + %var = alloca i8, i32 8 + call void @bar(i8* %var) + ret i32 0 +} + define void @check_simple_too_big() minsize { ; CHECK-FNSTART-LABEL: check_simple_too_big: ; CHECK: push {r7, lr}