LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 52260 - Dead Code Elimination Regression at -O3 (trunk vs 13.0.0)
Summary: Dead Code Elimination Regression at -O3 (trunk vs 13.0.0)
Status: RESOLVED FIXED
Alias: None
Product: new-bugs
Classification: Unclassified
Component: new bugs (show other bugs)
Version: trunk
Hardware: PC Linux
: P enhancement
Assignee: Unassigned LLVM Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-10-22 03:26 PDT by Theodoros Theodoridis
Modified: 2021-11-18 05:17 PST (History)
4 users (show)

See Also:
Fixed By Commit(s): acabad9ff6bf


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Theodoros Theodoridis 2021-10-22 03:26:01 PDT
cat test.c       
void foo(void);

static int a;
static int *b = &a;
static int **c = &b;
static char e;

static unsigned d() {
    if (c)
      return a;
    else
      return 1;
}

int main() {
  int f = d();
  unsigned char g = f;
  e = g >> 4;
  if (e) {
    for (;;) {
      if (f)
        break;
      c = 0;
      foo();
    }
    for (;;)
      ;
  }
}


13.0.0 at -O3 can eliminate the call to foo but trunk cannot:


clang-13 -O3 -S -o /dev/stdout test.c
...
main:                                   # @main
	.cfi_startproc
# %bb.0:
	testb	$-16, a(%rip)
	je	.LBB0_2
	.p2align	4, 0x90
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
	jmp	.LBB0_1
.LBB0_2:
	xorl	%eax, %eax
	retq



clang-trunk -O3 -S -o /dev/stdout test.c
main:                                   # @main
	.cfi_startproc
# %bb.0:
	pushq	%rax
	.cfi_def_cfa_offset 16
	cmpq	$0, c(%rip)
	movl	$1, %eax
	je	.LBB0_2
# %bb.1:
	movl	a(%rip), %eax
.LBB0_2:
	cmpb	$16, %al
	jae	.LBB0_3
# %bb.6:
	xorl	%eax, %eax
	popq	%rcx
	.cfi_def_cfa_offset 8
	retq
.LBB0_3:
	.cfi_def_cfa_offset 16
	testl	%eax, %eax
	je	.LBB0_4
	.p2align	4, 0x90
.LBB0_5:                                # =>This Inner Loop Header: Depth=1
	jmp	.LBB0_5
	.p2align	4, 0x90
.LBB0_4:                                # =>This Inner Loop Header: Depth=1
	movq	$0, c(%rip)
	callq	foo
	jmp	.LBB0_4


clang-trunk -v
clang version 14.0.0 (https://github.com/llvm/llvm-project.git eda2ebd7807376829eb880c39623f364b438971f)
Target: x86_64-unknown-linux-gnu
Thread model: posix

https://github.com/llvm/llvm-project/commit/f32c0fe8e50534f4210d878b9a1420793860c567 introduced this regression
Comment 1 Theodoros Theodoridis 2021-10-22 03:40:55 PDT
void foo(void);
static int a[] = {0, 0, 1};
static int b;
static unsigned char c;

int main() {
  for (; b >= 0; b--) {
    unsigned char d = a[b];
    c = d >> 1;
    if (c)
      foo();
  }
}

this test case also triggers the regression
Comment 2 Sanjay Patel 2021-10-26 12:32:24 PDT
Still stepping through, so I'm not sure if this is the entire problem, but are missing an icmp canonicalization and/or analysis to recognize this:

https://alive2.llvm.org/ce/z/7-6UPc

declare void @llvm.assume(i1)
declare i8 @llvm.ctpop.i8(i8)

define i1 @src(i32 %x, i8 %C) {
  ; compare constant must be power-of-2
  %pop = call i8 @llvm.ctpop.i8(i8 %C)
  %ispow2 = icmp eq i8 %pop, 1 
  call void @llvm.assume(i1 %ispow2)

  %t = trunc i32 %x to i8
  %tobool = icmp ult i8 %t, %C
  ret i1 %tobool
}

define i1 @tgt(i32 %x, i8 %C) {
  ; create mask constant for source type
  %zextC = zext i8 %C to i32 
  %maskC = sub i32 256, %zextC

  %a = and i32 %x, %maskC
  %tobool = icmp eq i32 %a, 0
  ret i1 %tobool
}
Comment 3 Sanjay Patel 2021-10-26 16:19:37 PDT
I plan to extend this:
https://reviews.llvm.org/rGacabad9ff6bf
...but that should solve the examples in this report.