Skip to content

Missed optimization: eliminate redundant and+zext+or reconstruction in select arm #144020

@Cancelll

Description

@Cancelll
define i40 @src(i40 %arg0) {
  %1 = trunc i40 %arg0 to i8
  %2 = icmp eq i8 %1, 2
  %3 = and i40 %arg0, -256
  %4 = select i1 %2, i8 0, i8 %1
  %5 = select i1 %2, i40 0, i40 %3
  %6 = zext i8 %4 to i40
  %7 = or disjoint i40 %5, %6
  ret i40 %7
}

define i40 @tgt(i40 %arg0) {
  %1 = trunc i40 %arg0 to i8
  %2 = icmp eq i8 %1, 2
  %3 = select i1 %2, i40 0, i40 %arg0
  ret i40 %3
}

alive2: https://alive2.llvm.org/ce/z/URiF_Y
godbolt: https://godbolt.org/z/Kj3qEv453

Occurrences in llvm-opt-benchmarks:
typst-rs/optimized/2i78fvbm4wocuesi.ll
%1 = trunc i40 %arg0 to i8 -> %.sroa.05.0.extract.trunc = trunc i40 %3 to i8
%2 = icmp eq i8 %1, 2 -> %4 = icmp eq i8 %.sroa.05.0.extract.trunc, 2
%3 = and i40 %arg0, -256 -> %.sroa.46.0.extract.shift = and i40 %3, -256
%4 = select i1 %2, i8 0, i8 %1 -> %.sroa.0.0 = select i1 %4, i8 0, i8 %.sroa.05.0.extract.trunc
%5 = select i1 %2, i40 0, i40 %3 -> %.sroa.3.0.insert.ext = select i1 %4, i40 0, i40 %.sroa.46.0.extract.shift
%6 = zext i8 %4 to i40 -> %.sroa.0.0.insert.ext = zext i8 %.sroa.0.0 to i40
%7 = or disjoint i40 %5, %6 -> %.sroa.0.0.insert.insert = or disjoint i40 %.sroa.3.0.insert.ext, %.sroa.0.0.insert.ext

typst-rs/optimized/m09o5qr68f5khss.ll
%1 = trunc i40 %arg0 to i8 -> %.sroa.05.0.extract.trunc.i.i = trunc i40 %35 to i8
%2 = icmp eq i8 %1, 2 -> %36 = icmp eq i8 %.sroa.05.0.extract.trunc.i.i, 2
%3 = and i40 %arg0, -256 -> %.sroa.46.0.extract.shift.i.i = and i40 %35, -256
%4 = select i1 %2, i8 0, i8 %1 -> %.sroa.0.0.i.i = select i1 %36, i8 0, i8 %.sroa.05.0.extract.trunc.i.i
%5 = select i1 %2, i40 0, i40 %3 -> %.sroa.3.0.insert.ext.i.i = select i1 %36, i40 0, i40 %.sroa.46.0.extract.shift.i.i
%6 = zext i8 %4 to i40 -> %.sroa.0.0.insert.ext.i.i = zext i8 %.sroa.0.0.i.i to i40
%7 = or disjoint i40 %5, %6 -> %.sroa.0.0.insert.insert.i.i = or disjoint i40 %.sroa.3.0.insert.ext.i.i, %.sroa.0.0.insert.ext.i.i
2 Occurrences

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions