summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp69
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.h1
2 files changed, 8 insertions, 62 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 5a847a3b965..30e3e7ad2cf 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -860,61 +860,6 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue) {
lvalue.getType(), lvalue.getTBAAInfo());
}
-static bool hasBooleanRepresentation(QualType Ty) {
- if (Ty->isBooleanType())
- return true;
-
- if (const EnumType *ET = Ty->getAs<EnumType>())
- return ET->getDecl()->getIntegerType()->isBooleanType();
-
- return false;
-}
-
-llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
- const EnumType *ET = Ty->getAs<EnumType>();
- bool IsRegularCPlusPlusEnum = getLangOpts().CPlusPlus && ET &&
- !ET->getDecl()->isFixed();
- bool IsBool = hasBooleanRepresentation(Ty);
- llvm::Type *LTy;
- if (!IsBool && !IsRegularCPlusPlusEnum)
- return NULL;
-
- uint64_t Min;
- uint64_t End;
- if (IsBool) {
- Min = 0;
- End = 2;
- LTy = Int8Ty;
- } else {
- const EnumDecl *ED = ET->getDecl();
- LTy = ConvertTypeForMem(ED->getIntegerType());
- unsigned NumNegativeBits = ED->getNumNegativeBits();
- unsigned NumPositiveBits = ED->getNumPositiveBits();
-
- if (NumNegativeBits) {
- unsigned NumBits = std::max(NumNegativeBits, NumPositiveBits + 1);
- assert(NumBits <= 64);
- End = 1ULL << (NumBits - 1);
- Min = -End;
- } else {
- assert(NumPositiveBits <= 64);
- if (NumPositiveBits == 64)
- return NULL;
- End = 1ULL << NumPositiveBits;
- Min = 0;
- }
- }
-
- assert(End != Min);
- llvm::Value *LowAndHigh[2];
- LowAndHigh[0] = llvm::ConstantInt::get(LTy, Min);
- LowAndHigh[1] = llvm::ConstantInt::get(LTy, End);
-
- llvm::LLVMContext &C = getLLVMContext();
- llvm::MDNode *Range = llvm::MDNode::get(C, LowAndHigh);
- return Range;
-}
-
llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
unsigned Alignment, QualType Ty,
llvm::MDNode *TBAAInfo) {
@@ -929,16 +874,18 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
if (Ty->isAtomicType())
Load->setAtomic(llvm::SequentiallyConsistent);
- if (CGM.getCodeGenOpts().OptimizationLevel > 0)
- if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty))
- Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
-
return EmitFromMemory(Load, Ty);
}
+static bool isBooleanUnderlyingType(QualType Ty) {
+ if (const EnumType *ET = dyn_cast<EnumType>(Ty))
+ return ET->getDecl()->getIntegerType()->isBooleanType();
+ return false;
+}
+
llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
// Bool has a different representation in memory than in registers.
- if (hasBooleanRepresentation(Ty)) {
+ if (Ty->isBooleanType() || isBooleanUnderlyingType(Ty)) {
// This should really always be an i1, but sometimes it's already
// an i8, and it's awkward to track those cases down.
if (Value->getType()->isIntegerTy(1))
@@ -951,7 +898,7 @@ llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType Ty) {
llvm::Value *CodeGenFunction::EmitFromMemory(llvm::Value *Value, QualType Ty) {
// Bool has a different representation in memory than in registers.
- if (hasBooleanRepresentation(Ty)) {
+ if (Ty->isBooleanType() || isBooleanUnderlyingType(Ty)) {
assert(Value->getType()->isIntegerTy(8) && "memory rep of bool not i8");
return Builder.CreateTrunc(Value, Builder.getInt1Ty(), "tobool");
}
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index 85cbd143d89..e0e6501b19e 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -2522,7 +2522,6 @@ public:
unsigned AccuracyD = 1);
private:
- llvm::MDNode *getRangeForLoadFromType(QualType Ty);
void EmitReturnOfRValue(RValue RV, QualType Ty);
/// ExpandTypeFromArgs - Reconstruct a structure of type \arg Ty
OpenPOWER on IntegriCloud