GBE: fix a legalize pass bug when bitcast wide integer to incompaitble vector.
Our wide integer legalize pass will assume the source type of a wide
integer must be the same as the final use type. But this is not always
true. The following case is a real example:
%conv.i.i.14 = sext i8 %usrc0.i.sroa.0.14.extract.trunc to i32
%call.i.i2.14 = tail call i32 @__gen_ocl_abs(i32 %conv.i.i.14) #5
%conv1.i.i.14.mask = and i32 %call.i.i2.14, 255
%uret.i.sroa.0.14.insert.ext = zext i32 %conv1.i.i.14.mask to i128
%uret.i.sroa.0.14.insert.shift = shl nuw nsw i128 %uret.i.sroa.0.14.insert.ext, 112
......
%uret.i.sroa.0.15.insert.mask = or i128 %uret.i.sroa.0.14.insert.mask.masked, %uret.i.sroa.0.14.insert.shift
%uret.i.sroa.0.15.insert.insert = or i128 %uret.i.sroa.0.15.insert.mask, %uret.i.sroa.0.15.insert.shift
%2 = bitcast i128 %uret.i.sroa.0.15.insert.insert to <16 x i8>
The wide integer i128 %uret.i.sroa.0.16.insert.insert is from an
i32 integer %conv1.i.i.14.mask. But the use of it is i8 vector
which breaks our assumption.
According to ruiling's good suggestion, we always bitcast the wide integer to
a compatible vector, take the above example:
%3 = bitcast i128 %uret.i.sroa.0.15.insert.insert to <4 x i32>
Then insert a bit cast instruction to convert it to the original destination
%2 = bitcast <4 x i32> %3 to <16 x i8>
Signed-off-by: Zhigang Gong <zhigang.gong@intel.com>
Reviewed-by: "Yang, Rong R" <rong.r.yang@intel.com>