[SelectionDAG] Use `computeKnownBits` if `Op` is not recognized by `isKnownNeverZero`
authorNoah Goldstein <goldstein.w.n@gmail.com>
Sat, 13 May 2023 17:58:55 +0000 (12:58 -0500)
committerNoah Goldstein <goldstein.w.n@gmail.com>
Sat, 13 May 2023 19:36:04 +0000 (14:36 -0500)
The current logic is pretty limitted unless the `Op` is a
constant. This at least covers more obvious cases.

Reviewed By: craig.topper, foad

Differential Revision: https://reviews.llvm.org/D149196

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/test/CodeGen/ARM/cttz_vector.ll

index b46ca15233d3229f72fc9cb2684e8214ef9bd9d2..e447963f23c9d29796173301a179c218483e54c1 100644 (file)
@@ -5064,7 +5064,7 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op, unsigned Depth) const {
     break;
   }
 
-  return false;
+  return computeKnownBits(Op, Depth).isNonZero();
 }
 
 bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const {
index a68b0b529cdf21ae6c2415bce6b199cada229eef..988ea5d4acb1293cec904d0368373fa9634c99c2 100644 (file)
@@ -65,14 +65,13 @@ define void @test_v4i8(ptr %p) {
 ; CHECK-LABEL: test_v4i8:
 ; CHECK:       @ %bb.0:
 ; CHECK-NEXT:    vld1.32 {d16[0]}, [r0:32]
-; CHECK-NEXT:    vmov.i16 d19, #0x1
 ; CHECK-NEXT:    vmovl.u8 q8, d16
 ; CHECK-NEXT:    vorr.i16 d16, #0x100
 ; CHECK-NEXT:    vneg.s16 d18, d16
 ; CHECK-NEXT:    vand d16, d16, d18
-; CHECK-NEXT:    vsub.i16 d16, d16, d19
-; CHECK-NEXT:    vcnt.8 d16, d16
-; CHECK-NEXT:    vpaddl.u8 d16, d16
+; CHECK-NEXT:    vmov.i16 d17, #0xf
+; CHECK-NEXT:    vclz.i16 d16, d16
+; CHECK-NEXT:    vsub.i16 d16, d17, d16
 ; CHECK-NEXT:    vuzp.8 d16, d17
 ; CHECK-NEXT:    vst1.32 {d16[0]}, [r0:32]
 ; CHECK-NEXT:    bx lr