Don't fold double constant to an integer if dest type not integral

Summary:
I encountered this issue when constant folding during inlining tried to
fold away a bitcast of a double to an x86_mmx, which is not an integral
type. The test case exposes the same issue with a smaller code snippet
during early CSE.

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D18528

llvm-svn: 265367
This commit is contained in:
Teresa Johnson 2016-04-04 23:50:46 +00:00
parent e3f558ba14
commit f4cf1c3eb4
2 changed files with 16 additions and 0 deletions

View File

@ -191,6 +191,10 @@ static Constant *FoldBitCast(Constant *V, Type *DestTy) {
if (FP->getType()->isPPC_FP128Ty())
return nullptr;
// Make sure dest type is compatible with the folded integer constant.
if (!DestTy->isIntegerTy())
return nullptr;
return ConstantInt::get(FP->getContext(),
FP->getValueAPF().bitcastToAPInt());
}

View File

@ -0,0 +1,12 @@
; RUN: opt -mtriple=x86_64-- -early-cse < %s -S | FileCheck %s
; CHECK: @foo(x86_mmx bitcast (double 0.000000e+00 to x86_mmx))
define void @bar() {
entry:
%0 = bitcast double 0.0 to x86_mmx
%1 = call x86_mmx @foo(x86_mmx %0)
ret void
}
declare x86_mmx @foo(x86_mmx)