This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] Disable if_conversion2 for Og
- From: "Joey Ye" <joey dot ye at arm dot com>
- To: <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 15 Apr 2014 09:59:52 +0800
- Subject: [patch] Disable if_conversion2 for Og
- Authentication-results: sourceware.org; auth=none
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;
}
$ 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 },