Tell LLVM that all vector stores and loads are potentially unaligned.
authorGeoffrey Mainland <gmainlan@microsoft.com>
Wed, 31 Oct 2012 11:56:01 +0000 (11:56 +0000)
committerGeoffrey Mainland <gmainlan@microsoft.com>
Fri, 1 Feb 2013 22:00:23 +0000 (22:00 +0000)
compiler/llvmGen/Llvm/PpLlvm.hs

index 2d4be3f..a709a05 100644 (file)
@@ -314,12 +314,31 @@ ppSyncOrdering SyncRelease   = text "release"
 ppSyncOrdering SyncAcqRel    = text "acq_rel"
 ppSyncOrdering SyncSeqCst    = text "seq_cst"
 
-ppLoad :: LlvmVar -> SDoc
-ppLoad var = text "load" <+> texts var
+-- XXX: On x86, vector types need to be 16-byte aligned for aligned access, but
+-- we have no way of guaranteeing that this is true with GHC (we would need to
+-- modify the layout of the stack and closures, change the storage manager,
+-- etc.). So, we blindly tell LLVM that *any* vector store or load could be
+-- unaligned. In the future we may be able to guarantee that certain vector
+-- access patterns are aligned, in which case we will need a more granular way
+-- of specifying alignment.
 
+ppLoad :: LlvmVar -> SDoc
+ppLoad var
+    | isVecPtrVar var = text "load" <+> texts var <>
+                        comma <+> text "align 1"
+    | otherwise       = text "load" <+> texts var
+  where
+    isVecPtrVar :: LlvmVar -> Bool
+    isVecPtrVar = isVector . pLower . getVarType
 
 ppStore :: LlvmVar -> LlvmVar -> SDoc
-ppStore val dst = text "store" <+> texts val <> comma <+> texts dst
+ppStore val dst
+    | isVecPtrVar dst = text "store" <+> texts val <> comma <+> texts dst <>
+                        comma <+> text "align 1"
+    | otherwise       = text "store" <+> texts val <> comma <+> texts dst
+  where
+    isVecPtrVar :: LlvmVar -> Bool
+    isVecPtrVar = isVector . pLower . getVarType
 
 
 ppCast :: LlvmCastOp -> LlvmVar -> LlvmType -> SDoc