Wouldn’t it make more sense to start your two workflows from the parse tree instead of the preprocessed file?
No, both Clang and Flang start with separate preprocessing for OpenMP offloading. We do it to handle code which depends on target specific preprocessor directives. For example:
#ifdef __SSE2
const int VF = 4
#else
const int VF = 1
endif
You can find detailed explanation here.