Skip to content

Missed DSE of non-inlineable call #144300

Closed
@qchateau

Description

@qchateau

Minimal working example:

@x = global i32 0, align 4

define void @bar(ptr %0) noinline {
  %2 = load i32, ptr @x, align 4
  store i32 %2, ptr %0, align 4
  ret void
}

define void @foo() {
  %1 = alloca i32, align 4
  call void @bar(ptr %1)
  ret void
}

@bar stores the value of global @x in its argument. It is marked noinline.
@foo calls @bar with an alloca variable, and does nothing else. At -O3, opt (trunk) is not able to kill the call to @bar.

In practice, I noticed this with an indirect call instead of a call to "@bar", and could not make DSE work as soon as the called function read memory (understand: the call gets DSE'ed with memory(argmem: readwrite), but not with memory(read, argmem: readwrite).

If I remvoe noinline , the call gets inline, then DSE'd correctly.

https://godbolt.org/z/9MEGrYdsa

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions