You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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) >
Extended Description
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) >
The text was updated successfully, but these errors were encountered: