[PATCH] D94014: [InstCombine] reduce icmp(ashr X, C1), C2 to sign-bit test

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 11 06:29:20 PST 2021


lebedev.ri requested changes to this revision.
lebedev.ri added a comment.
This revision now requires changes to proceed.

Sorry for the delay.

alive1 does not actually have a `countLeadingOnes()` precondition
(at least as per https://github.com/nunoplopes/alive/blob/master/constants.py),
so the proof is faulty. `ComputeNumSignBits()`, OTOH, works for me:

  $ cat /tmp/test.ll
  Name: lshr ugt
  Pre: ComputeNumSignBits(C2) <= C1
  %a = lshr i8 %x, C1
  %r = icmp ugt i8 %a, C2
    =>
  %r = icmp slt i8 %x, 0
  
  Name: lshr ult
  Pre: ComputeNumSignBits(C2) <= C1
  %a = lshr i8 %x, C1
  %r = icmp ult i8 %a, C2
    =>
  %r = icmp sgt i8 %x, -1
  
  Name: ashr ugt
  Pre: ComputeNumSignBits(C2) <= C1
  %a = ashr i8 %x, C1
  %r = icmp ugt i8 %a, C2
    =>
  %r = icmp slt i8 %x, 0
  
  Name: ashr ult
  Pre: ComputeNumSignBits(C2) <= C1
  %a = ashr i8 %x, C1
  %r = icmp ult i8 %a, C2
    =>
  %r = icmp sgt i8 %x, -1
  
  $ /repositories/alive/alive.py /tmp/test.ll 
  ----------------------------------------
  Optimization: lshr ugt
  Precondition: (ComputeNumSignBits(C2) <= C1)
    %a = lshr i8 %x, C1
    %r = icmp ugt i8 %a, C2
  =>
    %r = icmp slt i8 %x, 0
  
  
  ERROR: Mismatch in values of i1 %r
  
  Example:
  %x i8 = 0x80 (128, -128)
  C1 i8 = 0x07 (7)
  C2 i8 = 0xD0 (208, -48)
  %a i8 = 0x01 (1)
  Source value: 0x0 (0)
  Target value: 0x1 (1, -1)

Am i holding it wrong, or is this missing some preconditions?


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

https://reviews.llvm.org/D94014



More information about the llvm-commits mailing list