I notice that the ULPI code in usblib is always compiled in to the firmware image, even if the external hardware is not present and therefore the code would be unused. This is because the only tests for ULPI are run-time conditionals, meaning that the linker must always bring in that code, taking up Flash space for a potentially unused feature.
In general, I have noticed that Texas Instruments' TivaWare libraries are very efficient about excluding code that will never be used. Typically, this seems to be handled by #define directives that are evaluated at compile time, rather than run-time. Another example is that the documentation shows how to write Host-only code with the USB0HostIntHandler() such that the compiler and linker will not bring in any unnecessary Device code. I'm merely pointing out that there might be an advantage to handling the optional ULPI support in a similar way to avoid wasting limited Flash space.
I found this oversight as I brought the usblib sources into revision control for my project. Rather than copy everything, I only copied the sources necessary to build my Host-only firmware. I noticed a couple of Device headers that are necessary, but they do not require the corresponding Device code. In contrast, not only are the ULPI headers needed, but the ULPI source must be compiled in as well. There's no way to avoid this without rewriting the usblib. I realize that this is a minor issue, but it might be worth the effort for Texas Instruments to improve the space efficiency here.