Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dead Code Elimination Regression at -Os (trunk vs. 13.0.0) #52965

Open
Quarub opened this issue Jan 3, 2022 · 0 comments
Open

Dead Code Elimination Regression at -Os (trunk vs. 13.0.0) #52965

Quarub opened this issue Jan 3, 2022 · 0 comments

Comments

@Quarub
Copy link
Contributor

Quarub commented Jan 3, 2022

cat case.c

char b;
static int c = 1, e, f = 7, g;
short h, i;
void foo(void);
char(a)(char j, char k) { return k == 0 ? j : j / k; }
void(d)();
int main() {
  c = a(0, 0);
  for (; h < 1; ++h) {
    f = 8 <= e;
    g = i = c;
    if (c) {
      b = e = f |= b;
      f &= d && g;
    }
    if (!a(1, f))
      foo();
  }
}

clang-550ea385abc2805fd3e0a539bf55bc82edb5c13e (trunk) -Os can not eliminate foo but clang-llvmorg-13.0.0 -Os can.

clang-550ea385abc2805fd3e0a539bf55bc82edb5c13e (trunk) -Os -S -o /dev/stdout case.c

Output

	.text
	.file	"case.c"
	.globl	a                               # -- Begin function a
	.type	a,@function
a:                                      # @a
	.cfi_startproc
# %bb.0:
	movl	%edi, %eax
	testb	%sil, %sil
	je	.LBB0_2
# %bb.1:
	movsbl	%al, %eax
	movsbl	%sil, %ecx
                                        # kill: def $ax killed $ax killed $eax
	cwtd
	idivw	%cx
                                        # kill: def $ax killed $ax def $eax
.LBB0_2:
                                        # kill: def $al killed $al killed $eax
	retq
.Lfunc_end0:
	.size	a, .Lfunc_end0-a
	.cfi_endproc
                                        # -- End function
	.globl	main                            # -- Begin function main
	.type	main,@function
main:                                   # @main
	.cfi_startproc
# %bb.0:
	pushq	%rbp
	.cfi_def_cfa_offset 16
	pushq	%rbx
	.cfi_def_cfa_offset 24
	pushq	%rax
	.cfi_def_cfa_offset 32
	.cfi_offset %rbx, -24
	.cfi_offset %rbp, -16
	movb	$1, c(%rip)
	movzwl	h(%rip), %eax
	testw	%ax, %ax
	jg	.LBB1_7
# %bb.1:
	xorl	%ecx, %ecx
	movl	e(%rip), %edx
	movb	$1, %bpl
.LBB1_2:                                # =>This Inner Loop Header: Depth=1
	xorl	%esi, %esi
	cmpl	$8, %edx
	setge	%bl
	movw	%cx, i(%rip)
	testl	%ecx, %ecx
	je	.LBB1_4
# %bb.3:                                #   in Loop: Header=BB1_2 Depth=1
	movb	%bl, %sil
	movsbl	b(%rip), %edx
	orl	%esi, %edx
	movl	%edx, e(%rip)
	movb	%dl, b(%rip)
.LBB1_4:                                #   in Loop: Header=BB1_2 Depth=1
	testb	%bpl, %bpl
	jne	.LBB1_6
# %bb.5:                                #   in Loop: Header=BB1_2 Depth=1
	callq	foo
	movl	e(%rip), %edx
	movzbl	c(%rip), %ecx
	xorl	$1, %ecx
	movzwl	h(%rip), %eax
.LBB1_6:                                #   in Loop: Header=BB1_2 Depth=1
	movzwl	%ax, %esi
	incl	%eax
	movw	%ax, h(%rip)
                                        # kill: def $ax killed $ax killed $eax def $rax
	cmpl	$32766, %esi                    # imm = 0x7FFE
	ja	.LBB1_2
.LBB1_7:
	xorl	%eax, %eax
	addq	$8, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	retq
.Lfunc_end1:
	.size	main, .Lfunc_end1-main
	.cfi_endproc
                                        # -- End function
	.type	c,@object                       # @c
	.local	c
	.comm	c,1,4
	.type	h,@object                       # @h
	.bss
	.globl	h
	.p2align	1
h:
	.short	0                               # 0x0
	.size	h, 2

	.type	e,@object                       # @e
	.local	e
	.comm	e,4,4
	.type	i,@object                       # @i
	.globl	i
	.p2align	1
i:
	.short	0                               # 0x0
	.size	i, 2

	.type	b,@object                       # @b
	.globl	b
b:
	.byte	0                               # 0x0
	.size	b, 1

	.ident	"clang version 14.0.0 (https://github.com/llvm/llvm-project.git 550ea385abc2805fd3e0a539bf55bc82edb5c13e)"
	.section	".note.GNU-stack","",@progbits
	.addrsig

clang-llvmorg-13.0.0 -Os -S -o /dev/stdout case.c

Output

	.text
	.file	"case.c"
	.globl	a                               # -- Begin function a
	.type	a,@function
a:                                      # @a
	.cfi_startproc
