+
+ if (get_opt_auto_create_sync()) {
+ /* handle non-volatile Load nodes by automatically creating Sync's */
+ load = skip_Proj(store);
+ if (is_Load(load) && get_Load_volatility(load) == volatility_non_volatile) {
+ pred = get_Load_mem(load);
+
+ if (is_Sync(pred)) {
+ /* a Load after a Sync: move it up */
+ ir_node *mem = skip_Proj(get_Sync_pred(pred, 0));
+
+ set_Load_mem(load, get_memop_mem(mem));
+ add_Sync_pred(pred, store);
+ store = pred;
+ }
+ else {
+ pload = skip_Proj(pred);
+ if (is_Load(pload) && get_Load_volatility(pload) == volatility_non_volatile) {
+ /* a Load after a Load: create a new Sync */
+ set_Load_mem(load, get_Load_mem(pload));
+
+ in[0] = pred;
+ in[1] = store;
+ store = new_Sync(2, in);
+ }
+ }
+ }
+ }