https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124209
--- Comment #2 from Uroš Bizjak <ubizjak at gmail dot com> ---
The following patch:
--cut here--
diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc
index 245ba357b5e..2d1f27d3e32 100644
--- a/gcc/cfgexpand.cc
+++ b/gcc/cfgexpand.cc
@@ -3672,8 +3672,10 @@ expand_asm_stmt (gasm *stmt)
generating_concat_p = 0;
gcc_assert (TREE_CODE (val) != INDIRECT_REF);
- if (((TREE_CODE (val) == MEM_REF
- && TREE_CODE (TREE_OPERAND (val, 0)) != ADDR_EXPR)
+ if ((((TREE_CODE (val) == MEM_REF
+ && TREE_CODE (TREE_OPERAND (val, 0)) != ADDR_EXPR)
+ || (TREE_CODE (val) == COMPONENT_REF
+ && ! DECL_BIT_FIELD (TREE_OPERAND (val, 1))))
&& allows_mem)
|| (DECL_P (val)
&& (allows_mem || REG_P (DECL_RTL (val)))
--cut here--
results in:
foo:
movw %fs,m+2(%rip)
ret