This is a low-level detail, subject to change when your build environment upgrades. As such, I would look to general principles instead of specific implementations. In this case, I would add a hypothesis to the general principles.
Hypothesis:
If the order of freeing memory makes a difference for performance, the build environment would prefer better performance for the general tendency of the language.
This is based on an assumption that the build environment values producing fast programs. Anyone who wants to dispute that should disregard this answer.
By "general tendency of the language", I am referring to the idea that the last thing constructed tends to be the first thing destroyed. For example, a derived class is constructed after its base is, but the derived class is destroyed before its base. Even within a class, members are destroyed in the reverse order of construction. Last constructed, first destroyed. If the members own dynamically allocated memory, then last allocated, first released (more or less).
This tendency does not guarantee that memory will be released in reverse order from acquisition. In fact, it's not hard to come up with counter-examples. However, it does mean that the reverse order seems more likely than any other order. There are very few guarantees when accounting for all the crazy things a programmer might do, but it seems reasonable to me that free would be optimized either in a symmetric manner (order does not matter) or geared towards this reverse order, if possible.
This is not a proof, nor is it an absolute rule. This is just playing the odds. If the above seems reasonable, I would suggest going with the tendency of the language initially. (Actually, I would suggest that memory be released in a destructor, which forces the order specified by the language.) If profiling indicates that this is a problem area, then more attention would be warranted. Until then, in the question's scenario, free(c) first to improve your odds.