INLINE[n]    becomes INLINEFROM[n]
NOINLINE[n]  becomes NOINLINEBEFORE[n]
INLINE[~n]   becomes INLINEBEFORE[n]
NOINLINE[~n] becomes NOINLINEFROM[n]


Still not great, because INLINE[n] doesn't inline before phase n either. Maybe we should make that explicit, and use 2 separate pragmas:

INLINE[n]    becomes NO_INLINE_BEFORE[n], INLINE_FROM[n]
NOINLINE[n]  becomes NO_INLINE_BEFORE[n]
INLINE[~n]   becomes NO_INLINE_FROM[n], INLINE_BEFORE[n]
NOINLINE[~n] becomes NO_INLINE_FROM[n]

(a combination of NO_INLINE_BEFORE[n] and INLINE_BEFORE[n], or NO_INLINE_FROM[n] and INLINE_FROM[n], would be an error)

If that is too verbose, we could make the 'no inline' part implicit:

INLINE[n]    becomes INLINE_FROM[n]
NOINLINE[n]  becomes 
INLINEABLE_FROM[n]
INLINE[~n]   becomes INLINE_BEFORE[n]
NOINLINE[~n] becomes INLINEABLE_BEFORE[n]