add_phi_arg (phi, m_data[save_data_cnt], edge_false,
UNKNOWN_LOCATION);
add_phi_arg (phi, ext, edge_true_true, UNKNOWN_LOCATION);
- g = gimple_build_assign (m_data[save_data_cnt + 1], t4);
- insert_before (g);
+ if (!save_cast_conditional)
+ {
+ g = gimple_build_assign (m_data[save_data_cnt + 1], t4);
+ insert_before (g);
+ }
+ else
+ for (basic_block bb = gsi_bb (m_gsi);;)
+ {
+ edge e1 = single_succ_edge (bb);
+ edge e2 = find_edge (e1->dest, m_bb), e3;
+ tree t5 = (e2 ? m_data[save_data_cnt + 1]
+ : make_ssa_name (m_limb_type));
+ phi = create_phi_node (t5, e1->dest);
+ edge_iterator ei;
+ FOR_EACH_EDGE (e3, ei, e1->dest->preds)
+ add_phi_arg (phi, (e3 == e1 ? t4
+ : build_zero_cst (m_limb_type)),
+ e3, UNKNOWN_LOCATION);
+ if (e2)
+ break;
+ t4 = t5;
+ bb = e1->dest;
+ }
}
if (m_bitfld_load)
{
m_data_cnt = tree_to_uhwi (m_data[save_data_cnt + 2]);
if (TYPE_UNSIGNED (rhs_type))
t = build_zero_cst (m_limb_type);
+ else if (m_bb)
+ t = m_data[save_data_cnt];
else
t = m_data[save_data_cnt + 1];
}
m_gsi = gsi_after_labels (edge_bb);
else
m_gsi = gsi_for_stmt (stmt);
+ m_bb = NULL;
}
}
}
NULL_TREE, NULL_TREE);
insert_before (g);
m_gsi = gsi_for_stmt (stmt);
+ m_bb = NULL;
}
}
}
extract_true_false_edges_from_block (gsi_bb (m_gsi),
&true_edge, &false_edge);
m_gsi = gsi_after_labels (false_edge->dest);
+ m_bb = NULL;
}
}
NULL_TREE, NULL_TREE);
insert_before (g);
m_gsi = gsi_for_stmt (final_stmt);
+ m_bb = NULL;
}
}
}
&true_edge,
&false_edge);
m_gsi = gsi_after_labels (false_edge->dest);
+ m_bb = NULL;
}
}
m_gsi = gsi_after_labels (edge_bb);
else
m_gsi = gsi_for_stmt (stmt);
+ m_bb = NULL;
}
}
}
extract_true_false_edges_from_block (gsi_bb (m_gsi),
&true_edge, &false_edge);
m_gsi = gsi_after_labels (false_edge->dest);
+ m_bb = NULL;
}
}
}
--- /dev/null
+/* PR tree-optimization/112941 */
+/* { dg-do compile { target bitint } } */
+/* { dg-options "-std=c23 -O2" } */
+
+#if __BITINT_MAXWIDTH__ >= 4096
+void
+f1 (_BitInt(4096) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] += (unsigned _BitInt(2048)) r;
+ p[1] += (unsigned _BitInt(2048)) s;
+ p[2] += (unsigned _BitInt(2048)) t;
+ p[3] += (unsigned _BitInt(2048)) u;
+}
+
+void
+f2 (_BitInt(4094) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] -= (unsigned _BitInt(2048)) r;
+ p[1] -= (unsigned _BitInt(2048)) s;
+ p[2] -= (unsigned _BitInt(2048)) t;
+ p[3] -= (unsigned _BitInt(2048)) u;
+}
+
+void
+f3 (_BitInt(4096) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] += (unsigned _BitInt(2110)) r;
+ p[1] += (unsigned _BitInt(2110)) s;
+ p[2] += (unsigned _BitInt(2110)) t;
+ p[3] += (unsigned _BitInt(2110)) u;
+}
+
+void
+f4 (_BitInt(4094) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] -= (unsigned _BitInt(2110)) r;
+ p[1] -= (unsigned _BitInt(2110)) s;
+ p[2] -= (unsigned _BitInt(2110)) t;
+ p[3] -= (unsigned _BitInt(2110)) u;
+}
+
+void
+f5 (unsigned _BitInt(4096) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] += (unsigned _BitInt(2048)) r;
+ p[1] += (unsigned _BitInt(2048)) s;
+ p[2] += (unsigned _BitInt(2048)) t;
+ p[3] += (unsigned _BitInt(2048)) u;
+}
+
+void
+f6 (unsigned _BitInt(4094) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] -= (unsigned _BitInt(2048)) r;
+ p[1] -= (unsigned _BitInt(2048)) s;
+ p[2] -= (unsigned _BitInt(2048)) t;
+ p[3] -= (unsigned _BitInt(2048)) u;
+}
+
+void
+f7 (unsigned _BitInt(4096) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] += (unsigned _BitInt(2110)) r;
+ p[1] += (unsigned _BitInt(2110)) s;
+ p[2] += (unsigned _BitInt(2110)) t;
+ p[3] += (unsigned _BitInt(2110)) u;
+}
+
+void
+f8 (unsigned _BitInt(4094) *p, int r, _BitInt(115) s, _BitInt(128) t, _BitInt(231) u)
+{
+ p[0] -= (unsigned _BitInt(2110)) r;
+ p[1] -= (unsigned _BitInt(2110)) s;
+ p[2] -= (unsigned _BitInt(2110)) t;
+ p[3] -= (unsigned _BitInt(2110)) u;
+}
+
+#if __SIZEOF_INT128__
+void
+f9 (_BitInt(4096) *p, __int128 r)
+{
+ p[0] += (unsigned _BitInt(2048)) r;
+}
+
+void
+f10 (_BitInt(4094) *p, __int128 r)
+{
+ p[0] -= (unsigned _BitInt(2048)) r;
+}
+
+void
+f11 (_BitInt(4096) *p, __int128 r)
+{
+ p[0] += (unsigned _BitInt(2110)) r;
+}
+
+void
+f12 (_BitInt(4094) *p, __int128 r)
+{
+ p[0] -= (unsigned _BitInt(2110)) r;
+}
+
+void
+f13 (unsigned _BitInt(4096) *p, __int128 r)
+{
+ p[0] += (unsigned _BitInt(2048)) r;
+}
+
+void
+f14 (unsigned _BitInt(4094) *p, __int128 r)
+{
+ p[0] -= (unsigned _BitInt(2048)) r;
+}
+
+void
+f15 (unsigned _BitInt(4096) *p, __int128 r)
+{
+ p[0] += (unsigned _BitInt(2110)) r;
+}
+
+void
+f16 (unsigned _BitInt(4094) *p, __int128 r)
+{
+ p[0] -= (unsigned _BitInt(2110)) r;
+}
+#endif
+#else
+int i;
+#endif