Это может быть и другое. Это зависит от того, насколько навязчивым является компилятор, имеет ли он доступ к реализации функции и может правильно ее оценить. Нет правила, определяющего, каким оно должно быть, при условии, что наблюдаемое поведение одинаково.
Например, я получил следующее:
#define X 1
#define Y 2
int foo(int x, int y)
{
return x + y;
}
int main(int argc, char* argv[])
{
cout << foo(X,Y);
00BE1000 mov ecx,dword ptr [__imp_std::cout (0BE203Ch)]
00BE1006 push 3
00BE1008 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0BE2038h)]
}
Функция, как видите, даже не вызывается. Так что вполне возможно, что звонок исключен навсегда.