[llvm-commits] [llvm] r152907 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll

Bill Wendling isanbard at gmail.com
Fri Mar 16 00:40:09 PDT 2012


Author: void
Date: Fri Mar 16 02:40:08 2012
New Revision: 152907

URL: http://llvm.org/viewvc/llvm-project?rev=152907&view=rev
Log:
The alignment of the pointer part of the store instruction may have an
alignment. If that's the case, then we want to make sure that we don't increase
the alignment of the store instruction. Because if we increase it to be "more
aligned" than the pointer, code-gen may use instructions which require a greater
alignment than the pointer guarantees.
<rdar://problem/11043589>

Added:
    llvm/trunk/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll
Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp?rev=152907&r1=152906&r2=152907&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp Fri Mar 16 02:40:08 2012
@@ -379,10 +379,22 @@
     unsigned EffectiveStoreAlign = StoreAlign != 0 ? StoreAlign :
       TD->getABITypeAlignment(Val->getType());
 
-    if (KnownAlign > EffectiveStoreAlign)
+    if (KnownAlign > EffectiveStoreAlign) {
       SI.setAlignment(KnownAlign);
-    else if (StoreAlign == 0)
-      SI.setAlignment(EffectiveStoreAlign);
+    } else if (StoreAlign == 0) {
+      unsigned PtrAlign = 0;
+      if (GlobalValue *GV = dyn_cast<GlobalValue>(Ptr->stripPointerCasts()))
+        PtrAlign = GV->getAlignment();
+
+      if (PtrAlign != 0 && PtrAlign < EffectiveStoreAlign)
+        // The pointer alignment may be less than the effective store
+        // alignment. If so, then we don't want to increase the alignment here,
+        // since that could lead to code-gen using instructions which require a
+        // higher alignment than the pointer guarantees.
+        SI.setAlignment(PtrAlign);
+      else
+        SI.setAlignment(EffectiveStoreAlign);
+    }
   }
 
   // Don't hack volatile/atomic stores.

Added: llvm/trunk/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll?rev=152907&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/2012-03-16-StoreAlignment.ll Fri Mar 16 02:40:08 2012
@@ -0,0 +1,12 @@
+; RUN: opt < %s -S -instcombine | 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-S128"
+
+%0 = type { i32, i8, i8, i8 }
+
+ at G = external hidden global %0, align 4
+
+define void @f1(i64 %a1) nounwind ssp align 2 {
+; CHECK: store i64 %a1, i64* bitcast (%0* @G to i64*), align 4                                                                                                                                                          
+  store i64 %a1, i64* bitcast (%0* @G to i64*)
+  ret void
+}





More information about the llvm-commits mailing list