On 26 March 2014 15:45, Jakub Jelinek <ja...@redhat.com> wrote: > On Wed, Mar 26, 2014 at 03:30:44PM +0800, Zhenqiang Chen wrote: >> Agree. CSE should never modify asm insns to drop some of the outputs. > > So the right fix is top prevent this from happening, not papering over about > it. >> >> But in this case, CSE does not drop any of the outputs. It just takes >> the SRC of a set and replace the reference of the set. And the >> instruction validation tells CSE that it is legal instruction after >> replacement. (The original correct asm insn is optimized away after >> this replacement) >> >> I think it is common for most rtl-optimizations to do such kind of >> validation. So to avoid such kind of bug, check_asm_operands must tell >> the optimizer the asm is illegal. > > As it is wrong if CSE does that even with asm ("" : "=r" (i), "=r" (j));, > your patch is not the right place to fix this. CSE just must check where > the ASM_OPERANDS is coming from and if it comes from a PARALLEL with > multiple outputs, either give up or duplicate all outputs (if it makes sense > at all). Or just don't enter into the hash tables ASM_OPERANDS with > multiple outputs.
Thanks for the comments. I will rework the patch to check it in CSE. -Zhenqiang > Jakub