|| TREE_CODE (expr) == IMAGPART_EXPR
|| TREE_CODE (expr) == REALPART_EXPR)
{
+ /* For a BIT_FIELD_REF do not bother to VIEW_CONVERT the base,
+ instead reference the replacement directly. */
+ convert = TREE_CODE (expr) != BIT_FIELD_REF;
expr_p = &TREE_OPERAND (expr, 0);
expr = *expr_p;
- convert = true;
}
ipa_param_body_replacement *pbr = get_expr_replacement (expr, false);
gcc_checking_assert (tree_to_shwi (TYPE_SIZE (TREE_TYPE (expr)))
== tree_to_shwi (TYPE_SIZE (TREE_TYPE (repl))));
tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (expr), repl);
- if (is_gimple_reg (repl))
+ if (is_gimple_reg (repl)
+ && is_gimple_reg_type (TREE_TYPE (expr)))
{
gcc_assert (extra_stmts);
vce = force_gimple_operand (vce, extra_stmts, true, NULL_TREE);
--- /dev/null
+/* { dg-do compile } */
+
+typedef int UInt;
+UInt skeletal_RI5_instr;
+__attribute__((__noreturn__)) void vex_assert_fail();
+typedef struct {
+ union {
+ struct {
+ UInt imm5;
+ } I5;
+ } ARMri5;
+} ARMRI5;
+typedef enum { ARMin_Alu, ARMin_Shift } ARMInstrTag;
+void iregEnc();
+static UInt skeletal_RI5(ARMRI5 *ri) {
+ UInt imm5 = ri->ARMri5.I5.imm5;
+ __builtin_expect(imm5, 1) ?: vex_assert_fail();
+ iregEnc(ri->ARMri5);
+ return skeletal_RI5_instr;
+}
+ARMInstrTag emit_ARMInstr_i_0;
+void *emit_ARMInstr_disp_cp_chain_me_to_slowEP() {
+ switch (emit_ARMInstr_i_0) {
+ case ARMin_Alu:
+ UInt instr, subopc;
+ UInt rD, rN;
+ goto bad;
+ instr |= subopc | rN;
+ case ARMin_Shift:
+ rD = 0;
+ UInt rM = 0;
+ ARMRI5 argR;
+ instr = skeletal_RI5(&argR);
+ instr |= rD | rM;
+ goto done;
+ }
+bad:
+done:
+ return 0;
+}