The following test in Transforms/InstCombine/vector-xor.ll shows an incorrect transformation. I reproduce it here with a smaller vector size & bitwidth to make it easier to understand. The issue is that "undef >> 4" is "ssss.sxyz" (s = sign bit), while "undef u>> 4" is "0000.xyzw", so it can produce the value "0000.1000", while ashr cannot. See details below: define <2 x i8> @test_v4i32_not_ashr_negative_const_undef(<2 x i8> %a0) { %1 = ashr <2 x i8> { 251, undef }, %a0 %2 = xor <2 x i8> { 255, 255 }, %1 ret <2 x i8> %2 } => define <2 x i8> @test_v4i32_not_ashr_negative_const_undef(<2 x i8> %a0) { %1 = lshr <2 x i8> { 4, undef }, %a0 ret <2 x i8> %1 } Transformation doesn't verify! ERROR: Value mismatch Example: <2 x i8> %a0 = < #x00 (0), #x04 (4) > Source: <2 x i8> %1 = < #xfb (251, -5), #x00 (0) [based on undef value] > <2 x i8> %2 = < #x04 (4), #xff (255, -1) > Target: <2 x i8> %1 = < #x04 (4), #x08 (8) > Source value: < #x04 (4), #xff (255, -1) > Target value: < #x04 (4), #x08 (8) >
https://reviews.llvm.org/D76800
https://github.com/llvm/llvm-project/commit/7a89a5d81bbdc0ab6dbd14d9af4a52e64c868423