Fix bug in PR454 resolution. Added new test case.

This fixes llvmAsmParser.cpp miscompile by llvm on PowerPC Darwin.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31053 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Devang Patel
2006-10-19 18:54:08 +00:00
parent 2435786414
commit 6ce890b6ec
3 changed files with 23 additions and 25 deletions

View File

@@ -4785,7 +4785,21 @@ Instruction *InstCombiner::visitSetCondInstWithCastAndCast(SetCondInst &SCI) {
Constant *Res = ConstantExpr::getCast(CI, SrcTy);
if (ConstantExpr::getCast(Res, DestTy) == CI) {
RHSCIOp = Res;
// Make sure that src sign and dest sign match. For example,
//
// %A = cast short %X to uint
// %B = setgt uint %A, 1330
//
// It is incorrect to transformt this into
//
// %B = setgt short %X, 1330
//
// because %A may have negative value.
// However, it is OK if SrcTy is bool. See cast-set.ll testcase.
if (isSignSrc == isSignDest || SrcTy == Type::BoolTy)
RHSCIOp = Res;
else
return 0;
} else {
// If the value cannot be represented in the shorter type, we cannot emit
// a simple comparison.