]> granicus.if.org Git - clang/commitdiff
Only do the bitcast in EmitStoreOfScalar if the type is a boolean.
authorAnders Carlsson <andersca@mac.com>
Tue, 19 May 2009 19:36:19 +0000 (19:36 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 19 May 2009 19:36:19 +0000 (19:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72125 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp

index 24d885cec54242f3a322e4968beb8d1aa150a360..f7c3fd097691372b2da5af3d840216f5aad204c9 100644 (file)
@@ -200,8 +200,7 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
                                                QualType Ty) {
   llvm::Value *V = Builder.CreateLoad(Addr, Volatile, "tmp");
 
-  // Bool can have different representation in memory than in
-  // registers.
+  // Bool can have different representation in memory than in registers.
   if (Ty->isBooleanType())
     if (V->getType() != llvm::Type::Int1Ty)
       V = Builder.CreateTrunc(V, llvm::Type::Int1Ty, "tobool");
@@ -211,20 +210,18 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
 
 void CodeGenFunction::EmitStoreOfScalar(llvm::Value *Value, llvm::Value *Addr,
                                         bool Volatile, QualType Ty) {
-  // Handle stores of types which have different representations in memory and
-  // as LLVM values.
-
-  // FIXME: We shouldn't be this loose, we should only do this conversion when
-  // we have a type we know has a different memory representation (e.g., bool).
-
-  const llvm::Type *SrcTy = Value->getType();
-  const llvm::PointerType *DstPtr = cast<llvm::PointerType>(Addr->getType());
-  if (DstPtr->getElementType() != SrcTy) {
-    const llvm::Type *MemTy = 
-      llvm::PointerType::get(SrcTy, DstPtr->getAddressSpace());
-    Addr = Builder.CreateBitCast(Addr, MemTy, "storetmp");
+  
+  if (Ty->isBooleanType()) {
+    // Bool can have different representation in memory than in registers.
+    const llvm::Type *SrcTy = Value->getType();
+    const llvm::PointerType *DstPtr = cast<llvm::PointerType>(Addr->getType());
+    if (DstPtr->getElementType() != SrcTy) {
+      const llvm::Type *MemTy = 
+        llvm::PointerType::get(SrcTy, DstPtr->getAddressSpace());
+      Addr = Builder.CreateBitCast(Addr, MemTy, "storetmp");
+    }
   }
-
+  
   Builder.CreateStore(Value, Addr, Volatile);  
 }