It is, but there are limits to what it can do.
D's contracts potentially offer a lot of information that the optimiser wouldn't naturally have (any function receiving blind arguments can't make any assumptions without a contract present), but more from a usability/safety point of view, I really hate casting when the compiler should know the assignment is safe.
It's not only an inconvenience, it's also a safety thing.
Consider:
I have an int that I assign to a byte, I know the value fits in a byte, but I'm forced to type the manual cast anyway.
Once that cast is written, if the valid range of my int happens to change in outer code, I will not receive an error informing me that the new range doesn't fit within a byte anymore, it'll just truncate it anyway, since a blind cast is already there in the code.
It would be much better for the compiler to start complaining that it can no longer assure that the int fits into the byte. With the cast present, my bug has been hidden until I eventually crash.