зеркало из https://github.com/microsoft/clang-1.git
Fix IR generation for bool on PPC (and any other target where bool is not 8 bits in memory).
PR11777. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167802 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
4d10b40ea8
Коммит
8187c7e488
|
@ -935,8 +935,8 @@ llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
|
|||
llvm::APInt Min;
|
||||
llvm::APInt End;
|
||||
if (IsBool) {
|
||||
Min = llvm::APInt(8, 0);
|
||||
End = llvm::APInt(8, 2);
|
||||
Min = llvm::APInt(getContext().getTypeSize(Ty), 0);
|
||||
End = llvm::APInt(getContext().getTypeSize(Ty), 2);
|
||||
} else {
|
||||
const EnumDecl *ED = ET->getDecl();
|
||||
llvm::Type *LTy = ConvertTypeForMem(ED->getIntegerType());
|
||||
|
@ -1031,8 +1031,9 @@ llvm::Value *CodeGenFunction::EmitToMemory(llvm::Value *Value, QualType 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))
|
||||
return Builder.CreateZExt(Value, Builder.getInt8Ty(), "frombool");
|
||||
assert(Value->getType()->isIntegerTy(8) && "value rep of bool not i1/i8");
|
||||
return Builder.CreateZExt(Value, ConvertTypeForMem(Ty), "frombool");
|
||||
assert(Value->getType()->isIntegerTy(getContext().getTypeSize(Ty)) &&
|
||||
"wrong value rep of bool");
|
||||
}
|
||||
|
||||
return Value;
|
||||
|
@ -1041,7 +1042,8 @@ 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)) {
|
||||
assert(Value->getType()->isIntegerTy(8) && "memory rep of bool not i8");
|
||||
assert(Value->getType()->isIntegerTy(getContext().getTypeSize(Ty)) &&
|
||||
"wrong value rep of bool");
|
||||
return Builder.CreateTrunc(Value, Builder.getInt1Ty(), "tobool");
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,18 @@
|
|||
// REQUIRES: ppc32-registered-target
|
||||
// RUN: %clang_cc1 -triple powerpc-apple-darwin -emit-llvm -o - %s| FileCheck -check-prefix=DARWINPPC-CHECK %s
|
||||
// RUN: %clang_cc1 -triple powerpc-apple-macosx10.4.0 -emit-llvm -o - %s -O2 -disable-llvm-optzns | FileCheck %s
|
||||
|
||||
int boolsize = sizeof(_Bool);
|
||||
//DARWINPPC-CHECK: boolsize = global i32 4, align 4
|
||||
// CHECK: boolsize = global i32 4, align 4
|
||||
|
||||
void f(_Bool *x, _Bool *y) {
|
||||
*x = *y;
|
||||
}
|
||||
|
||||
// CHECK: define void @f(
|
||||
// CHECK: [[FROMMEM:%.*]] = load i32* %
|
||||
// CHECK: [[BOOLVAL:%.*]] = trunc i32 [[FROMMEM]] to i1
|
||||
// CHECK: [[TOMEM:%.*]] = zext i1 [[BOOLVAL]] to i32
|
||||
// CHECK: store i32 [[TOMEM]]
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: metadata !{i32 0, i32 2}
|
||||
|
|
Загрузка…
Ссылка в новой задаче