Bug 67242 - Missing optimization with float IV in SCEV-CCP
Summary: Missing optimization with float IV in SCEV-CCP
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 4.9.3
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: missed-optimization
Depends on:
Blocks:
 
Reported: 2015-08-16 20:12 UTC by Frank
Modified: 2021-12-15 21:56 UTC (History)
0 users

See Also:
Host:
Target: x86, arm
Build:
Known to work:
Known to fail: 5.2.0
Last reconfirmed: 2015-08-17 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Frank 2015-08-16 20:12:52 UTC
testcase:

int n, dummy;
float dummyfloat;

void bug(void) 
{
 for(n=0; n<1000; n++)
    dummy = n;
 for(n=0; n<1000; n++)
    dummyfloat = n;
}

the first loop (dummy=) is optimized away with -O2 and -O3
the second (dummyfloat=) NOT.

Tested with 4.9.2 & 4.9.3, targets x86-64, arm-thumb and arm.

commandline: gcc -O2 bug.c -S
Comment 1 Frank 2015-08-16 20:13:55 UTC
works ok with local variables.
Comment 2 Frank 2015-08-16 20:28:30 UTC
x86-64:



	.file	"bug.c"
	.section	.text.unlikely,"x"
.LCOLDB0:
	.text
.LHOTB0:
	.p2align 4,,15
	.globl	bug
	.def	bug;	.scl	2;	.type	32;	.endef
	.seh_proc	bug
bug:
	.seh_endprologue
	movl	$999, dummy(%rip)
	xorl	%eax, %eax
	.p2align 4,,10
.L2:
	pxor	%xmm0, %xmm0
	cvtsi2ss	%eax, %xmm0
	addl	$1, %eax
	cmpl	$1000, %eax
	jne	.L2
	movss	%xmm0, dummyfloat(%rip)
	movl	$1000, n(%rip)
	ret
	.seh_endproc
	.section	.text.unlikely,"x"
.LCOLDE0:
	.text
.LHOTE0:
	.comm	dummyfloat, 4, 2
	.comm	dummy, 4, 2
	.comm	n, 4, 2
	.ident	"GCC: (tdm64-1) 4.9.2"







arm-thumb, soft float:
	.cpu arm7tdmi
	.fpu softvfp
	.eabi_attribute 20, 1
	.eabi_attribute 21, 1
	.eabi_attribute 23, 3
	.eabi_attribute 24, 1
	.eabi_attribute 25, 1
	.eabi_attribute 26, 1
	.eabi_attribute 30, 2
	.eabi_attribute 34, 0
	.eabi_attribute 18, 4
	.code	16
	.file	"bug.c"
	.global	__aeabi_i2f
	.text
	.align	2
	.global	bug
	.code	16
	.thumb_func
	.type	bug, %function
bug:
	push	{r3, r4, r5, lr}
	mov	r5, #250
	mov	r4, #0
	ldr	r2, .L5
	ldr	r3, .L5+4
	str	r2, [r3]
	lsl	r5, r5, #2
.L2:
	mov	r0, r4
	add	r4, r4, #1
	bl	__aeabi_i2f
	cmp	r4, r5
	bne	.L2
	ldr	r3, .L5+8
	str	r0, [r3]
	ldr	r3, .L5+12
	@ sp needed
	str	r4, [r3]
	pop	{r3, r4, r5}
	pop	{r0}
	bx	r0
.L6:
	.align	2
.L5:
	.word	999
	.word	dummy
	.word	dummyfloat
	.word	n
	.size	bug, .-bug
	.comm	dummyfloat,4,4
	.comm	dummy,4,4
	.comm	n,4,4
	.ident	"GCC: (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 (release) [ARM/embedded-4_9-branch revision 224288]"
Comment 3 Richard Biener 2015-08-17 07:24:08 UTC
Confirmed.  This is SCEV-const-prop not handling floats (obviously).  The trick
could be to handle this kind of DEFs of loop-closed PHI uses specially
(use the evolution of the source).
Comment 4 Andrew Pinski 2016-09-11 20:25:28 UTC
There might be a dup of this one already.