bool indirect)
{
int index = SSA_NAME_VERSION (name);
-
- /* If value is not returned at all, do nothing. */
- if (!direct && !indirect)
- return;
+ bool returned_directly = false;
/* If there is no return value, no flags are affected. */
if (!gimple_call_lhs (call))
if (arg >= 0)
{
int flags = gimple_call_return_flags (call);
- if ((flags & ERF_RETURNS_ARG)
- && (flags & ERF_RETURN_ARG_MASK) != arg)
- return;
+ if (flags & ERF_RETURNS_ARG)
+ {
+ if ((flags & ERF_RETURN_ARG_MASK) == arg)
+ returned_directly = true;
+ else
+ return;
+ }
+ }
+ /* Make ERF_RETURNS_ARG overwrite EAF_UNUSED. */
+ if (returned_directly)
+ {
+ direct = true;
+ indirect = false;
}
+ /* If value is not returned at all, do nothing. */
+ else if (!direct && !indirect)
+ return;
/* If return value is SSA name determine its flags. */
if (TREE_CODE (gimple_call_lhs (call)) == SSA_NAME)
if (gimple_call_arg (call, i) == name)
{
int call_flags = gimple_call_arg_flags (call, i);
- if (!ignore_retval && !(call_flags & EAF_UNUSED))
+ if (!ignore_retval)
merge_call_lhs_flags
(call, i, name,
- !(call_flags & EAF_NOT_RETURNED_DIRECTLY),
- !(call_flags & EAF_NOT_RETURNED_INDIRECTLY));
+ !(call_flags & (EAF_NOT_RETURNED_DIRECTLY
+ | EAF_UNUSED)),
+ !(call_flags & (EAF_NOT_RETURNED_INDIRECTLY
+ | EAF_UNUSED)));
if (!(ecf_flags & (ECF_CONST | ECF_NOVOPS)))
{
call_flags = callee_to_caller_flags
--- /dev/null
+// { dg-do run }
+/* { dg-additional-options "-std=c++14" } */
+ typedef unsigned int u32;
+ typedef unsigned char u8;
+
+ static u32 pu8to32(const u8 * p8) __attribute__((noinline));
+ static u32 pu8to32(const u8 * p8) {
+ u32 v;
+
+ __builtin_memcpy(&v, __builtin_assume_aligned(p8, 1), sizeof(u32));
+
+ return v;
+ }
+
+ int main(void) {
+ // dse1 throws this store away
+ u8 d[sizeof(u32)] = {
+ 0x07, 0x00, 0x00, 0x07,
+ };
+
+ if (pu8to32(d) != 0x07000007)
+ __builtin_trap();
+ }