On Fri, 25 Feb 2022, Jakub Jelinek wrote: > Hi! > > The following testcase is miscompiled on ia32 at -O2, because > when expand_SPACESHIP is called, we have pending stack adjustment > from the foo call right before it. > Now, ix86_expand_fp_spaceship uses emit_jump_insn several times > but then emit_jump also several times. While emit_jump_insn doesn't > do do_pending_stack_adjust (), emit_jump does, so we end up with: > ... > 8: call [`_Z3foodl'] argc:0x10 > REG_CALL_DECL `_Z3foodl' > 9: r88:DF=[`a'] > 10: r89:HI=unspec[cmp(r88:DF,0.0)] 25 > 11: flags:CC=unspec[r89:HI] 26 > 12: pc={(unordered(flags:CCFP,0))?L27:pc} > REG_BR_PROB 536868 > 66: NOTE_INSN_BASIC_BLOCK 4 > 13: pc={(uneq(flags:CCFP,0))?L19:pc} > REG_BR_PROB 214748364 > 67: NOTE_INSN_BASIC_BLOCK 5 > 14: pc={(flags:CCFP>0)?L23:pc} > REG_BR_PROB 536870916 > 68: NOTE_INSN_BASIC_BLOCK 6 > 15: r86:SI=0xffffffffffffffff > 16: {sp:SI=sp:SI+0x10;clobber flags:CC;} > REG_ARGS_SIZE 0 > 17: pc=L29 > 18: barrier > 19: L19: > 69: NOTE_INSN_BASIC_BLOCK 7 > ... > The sp += 16 pending stuck adjust was emitted in the middle of the > sequence and is effective only for the single case of the 4 possibilities > where .SPACESHIP returns -1, in all other cases the stack isn't adjusted > and so we ICE during dwarf2cfi. > > Now, we could either call do_pending_stack_adjust in > ix86_expand_fp_spaceship, or use there calls that actually don't call > do_pending_stack_adjust (but having the stack adjustment across branches is > generally undesirable), or we can call it in expand_SPACESHIP for all > targets (note, just i386 currently implements it). > I chose the generic code because e.g. expand_{addsub,neg,mul}_overflow > in the same file also call do_pending_stack_adjust in internal-fn.cc for the > same reasons, that it is expected that most if not all targets will expand > those through jumps and we don't want all of the targets to need to deal > with that. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. > Or do you prefer it in ix86_expand_fp_spaceship instead? No, as you say others will likely repeat the mistake otherwise. Richard. > 2022-02-24 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/104679 > * internal-fn.cc (expand_SPACESHIP): Call do_pending_stack_adjust. > > * g++.dg/torture/pr104679.C: New test. > > --- gcc/internal-fn.cc.jj 2022-02-11 13:51:07.757597854 +0100 > +++ gcc/internal-fn.cc 2022-02-24 17:46:01.476722703 +0100 > @@ -4437,6 +4437,8 @@ expand_SPACESHIP (internal_fn, gcall *st > tree rhs2 = gimple_call_arg (stmt, 1); > tree type = TREE_TYPE (rhs1); > > + do_pending_stack_adjust (); > + > rtx target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE); > rtx op1 = expand_normal (rhs1); > rtx op2 = expand_normal (rhs2); > --- gcc/testsuite/g++.dg/torture/pr104679.C.jj 2022-02-24 > 17:48:08.309959261 +0100 > +++ gcc/testsuite/g++.dg/torture/pr104679.C 2022-02-24 17:48:00.226071655 > +0100 > @@ -0,0 +1,22 @@ > +// PR middle-end/104679 > +// { dg-do compile } > + > +struct A { ~A (); }; > +void foo (double, long); > +void bar (); > +double a; > +long b; > + > +void > +baz () > +{ > + foo (a, b); > + if (a == 0.0) > + ; > + else > + while (a > 0.0) > + { > + A c; > + bar (); > + } > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)