[PATCH] D16160: Make sure we preserve alignment information after hoisting invariant load

Lawrence Hu via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 13 15:38:35 PST 2016


hulx2000 created this revision.
hulx2000 added a reviewer: grosser.
hulx2000 added a subscriber: llvm-commits.
hulx2000 set the repository for this revision to rL LLVM.
hulx2000 added a project: Polly.

In polly, after hoisting loop invariant loads outside loop, the alignment information for hoisted loads are missing, this patch restore them.

Repository:
  rL LLVM

http://reviews.llvm.org/D16160

Files:
  lib/CodeGen/IslNodeBuilder.cpp
  test/Isl/CodeGen/invaraint_load_hoist_alignment.ll

Index: test/Isl/CodeGen/invaraint_load_hoist_alignment.ll
===================================================================
--- /dev/null
+++ test/Isl/CodeGen/invaraint_load_hoist_alignment.ll
@@ -0,0 +1,31 @@
+; RUN: opt %loadPolly -basicaa -polly-codegen -polly-vectorizer=polly -S %s | FileCheck %s
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-unknown-linux-gnu"
+
+ at A = common global [1024 x i32] zeroinitializer, align 16
+ at B = common global [1024 x i32] zeroinitializer, align 16
+
+declare i32 @foo(i32) readnone
+
+define void @force_alignment() nounwind {
+;CHECK: @force_alignment
+;CHECK-FORCED: @force_alignment
+entry:
+  br label %body
+
+body:
+  %indvar = phi i64 [ 0, %entry ], [ %indvar_next, %body ]
+  %scevgep = getelementptr [1024 x i32], [1024 x i32]* @B, i64 0, i64 %indvar
+; CHECK: [[T2:%.load]] = load i32, i32* getelementptr inbounds ([1024 x i32], [1024 x i32]* @A, i32 0, i32 0), align 4
+; CHECK: %value_p.splatinsert = insertelement <4 x i32> undef, i32 [[T2]], i32 0
+  %value = load i32, i32* getelementptr inbounds ([1024 x i32], [1024 x i32]* @A, i64 0, i64 0), align 4
+  %result = tail call i32 @foo(i32 %value) nounwind
+  store i32 %result, i32* %scevgep, align 4
+  %indvar_next = add i64 %indvar, 1
+  %exitcond = icmp eq i64 %indvar_next, 4
+  br i1 %exitcond, label %return, label %body
+
+return:
+  ret void
+}
+
Index: lib/CodeGen/IslNodeBuilder.cpp
===================================================================
--- lib/CodeGen/IslNodeBuilder.cpp
+++ lib/CodeGen/IslNodeBuilder.cpp
@@ -941,6 +941,9 @@
   Value *PreloadVal = nullptr;
   if (AlwaysExecuted) {
     PreloadVal = preloadUnconditionally(AccessRange, Build, AccInstTy);
+    if (LoadInst *PreloadInst = dyn_cast<LoadInst>(PreloadVal))
+      PreloadInst->setAlignment(dyn_cast<LoadInst>(AccInst)->getAlignment());
+
     isl_ast_build_free(Build);
     isl_set_free(Domain);
     return PreloadVal;
@@ -985,6 +988,8 @@
 
   Builder.SetInsertPoint(ExecBB->getTerminator());
   Value *PreAccInst = preloadUnconditionally(AccessRange, Build, AccInstTy);
+  if (LoadInst *PreloadInst = dyn_cast<LoadInst>(PreAccInst))
+    PreloadInst->setAlignment(dyn_cast<LoadInst>(AccInst)->getAlignment());
 
   Builder.SetInsertPoint(MergeBB->getTerminator());
   auto *MergePHI = Builder.CreatePHI(


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16160.44801.patch
Type: text/x-patch
Size: 2446 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160113/25038082/attachment.bin>


More information about the llvm-commits mailing list