# %bb.0:
	movl	%edi, %eax
	testb	%sil, %sil
	je	.LBB0_2
# %bb.1:
	movsbl	%al, %eax
	movsbl	%sil, %ecx
                                        # kill: def $ax killed $ax killed $eax
	cwtd
	idivw	%cx
                                        # kill: def $ax killed $ax def $eax
.LBB0_2:
                                        # kill: def $al killed $al killed $eax
	retq
.Lfunc_end0:
	.size	a, .Lfunc_end0-a
	.cfi_endproc
                                        # -- End function
	.globl	main                            # -- Begin function main
	.type	main,@function
main:                                   # @main
	.cfi_startproc
# %bb.0:
	movb	$1, c(%rip)
	movzwl	h(%rip), %eax
	testw	%ax, %ax
	jg	.LBB1_6
# %bb.1:
	movl	e(%rip), %edx
	movzbl	c(%rip), %r8d
	xorl	$1, %r8d
	xorl	%ecx, %ecx
.LBB1_2:                                # =>This Inner Loop Header: Depth=1
	movl	%ecx, %r9d
	testl	%ecx, %ecx
	je	.LBB1_4
# %bb.3:                                #   in Loop: Header=BB1_2 Depth=1
	xorl	%ecx, %ecx
	cmpl	$8, %edx
	setge	%cl
	movsbl	b(%rip), %edx
	orl	%ecx, %edx
	movl	%edx, e(%rip)
	movb	%dl, b(%rip)
.LBB1_4:                                #   in Loop: Header=BB1_2 Depth=1
	leal	1(%rax), %edi
	movzwl	%ax, %esi
	movl	%edi, %eax
	movl	%r8d, %ecx
	cmpl	$32766, %esi                    # imm = 0x7FFE
	ja	.LBB1_2
# %bb.5:
	movw	%r9w, i(%rip)
	movw	%di, h(%rip)
.LBB1_6:
	xorl	%eax, %eax
	retq
.Lfunc_end1:
	.size	main, .Lfunc_end1-main
	.cfi_endproc
                                        # -- End function
	.type	c,@object                       # @c
	.local	c
	.comm	c,1,4
	.type	h,@object                       # @h
	.bss
	.globl	h
	.p2align	1
h:
	.short	0                               # 0x0
	.size	h, 2

	.type	e,@object                       # @e
	.local	e
	.comm	e,4,4
	.type	i,@object                       # @i
	.globl	i
	.p2align	1
i:
	.short	0                               # 0x0
	.size	i, 2

	.type	b,@object                       # @b
	.globl	b
b:
	.byte	0                               # 0x0
	.size	b, 1

	.ident	"clang version 13.0.0 (https://github.com/llvm/llvm-project.git d7b669b3a30345cfcdb2fde2af6f48aa4b94845d)"
	.section	".note.GNU-stack","",@progbits
	.addrsig

clang-550ea385abc2805fd3e0a539bf55bc82edb5c13e -v

Output

