On 15/04/14 02:59, Joey Ye wrote: > If-converstion is harmful to optimized debugging as it generates conditional > execution instructions with line number information, which resulted in a > dillusion to developers that both then-else branches are executed. > > For example: > test.c: > 1: unsigned oldest_sequence; > 2: > 3: unsigned foo(unsigned seq_number) > 4: { > 5: if ((seq_number + 5) < 10) > 6: seq_number += 100; > 7: else > 8: seq_number = oldest_sequence; > > if (seq_number < oldest_sequence) > seq_number = oldest_sequence; > > return seq_number; > }
Arguably, this is a bug in gdb. The debugger should understand when a breakpointed conditional instruction is not going to execute and silently continue. That preserves the illusion of not executing the code without requiring the compiler to de-optimize things. R. > > $ arm-none-eabi-gcc -mthumb -mcpu=cortex-m3 -Og -g3 > gets: > .loc 1 5 0 > adds r3, r0, #5 > cmp r3, #9 > .loc 1 6 0 <----- line 6, then branch > itee ls > addls r0, r0, #100 > .LVL1: > .loc 1 8 0 <----- line 8, else branch. Both branches seems to > be executed in GDB > ldrhi r3, .L5 > ldrhi r0, [r3] > > The reason is that if_conversion2 is still enabled in Og. The patch simply > disables it for Og. > > Tests: > * -Og bootstrap passed. > * Make check default (no additional option): No regression. > * Make check with -Og: expected regressions. Cases relying on if-conversion2 > failed. >> FAIL: gcc.target/arm/its.c scan-assembler-times \\tit 2 >> FAIL: gcc.target/arm/pr40956.c scan-assembler-times mov[\\\\t ]*r., #0 1 >> FAIL: gcc.target/arm/thumb-ifcvt-2.c scan-assembler asreq >> FAIL: gcc.target/arm/thumb-ifcvt-2.c scan-assembler lslne >> FAIL: gcc.target/arm/thumb-ifcvt.c scan-assembler asrne >> FAIL: gcc.target/arm/thumb-ifcvt.c scan-assembler lslne > > OK to trunk and 4.8/4.9 branch? > > ChangeLog: > * opts.c (OPT_fif_conversion2): Disable for Og. > > diff --git a/gcc/opts.c b/gcc/opts.c > index fdc903f..e076253 100644 > --- a/gcc/opts.c > +++ b/gcc/opts.c > @@ -432,7 +432,7 @@ static const struct default_options > default_options_table[] = > { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 }, > { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 }, > { OPT_LEVELS_1_PLUS, OPT_fif_conversion, NULL, 1 }, > - { OPT_LEVELS_1_PLUS, OPT_fif_conversion2, NULL, 1 }, > + { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 }, > { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 }, > { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 }, > { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 }, > > >