Fix a bug in the integer-promotion of bitcast operations on vector types.

We must not issue a bitcast operation for integer-promotion of vector types, because the
location of the values in the vector may be different.

llvm-svn: 146150
This commit is contained in:
Nadav Rotem 2011-12-08 13:10:01 +00:00
parent b6033396fd
commit 26edb291ac
4 changed files with 18 additions and 2 deletions

View File

@ -216,7 +216,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_BITCAST(SDNode *N) {
case TargetLowering::TypeLegal:
break;
case TargetLowering::TypePromoteInteger:
if (NOutVT.bitsEq(NInVT))
if (NOutVT.bitsEq(NInVT) && !NOutVT.isVector() && !NInVT.isVector())
// The input promotes to the same size. Convert the promoted value.
return DAG.getNode(ISD::BITCAST, dl, NOutVT, GetPromotedInteger(InOp));
break;

View File

@ -0,0 +1,15 @@
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 | FileCheck %s
; Make sure that the conversion between v4i8 to v2i16 is not a simple bitcast.
; CHECK: prom_bug
; CHECK: movd
; CHECK: shufb
; CHECK: movw
; CHECK: ret
define void @prom_bug(<4 x i8> %t, i16* %p) {
%r = bitcast <4 x i8> %t to <2 x i16>
%o = extractelement <2 x i16> %r, i32 0
store i16 %o, i16* %p
ret void
}

View File

@ -8,6 +8,7 @@ declare <4 x i32> @llvm.x86.sse41.pmaxsd(<4 x i32>, <4 x i32>) nounwind readnone
define void @blackDespeckle_wrapper(i8** %args_list, i64* %gtid, i64 %xend) {
entry:
; CHECK: cfi_def_cfa_offset
; CHECK-NOT: set
; CHECK: pcmpgt
; CHECK: blendvps

View File

@ -1,5 +1,5 @@
; RUN: llc < %s -march=x86 -mattr=+sse42 -post-RA-scheduler=true | FileCheck %s
; CHECK: incw
; CHECK: incl
; CHECK: incl
; CHECK: incl
; CHECK: addl