Skip to content

Select not sunk into branch on same condition #63756

Closed
@nikic

Description

@nikic

https://llvm.godbolt.org/z/s61x8M7Tf

declare void @use(i32)
declare void @dummy()

define void @test(i1 %c, i32 %a, i32 %b) {
  %s = select i1 %c, i32 %a, i32 %b
  br i1 %c, label %if, label %else

if:
  call void @dummy()
  call void @use(i32 %s)
  ret void

else:
  call void @use(i32 %s)
  call void @dummy()
  ret void
}

We have a branch on the same condition as the select, so we should sink the select arms into the branches. It's pointless to compute the select value in the common code path:

declare void @use(i32)
declare void @dummy()

define void @test(i1 %c, i32 %a, i32 %b) {
  br i1 %c, label %if, label %else

if:
  call void @dummy()
  call void @use(i32 %a)
  ret void

else:
  call void @use(i32 %b)
  call void @dummy()
  ret void
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions