From 8187c7e488837698c5fb7a84107e3347d276f73f Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Tue, 13 Nov 2012 02:05:15 +0000 Subject: [PATCH] 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 --- lib/CodeGen/CGExpr.cpp | 12 +++++++----- test/CodeGen/bool_test.c | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index d1a2889f9a..393d3b9704 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -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"); } diff --git a/test/CodeGen/bool_test.c b/test/CodeGen/bool_test.c index 715f8467b5..83d8330771 100644 --- a/test/CodeGen/bool_test.c +++ b/test/CodeGen/bool_test.c @@ -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}