@lazi
Better code generation as LiveForIt said and more useful warnings.
Newer gcc versions can analyse code to tell if for instance a variable can actually be used uninitialised or not whereas gcc 4.2.4 often gives false positives.
To give an example a code like this produces a warning in gcc 4.2.4 but not in gcc 4.9.2:
int y;
if (x == 0)
y = 42;
if (x == 0)
do_something(y);
Because do_something() is only called if x is 0 (which is also the condition for setting y) the variable y is in fact never used uninitialised but gcc 4.2.4 does not see this.
The example may seem a little artificial but I run into this kind of situation often enough for it to be annoying when switching between gcc 4.9.2 (cross-compiler) and 4.2.4 (native).