[Bug target/79173] add-with-carry and subtract-with-borrow support (x86_64 and others)
glisse at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Jan 21 08:41:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79173
--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> ---
We could start with the simpler:
void f(unsigned*__restrict__ r,unsigned*__restrict__ s,unsigned a,unsigned
b,unsigned c, unsigned d){
*r=a+b;
*s=c+d+(*r<a);
}
After combine, we have:
(insn 34 12 20 2 (set (reg:SI 93 [ _15+4 ])
(ltu:SI (reg:CCC 17 flags)
(const_int 0 [0]))) 608 {*setcc_si_1_movzbl}
(expr_list:REG_DEAD (reg:CCC 17 flags)
(nil)))
(insn 21 20 22 2 (parallel [
(set (reg:SI 102)
(plus:SI (reg:SI 37 r8 [ c ])
(reg:SI 38 r9 [ d ])))
(clobber (reg:CC 17 flags))
]) "a.c":3 213 {*addsi_1}
(expr_list:REG_DEAD (reg:SI 38 r9 [ d ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(expr_list:REG_DEAD (reg:SI 37 r8 [ c ])
(nil)))))
(insn 25 24 26 2 (parallel [
(set (reg:SI 105)
(plus:SI (reg:SI 102)
(reg:SI 93 [ _15+4 ])))
(clobber (reg:CC 17 flags))
]) "a.c":3 213 {*addsi_1}
(expr_list:REG_DEAD (reg:SI 93 [ _15+4 ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(expr_list:REG_DEAD (reg:SI 102)
(nil)))))
The combine dump says "Trying 21, 34 -> 25:" but the next line is blank and it
moves on to trying something else.
If I use parentheses *s=c+(d+(*r<a)); and disable reassoc, I get:
Trying 23, 24 -> 25:
Successfully matched this instruction:
(parallel [
(set (reg:SI 105)
(plus:SI (plus:SI (ltu:SI (reg:CCC 17 flags)
(const_int 0 [0]))
(reg:SI 37 r8 [ c ]))
(reg:SI 38 r9 [ d ])))
(clobber (reg:CC 17 flags))
])
Instruction not appropriate for target.
I don't know where that target restriction is coming from, but at least we seem
to be getting somewhere.
If I remove c and keep *s=d+(*r<a), I get
Failed to match this instruction:
(parallel [
(set (reg:SI 103)
(plus:SI (ltu:SI (reg:CCC 17 flags)
(const_int 0 [0]))
(reg:SI 38 r9 [ d ])))
(clobber (reg:CC 17 flags))
])
Failed to match this instruction:
(set (reg:SI 103)
(plus:SI (ltu:SI (reg:CCC 17 flags)
(const_int 0 [0]))
(reg:SI 38 r9 [ d ])))
we would probably need a special pattern for this case, virtually adding 0.
More information about the Gcc-bugs
mailing list