The line 126 of Source/Portable/IAR/MSP430X/portext.s43
is wrong in that, being it in ISR context, SR was already saved on the stack (after PC) and then modified by CPU (SR &= SCG0).
As a result of this, the line 102 of the same file
bic.w # 0xF0, 0 (sp)
has no effect, since it works on an fake status register.
Moreover vPortTickISR should never be called via a CALL, as at line 217 of port.c, where the return address for the restored task will be that of the RETI (line 218 of port.c).
Of course, the context switch neverthless does most of its job, as finally that RETI restore the SR and the PC of the task to be restored, but no changes were actually made to the SR (as intended by bic instruction above).
As a consequence a task that goes into LPM, remains there indefinitely. In particular, if LPM is invoked in the idle hook, as in line 616 of Demo/MSP430X_MSP430F5438_IAR/main.c, the idle task is blocked forever (which should never happen).
As a solution, I suggest to install directly vPortTickISR as the interrupt handler for the tick event and remove the line 126 of portext.s43
Let me know if I’m wrong or I’m missing anything.