[llvm] r260678 - [Hexagon] Specify vector alignment in DataLayout string

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 12 06:47:39 PST 2016


Author: kparzysz
Date: Fri Feb 12 08:47:38 2016
New Revision: 260678

URL: http://llvm.org/viewvc/llvm-project?rev=260678&view=rev
Log:
[Hexagon] Specify vector alignment in DataLayout string

The DataLayout can calculate alignment of vectors based on the alignment
of the element type and the number of elements. In fact, it is the product
of these two values. The problem is that for vectors of N x i1, this will
return the alignment of N bytes, since the alignment of i1 is 8 bits. The
vector types of vNi1 should be aligned to N bits instead. Provide explicit
alignment for HVX vectors to avoid such complications.


Added:
    llvm/trunk/test/CodeGen/Hexagon/vector-align.ll
Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp

Modified: llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp?rev=260678&r1=260677&r2=260678&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonTargetMachine.cpp Fri Feb 12 08:47:38 2016
@@ -121,19 +121,19 @@ namespace llvm {
   FunctionPass *createHexagonStoreWidening();
 } // end namespace llvm;
 
-/// HexagonTargetMachine ctor - Create an ILP32 architecture model.
-///
 
-/// Hexagon_TODO: Do I need an aggregate alignment?
-///
 HexagonTargetMachine::HexagonTargetMachine(const Target &T, const Triple &TT,
                                            StringRef CPU, StringRef FS,
                                            const TargetOptions &Options,
                                            Reloc::Model RM, CodeModel::Model CM,
                                            CodeGenOpt::Level OL)
-    : LLVMTargetMachine(T, "e-m:e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-"
-                        "i1:8:8-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a:0-"
-                        "n16:32", TT, CPU, FS, Options, RM, CM, OL),
+    // Specify the vector alignment explicitly. For v512x1, the calculated
+    // alignment would be 512*alignment(i1), which is 512 bytes, instead of
+    // the required minimum of 64 bytes.
+    : LLVMTargetMachine(T, "e-m:e-p:32:32:32-a:0-n16:32-"
+         "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
+         "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048",
+         TT, CPU, FS, Options, RM, CM, OL),
       TLOF(make_unique<HexagonTargetObjectFile>()) {
   initAsmInfo();
 }

Added: llvm/trunk/test/CodeGen/Hexagon/vector-align.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/vector-align.ll?rev=260678&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/vector-align.ll (added)
+++ llvm/trunk/test/CodeGen/Hexagon/vector-align.ll Fri Feb 12 08:47:38 2016
@@ -0,0 +1,38 @@
+; RUN: llc -march=hexagon -mcpu=hexagonv60 -enable-hexagon-hvx < %s \
+; RUN:    | FileCheck %s
+
+; Check that the store to Q6VecPredResult does not get expanded into multiple
+; stores. There should be no memd's. This relies on the alignment specified
+; in the data layout string, so don't provide one here to make sure that the
+; default one from HexagonTargetMachine is correct.
+
+; CHECK-NOT: memd
+
+
+ at Q6VecPredResult = common global <16 x i32> zeroinitializer, align 64
+
+; Function Attrs: nounwind
+define i32 @foo() #0 {
+entry:
+  %0 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 1)
+  %1 = tail call <512 x i1> @llvm.hexagon.V6.vandvrt(<16 x i32> %0, i32 -2147483648)
+  store <512 x i1> %1, <512 x i1>* bitcast (<16 x i32>* @Q6VecPredResult to <512 x i1>*), align 64, !tbaa !1
+  tail call void @print_vecpred(i32 64, i8* bitcast (<16 x i32>* @Q6VecPredResult to i8*)) #3
+  ret i32 0
+}
+
+; Function Attrs: nounwind readnone
+declare <512 x i1> @llvm.hexagon.V6.vandvrt(<16 x i32>, i32) #1
+
+; Function Attrs: nounwind readnone
+declare <16 x i32> @llvm.hexagon.V6.lvsplatw(i32) #1
+
+declare void @print_vecpred(i32, i8*) #2
+
+attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvx" }
+attributes #1 = { nounwind readnone }
+attributes #2 = { nounwind }
+
+!1 = !{!2, !2, i64 0}
+!2 = !{!"omnipotent char", !3, i64 0}
+!3 = !{!"Simple C/C++ TBAA"}




More information about the llvm-commits mailing list