Skip to content

[InstCombine] failed to use popcount range metadata #51436

@rotateright

Description

@rotateright
Bugzilla Link 52094
Version trunk
OS All
CC @RKSimon

Extended Description

https://alive2.llvm.org/ce/z/c2tUxf

define i32 @src(i32 %0) {
  %2 = and i32 %0, 15
  %3 = tail call i32 @llvm.ctpop.i32(i32 %2)
  %4 = and i32 %3, 5
  %5 = icmp eq i32 %4, 1
  %6 = zext i1 %5 to i32
  ret i32 %6
}

define i32 @tgt(i32 %0) {
  %2 = and i32 %0, 15
  %3 = tail call i32 @llvm.ctpop.i32(i32 %2)
  %4 = and i32 %3, 1
  ret i32 %4
}
declare i32 @llvm.ctpop.i32(i32) #2

We fail to recognize this as a parity check which could lead to far worse codegen (especially for a target that does not have a popcount instruction):

IR corresponds to source like this:

int xor4_popcount(int num) {
    int masknum = num & 0xf;
    int pop = __builtin_popcount(masknum);
    return pop == 1 || pop == 3; 
}

This example is derived from the post-commit discussion in:
https://reviews.llvm.org/D110170

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillallvm:instcombineCovers the InstCombine, InstSimplify and AggressiveInstCombine passes

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions