Компилятор не может сказать, хорошая ли это идея.
Во-первых, конечно, компилятор должен быть в состоянии доказать, что это будет безопасная оптимизация: что функции могут безопасно выполняться параллельно. В общем, это NP-полная проблема, но во многих простых случаях компилятор может это выяснить (он уже много анализирует зависимости).
Некоторые большие проблемы:
- может оказаться медленнее. Создание потоков - довольно дорогая операция. Стоимость этого может просто перевесить выигрыш от распараллеливания кода.
- он должен хорошо работать независимо от количества ядер процессора. Компилятор не знает, сколько ядер будет доступно при запуске программы. Поэтому нужно было бы вставить какой-нибудь необязательный код разветвления. Если ядро доступно, следуйте по этому пути кода и разветвитесь в отдельный поток, в противном случае следуйте этому другому пути кода. И снова, больше кода и больше условий также влияет на производительность. Будет ли результат того стоить? Возможно, но как компилятор должен это знать?
- это может быть не то, что ожидает программист. Что, если я уже создаю ровно два процессора с большой нагрузкой на двухъядерную систему? Я ожидаю, что они оба будут работать в 99% случаев. Внезапно компилятор решает создать больше потоков под капотом, и внезапно у меня появляется три загруженных процессором потока, что означает, что у меня меньше времени выполнения, чем я ожидал.
- Сколько раз он должен это делать? Если вы запускаете код в цикле, должен ли он создавать новый поток в каждой итерации? Рано или поздно добавленное использование памяти начинает болеть.
В целом, это просто не стоит. Есть слишком много случаев, когда это может иметь неприятные последствия. Добавим к тому, что компилятор может безопасно применять оптимизацию только в довольно простых случаях, во-первых, это не стоит беспокоиться.