clang version 14.0.0 (https://github.com/llvm/llvm-project.git 550ea385abc2805fd3e0a539bf55bc82edb5c13e)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /zdata/compiler_cache/clang-550ea385abc2805fd3e0a539bf55bc82edb5c13e/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/11.1.0
Selected GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/11.1.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

clang-ed403e4cb2e5c9c61d2fbb44bae03c5603290bf1 -v

Output

clang version 13.0.0 (https://github.com/llvm/llvm-project.git d7b669b3a30345cfcdb2fde2af6f48aa4b94845d)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /zdata/compiler_cache/clang-ed403e4cb2e5c9c61d2fbb44bae03c5603290bf1/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/11.1.0
Selected GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/11.1.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

Bisection

Started with 0733381
clang-07333810caee48e94587891191a970be8a117fcf -Os -S -o /dev/stdout case.c

Output

	.text
	.file	"case.c"
	.globl	a                               # -- Begin function a
	.type	a,@function
a:                                      # @a
	.cfi_startproc
# %bb.0:
	movl	%edi, %eax
	testb	%sil, %sil
	je	.LBB0_2
# %bb.1:
	movsbl	%al, %eax
	movsbl	%sil, %ecx
                                        # kill: def $ax killed $ax killed $eax
	cwtd
	idivw	%cx
                                        # kill: def $ax killed $ax def $eax
.LBB0_2:
                                        # kill: def $al killed $al killed $eax
	retq
.Lfunc_end0:
	.size	a, .Lfunc_end0-a
	.cfi_endproc
                                        # -- End function
	.globl	main                            # -- Begin function main
	.type	main,@function
main:                                   # @main
	.cfi_startproc
# %bb.0:
	pushq	%rbp
	.cfi_def_cfa_offset 16
	pushq	%rbx
	.cfi_def_cfa_offset 24
	pushq	%rax
	.cfi_def_cfa_offset 32
	.cfi_offset %rbx, -24
	.cfi_offset %rbp, -16
	movb	$1, c(%rip)
	movzwl	h(%rip), %eax
	testw	%ax, %ax
	jg	.LBB1_7
# %bb.1:
	xorl	%ecx, %ecx
	movl	e(%rip), %edx
	movb	$1, %bpl
.LBB1_2:                                # =>This Inner Loop Header: Depth=1
	xorl	%esi, %esi
	cmpl	$8, %edx
	setge	%bl
	movw	%cx, i(%rip)
	testl	%ecx, %ecx
	je	.LBB1_4
# %bb.3:                                #   in Loop: Header=BB1_2 Depth=1
	movb	%bl, %sil
	movsbl	b(%rip), %edx
	orl	%esi, %edx
	movl	%edx, e(%rip)
	movb	%dl, b(%rip)
.LBB1_4:                                #   in Loop: Header=BB1_2 Depth=1
	testb	%bpl, %bpl
	jne	.LBB1_6
# %bb.5:                                #   in Loop: Header=BB1_2 Depth=1
	callq	foo
	movl	e(%rip), %edx
	movzbl	c(%rip), %ecx
	xorl	$1, %ecx
	movzwl	h(%rip), %eax
.LBB1_6:                                #   in Loop: Header=BB1_2 Depth=1
	movzwl	%ax, %esi
	incl	%eax
	movw	%ax, h(%rip)
                                        # kill: def $ax killed $ax killed $eax def $rax
	cmpl	$32766, %esi                    # imm = 0x7FFE
	ja	.LBB1_2
.LBB1_7:
	xorl	%eax, %eax
	addq	$8, %rsp
	.cfi_def_cfa_offset 24
	popq	%rbx
	.cfi_def_cfa_offset 16
	popq	%rbp
	.cfi_def_cfa_offset 8
	retq
.Lfunc_end1:
	.size	main, .Lfunc_end1-main
	.cfi_endproc
                                        # -- End function
	.type	c,@object                       # @c
	.local	c
	.comm	c,1,4
	.type	h,@object                       # @h
	.bss
	.globl	h
	.p2align	1
h:
	.short	0                               # 0x0
	.size	h, 2

	.type	e,@object                       # @e
	.local	e
	.comm	e,4,4
	.type	i,@object                       # @i
	.globl	i
	.p2align	1
i:
	.short	0                               # 0x0
	.size	i, 2

	.type	b,@object                       # @b
	.globl	b
b:
	.byte	0                               # 0x0
	.size	b, 1

	.ident	"clang version 14.0.0 (https://github.com/llvm/llvm-project.git 07333810caee48e94587891191a970be8a117fcf)"
	.section	".note.GNU-stack","",@progbits
	.addrsig

Previous commit: 8ec0f22

clang-8ec0f221843c51096cf3e7a479e780be371388a8 -Os -S -o /dev/stdout case.c

Output

	.text
	.file	"case.c"
	.globl	a                               # -- Begin function a
	.type	a,@function
a:                                      # @a
	.cfi_startproc
# %bb.0:
	movl	%edi, %eax
	testb	%sil, %sil
	je	.LBB0_2
# %bb.1:
	movsbl	%al, %eax
	movsbl	%sil, %ecx
                                        # kill: def $ax killed $ax killed $eax
	cwtd
	idivw	%cx
                                        # kill: def $ax killed $ax def $eax
.LBB0_2:
                                        # kill: def $al killed $al killed $eax
	retq
.Lfunc_end0:
	.size	a, .Lfunc_end0-a
	.cfi_endproc
                                        # -- End function
	.globl	main                            # -- Begin function main
	.type	main,@function
main:                                   # @main
	.cfi_startproc
# %bb.0:
	movzwl	h(%rip), %eax
	testw	%ax, %ax
	jg	.LBB1_3
.LBB1_1:                                # =>This Inner Loop Header: Depth=1
                                        # kill: def $ax killed $ax killed $eax def $rax
	movzwl	%ax, %ecx
	incl	%eax
	cmpl	$32766, %ecx                    # imm = 0x7FFE
	ja	.LBB1_1
# %bb.2:
	movw	$0, i(%rip)
	movw	%ax, h(%rip)
.LBB1_3:
	xorl	%eax, %eax
	retq
.Lfunc_end1:
	.size	main, .Lfunc_end1-main
	.cfi_endproc
                                        # -- End function
	.type	h,@object                       # @h
	.bss
	.globl	h
	.p2align	1
h:
	.short	0                               # 0x0
	.size	h, 2

	.type	i,@object                       # @i
	.globl	i
	.p2align	1
i:
	.short	0                               # 0x0
	.size	i, 2

	.type	b,@object                       # @b
	.globl	b
b:
	.byte	0                               # 0x0
	.size	b, 1

	.ident	"clang version 14.0.0 (https://github.com/llvm/llvm-project.git 8ec0f221843c51096cf3e7a479e780be371388a8)"
	.section	".note.GNU-stack","",@progbits
	.addrsig

@fhahn fhahn added regression and removed new issue labels Jan 3, 2022
fhahn referenced this issue Jan 3, 2022
… default case when switch cover all possible values."""""

This reverts commit c93f93b.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants