Оба. Если вы строите в режиме релиза, какой бы компилятор вы не использовали, он применяет некоторую оптимизацию к коду, прежде чем перейти в CIL. JITter также имеет оптимизации.
Примером оптимизации, обычно выполняемой компилятором, является постоянное свертывание.
Примером оптимизации, обычно выполняемой на уровне JIT, является развертывание цикла.