Sorry, you are correct. That line is the : gcc_assert (outermode != VOIDmode); of the simplify_subreg function.
However, I've played around with it and saw that I made a mistake when writing up this question, I simplified what I had put in my MD file, and actually made a mistake. I apologize. If I replace this : (define_insn "extzv" [(set (match_operand 0 "register_operand" "") (zero_extract (match_operand 1 "register_operand" "") (match_operand 2 "const_int_operand" "") (match_operand 3 "const_int_operand" "")))] "" "") into : (define_expand "extzv" [(set (match_operand 0 "register_operand" "") (zero_extract (match_operand 1 "register_operand" "") (match_operand 2 "const_int_operand" "") (match_operand 3 "const_int_operand" "")))] "" "") I do not get any errors. I don't know if it's handled but it seems to no longer have issues anymore. However, if I consider this code: typedef struct stest { uint64_t a:1; uint64_t b:1; }STest; void goo (STest *t, uint64_t *a, uint64_t *b) { *a = t->a; } At the expand phase, I see: (insn 9 8 10 3 struct4.c:24 (set (subreg:DI (reg:QI 76) 0) (zero_extract:DI (reg:DI 75) (const_int 1 [0x1]) (const_int 0 [0x0]))) -1 (nil)) (insn 10 9 11 3 struct4.c:24 (set (reg:DI 77) (zero_extend:DI (reg:QI 76))) -1 (nil)) Is there anything I can do to remove that zero_extend? Thanks, Jc