Now the compiler too often generates suboptimal code because it has to take edge cases that it doesn't know don't matter here into account.
And then you have only those limited not actually well specified operators of C (something as simple as "+" is not fully specified on signed integers), so you can tell even less well what you actually want to the compiler... You can't even do a simple overflow check without bordering on undefined behaviour that allows compilers to do whatever they want.
If you could tell better what you want, the compiler could better choose the perfect CPU instructions for it.
So imho, a programmer shouldn't choose the CPU instruction as that doesn't allow portability, but the programmer should have the ability to specify things better than C now allows :)