return false;
}
+/* Return true if OP isn't a memory operand with SYMBOLIC_CONST and
+ needs alignment > ALIGNMENT. */
+
+static bool
+ix86_need_alignment_p_2 (const_rtx op, unsigned int alignment)
+{
+ bool need_alignment = MEM_ALIGN (op) > alignment;
+ tree mem_expr = MEM_EXPR (op);
+ if (!mem_expr)
+ return need_alignment;
+
+ tree var = get_base_address (mem_expr);
+ if (!VAR_P (var) || !DECL_RTL_SET_P (var))
+ return need_alignment;
+
+ rtx x = DECL_RTL (var);
+ if (!MEM_P (x))
+ return need_alignment;
+
+ x = XEXP (x, 0);
+ return !SYMBOLIC_CONST (x) && need_alignment;
+}
+
/* Return true if SET needs alignment > ALIGNMENT. */
static bool
rtx dest = SET_DEST (set);
if (MEM_P (dest))
- return MEM_ALIGN (dest) > alignment;
+ return ix86_need_alignment_p_2 (dest, alignment);
const_rtx src = SET_SRC (set);
auto op = *iter;
if (MEM_P (op))
- return MEM_ALIGN (op) > alignment;
+ return ix86_need_alignment_p_2 (op, alignment);
}
return false;
bitmap_set_bit (worklist, HARD_FRAME_POINTER_REGNUM);
}
+ /* Registers on HARD_STACK_SLOT_ACCESS always access stack. */
+ HARD_REG_SET hard_stack_slot_access = stack_slot_access;
+
calculate_dominance_info (CDI_DOMINATORS);
unsigned int regno;
/* Call ix86_access_stack_p only if INSN needs alignment >
STACK_ALIGNMENT. */
if (ix86_need_alignment_p (insn, stack_alignment)
- && ix86_access_stack_p (regno, BLOCK_FOR_INSN (insn),
- set_up_by_prologue, prologue_used,
- reg_dominate_bbs_known,
- reg_dominate_bbs))
+ && (TEST_HARD_REG_BIT (hard_stack_slot_access, regno)
+ || ix86_access_stack_p (regno, BLOCK_FOR_INSN (insn),
+ set_up_by_prologue,
+ prologue_used,
+ reg_dominate_bbs_known,
+ reg_dominate_bbs)))
{
/* Update stack alignment if REGNO is used for stack
access. */
--- /dev/null
+/* { dg-do run { target avx_runtime } } */
+/* { dg-options "-fhardened -O3 -mavx" } */
+
+struct a {
+ unsigned long long b;
+ unsigned long long c;
+ int d;
+ char e;
+ int f;
+} g;
+int h = 1, i, j;
+long long k, l, n;
+int m[1]={};
+short o;
+static inline short p(short q, short r) { return q + r; }
+int main() {
+ for (; h < 3; h = p(h, 1))
+ if (h) {
+ k |= 4;
+ struct a s = {8, 2, 2, 4, 15};
+ for (int n = 0; n != 54; n++)
+ if (m[l])
+ if (i)
+ o = 0;
+ g = s;
+ j &= 4073709551610LL;
+ }
+ return 0;
+}