Raeburn@ATHENA.MIT.EDU (Ken Raeburn) (03/01/90)
(This is a really minor one....)
(1.37; vax; -O -fcombine-regs -fstrength-reduce -fforce-mem)
Source file:
int foo (int ii) {
int i = ii;
if (i == 2) {
i = 2;
}
return i;
}
(Granted, the source file is silly; but I've seen similar code using
enumerated values or preprocessor macros with conceptually different
-- but numerically identical -- values.)
Assembly code:
#NO_APP
gcc_compiled.:
.text
.align 1
.globl _foo
_foo:
.word 0x0
movl 4(ap),r0
cmpl r0,$2
jneq L1
movl $2,r0 # r0 is already 2
L1:
ret
According to the texinfo file, the REG_EQUAL notes are used only for
the insns that set registers, so I'm not sure how it would be tagged,
but the known value of i should be recognized inside the `then'
branch, and the assignment suppressed.
Similar results are obtained by making the comparison "!=" (in which
case it is the comparison and references to `i' and `ii' that are
superfluous, since 2 is always returned), but I expect that is
somewhat harder to optimize.