I forgot that you only get a warning when the synthesizer optimizes a signal away because it doesn't drive any signal. In the other cases, signals can be optimized away without warning. For example:
a<= b and c;
b <= d and e;
In this case (provided b isn't used somewhere else) the simulator will generate the a signal using a single LUT and the c,d and e signals. b will be optimized away. If you want to read it from Signaltap you will need to put a "preserve" attribute on the signal to prevent if from going away (IIRC connecting it to Signaltap in pre-synthesis isn't enough).