aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/CBackend/Writer.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-11-27 18:51:06 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-11-27 18:51:06 +0000
commit639cf7d380b4e89542d8c29a93605b905c203a1c (patch)
tree85575f2010e31a4241a4384e54062d3d3933e138 /lib/Target/CBackend/Writer.cpp
parenteb7313805b06a9751e382fb70751290f49e334c1 (diff)
When truncating to bool, it is necessary to & with 1 for all casts that
can result in a bool. Previously PtrToInt, FPToUI and FPToSI were missing this operation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31938 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/CBackend/Writer.cpp')
-rw-r--r--lib/Target/CBackend/Writer.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp
index bcc5fbf60a..59ccf0079b 100644
--- a/lib/Target/CBackend/Writer.cpp
+++ b/lib/Target/CBackend/Writer.cpp
@@ -626,8 +626,11 @@ void CWriter::printConstant(Constant *CPV) {
Out << "0-";
}
printConstant(CE->getOperand(0));
- if (CE->getOpcode() == Instruction::Trunc &&
- CE->getType() == Type::BoolTy) {
+ if (CE->getType() == Type::BoolTy &&
+ (CE->getOpcode() == Instruction::Trunc ||
+ CE->getOpcode() == Instruction::FPToUI ||
+ CE->getOpcode() == Instruction::FPToSI ||
+ CE->getOpcode() == Instruction::PtrToInt)) {
// Make sure we really truncate to bool here by anding with 1
Out << "&1u";
}
@@ -1960,7 +1963,11 @@ void CWriter::visitCastInst(CastInst &I) {
Out << "0-";
}
writeOperand(I.getOperand(0));
- if (I.getOpcode() == Instruction::Trunc && DstTy == Type::BoolTy) {
+ if (DstTy == Type::BoolTy &&
+ (I.getOpcode() == Instruction::Trunc ||
+ I.getOpcode() == Instruction::FPToUI ||
+ I.getOpcode() == Instruction::FPToSI ||
+ I.getOpcode() == Instruction::PtrToInt)) {
// Make sure we really get a trunc to bool by anding the operand with 1
Out << "&1u";
}