[PATCH] D156058: [InstCombine] Fix bug in canonicalization of Pow2 Tests (From: D152673)

Noah Goldstein via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 23 09:09:47 PDT 2023


goldstein.w.n added a comment.

I kept this out of the commit message because its a bit too verbose, but heres the alive2 output for all the transforms:

  ----------------------------------------
  define i1 @blsmsk_is_p2_or_z_ule_xy(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp ule i8 %x, %y
    ret i1 %r
  }
  =>
  define i1 @blsmsk_is_p2_or_z_ule_xy(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %1 = ctpop i8 %x
    %1_range = !range i8 %1, i8 0, i8 9
    %r = icmp ult i8 %1_range, 2
    ret i1 %r
  }
  Transformation seems to be correct!
  
  ----------------------------------------
  define i1 @blsmsk_is_p2_or_z_ule_yx_fail(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp ule i8 %y, %x
    ret i1 %r
  }
  =>
  define i1 @blsmsk_is_p2_or_z_ule_yx_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %xm1 = add i8 %x, 255
    %y = xor i8 %xm1, %x
    %r = icmp ule i8 %y, %x
    ret i1 %r
  }
  Transformation seems to be correct!
  
  ----------------------------------------
  define i1 @blsmsk_is_p2_or_z_uge_yx(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp uge i8 %y, %x
    ret i1 %r
  }
  =>
  define i1 @blsmsk_is_p2_or_z_uge_yx(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %1 = ctpop i8 %x
    %1_range = !range i8 %1, i8 0, i8 9
    %r = icmp ult i8 %1_range, 2
    ret i1 %r
  }
  Transformation seems to be correct!
  
  ----------------------------------------
  define i1 @blsmsk_is_p2_or_z_uge_xy_fail(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp uge i8 %x, %y
    ret i1 %r
  }
  =>
  define i1 @blsmsk_is_p2_or_z_uge_xy_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %xm1 = add i8 %x, 255
    %y = xor i8 %xm1, %x
    %r = icmp uge i8 %x, %y
    ret i1 %r
  }
  Transformation seems to be correct!
  
  ----------------------------------------
  define i1 @blsmsk_isnt_p2_or_z_ugt_xy(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp ugt i8 %x, %y
    ret i1 %r
  }
  =>
  define i1 @blsmsk_isnt_p2_or_z_ugt_xy(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %1 = ctpop i8 %x
    %1_range = !range i8 %1, i8 0, i8 9
    %r = icmp ugt i8 %1_range, 1
    ret i1 %r
  }
  Transformation seems to be correct!
  
  ----------------------------------------
  define i1 @blsmsk_isnt_p2_or_z_ugt_yx_fail(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp ugt i8 %y, %x
    ret i1 %r
  }
  =>
  define i1 @blsmsk_isnt_p2_or_z_ugt_yx_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %xm1 = add i8 %x, 255
    %y = xor i8 %xm1, %x
    %r = icmp ugt i8 %y, %x
    ret i1 %r
  }
  Transformation seems to be correct!
  
  ----------------------------------------
  define i1 @blsmsk_isnt_p2_or_z_ult_yx(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp ult i8 %y, %x
    ret i1 %r
  }
  =>
  define i1 @blsmsk_isnt_p2_or_z_ult_yx(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %1 = ctpop i8 %x
    %1_range = !range i8 %1, i8 0, i8 9
    %r = icmp ugt i8 %1_range, 1
    ret i1 %r
  }
  Transformation seems to be correct!
  
  ----------------------------------------
  define i1 @blsmsk_isnt_p2_or_z_ult_xy_fail(i8 %xx, i8 %yy) {
  %0:
    %x = or i8 %xx, %yy
    %xm1 = add i8 %x, 255
    %y = xor i8 %x, %xm1
    %r = icmp ult i8 %x, %y
    ret i1 %r
  }
  =>
  define i1 @blsmsk_isnt_p2_or_z_ult_xy_fail(i8 %xx, i8 %yy) nofree willreturn memory(none) {
  %0:
    %x = or i8 %yy, %xx
    %xm1 = add i8 %x, 255
    %y = xor i8 %xm1, %x
    %r = icmp ult i8 %x, %y
    ret i1 %r
  }
  Transformation seems to be correct!
  
  Summary:
    8 correct transformations
    0 incorrect transformations
    0 failed-to-prove transformations
    0 Alive2 errors


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D156058/new/

https://reviews.llvm.org/D156058



More information about the llvm-commits mailing list