[llvm] r282177 - [DAG] Fix incorrect alignment of ext load.

Nirav Dave via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 22 10:28:43 PDT 2016


Author: niravd
Date: Thu Sep 22 12:28:43 2016
New Revision: 282177

URL: http://llvm.org/viewvc/llvm-project?rev=282177&view=rev
Log:
[DAG] Fix incorrect alignment of ext load.

Correctly use alignment size from loaded size not output value size.

Reviewers: jyknight, tstellarAMD, arsenm

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D23356

Added:
    llvm/trunk/test/CodeGen/AMDGPU/extload-align.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=282177&r1=282176&r2=282177&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Sep 22 12:28:43 2016
@@ -5057,7 +5057,7 @@ SDValue SelectionDAG::getLoad(ISD::MemIn
   assert(Chain.getValueType() == MVT::Other &&
         "Invalid chain type");
   if (Alignment == 0)  // Ensure that codegen never sees alignment 0
-    Alignment = getEVTAlignment(VT);
+    Alignment = getEVTAlignment(MemVT);
 
   MMOFlags |= MachineMemOperand::MOLoad;
   assert((MMOFlags & MachineMemOperand::MOStore) == 0);

Added: llvm/trunk/test/CodeGen/AMDGPU/extload-align.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/extload-align.ll?rev=282177&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AMDGPU/extload-align.ll (added)
+++ llvm/trunk/test/CodeGen/AMDGPU/extload-align.ll Thu Sep 22 12:28:43 2016
@@ -0,0 +1,23 @@
+; RUN: llc -debug-only=misched -march=amdgcn -verify-machineinstrs %s -o - 2>&1| FileCheck -check-prefix=SI-NOHSA -check-prefix=FUNC -check-prefix=DEBUG %s
+; REQUIRES: asserts
+
+; Verify that the extload generated from %eval has the default
+; alignment size (2) corresponding to the underlying memory size (i16)
+; size and not 4 corresponding to the sign-extended size (i32).
+
+; DEBUG: {{^}}# Machine code for function extload_align:
+; DEBUG: mem:LD2[<unknown>]{{[^(]}}
+; DEBUG: {{^}}# End machine code for function extload_align.
+
+define void @extload_align(i32* %out, i32 %index) #0 {
+  %v0 = alloca [4 x i16]
+  %a1 = getelementptr inbounds [4 x i16], [4 x i16]* %v0, i32 0, i32 0
+  %a2 = getelementptr inbounds [4 x i16], [4 x i16]* %v0, i32 0, i32 1
+  store i16 0, i16* %a1
+  store i16 1, i16* %a2
+  %a = getelementptr inbounds [4 x i16], [4 x i16]* %v0, i32 0, i32 %index
+  %val = load i16, i16* %a
+  %eval = sext i16 %val to i32
+  store i32 %eval, i32* %out
+  ret void
+}
\ No newline at end of file




More information about the llvm-commits mailing list