- if (get_Store_volatility(pred) != volatility_is_volatile && !pred_info->projs[pn_Store_X_except]) {
- DBG_OPT_WAW(pred, store);
- exchange(pred_info->projs[pn_Store_M], get_Store_mem(pred));
- kill_node(pred);
- reduce_adr_usage(ptr);
- return DF_CHANGED;
+ if (get_Store_volatility(pred) != volatility_is_volatile
+ && !pred_info->projs[pn_Store_X_except]) {
+ ir_node *predvalue = get_Store_value(pred);
+ ir_mode *predmode = get_irn_mode(predvalue);
+
+ if(is_completely_overwritten(predmode, mode)
+ || is_partially_same(predvalue, value)) {
+ DBG_OPT_WAW(pred, store);
+ exchange(pred_info->projs[pn_Store_M], get_Store_mem(pred));
+ kill_node(pred);
+ reduce_adr_usage(ptr);
+ return DF_CHANGED;
+ }
+ }
+
+ /*
+ * We may remove the Store, if the old value already contains
+ * the new value, and if it does not have an exception handler.
+ *
+ * TODO: What, if both have the same exception handler ???
+ */
+ if (get_Store_volatility(store) != volatility_is_volatile
+ && !info->projs[pn_Store_X_except]) {
+ ir_node *predvalue = get_Store_value(pred);
+
+ if(is_partially_same(value, predvalue)) {
+ DBG_OPT_WAW(pred, store);
+ exchange(info->projs[pn_Store_M], mem);
+ kill_node(store);
+ reduce_adr_usage(ptr);
+ return DF_CHANGED;
+ }