I have the following function:
define void @test_fc_0_kernel(i16 signext %x, i16 signext %y, i16
addrspace(11)* %input, i32 addrspace(11)* %result) {
entry:
%call = tail call i32 @get_id(i32 0) ;
<i32> [#uses=2]
%cmp = icmp slt i16 %x, %y ; <i1> [#uses=1]
br i1 %cmp, label %if.then, label %if.end
if.end: ; preds = %entry
ret void
if.then: ; preds = %entry
%arrayidx = getelementptr i32 addrspace(11)* %result, i32
%call ; <i32 addrspace(11)*> [#uses=1]
%arrayidx7 = getelementptr i16 addrspace(11)* %input, i32
%call ; <i16 addrspace(11)*> [#uses=1]
%tmp8 = load i16 addrspace(11)* %arrayidx7
; <i16> [#uses=1]
%conv9 = sext i16 %tmp8 to i32 ; <i32> [#uses=1]
store i32 %conv9, i32 addrspace(11)* %arrayidx
ret void
}
This function should read from a memory location from input and write to
result with a promotion from i16 to i32, which seems simple enough. The
problem that I am having is somewhere along the line the 16bit load is
being promoted to a 32bit load and then the lower 16 bits are being sign
extended away with a shl 16 followed by a shr 16.
The problem with this is that
1) I'm limited to 32bit aligned loads and llvm is assuming a
16bit/8bit alignment
2) I have special functions that I need to be called when a load
of sub32bit data type occurs which handles the alignment constraints and
then does the shifting and masking of the data
So my questions are:
What bits do I need to flip to stop this optimization from occurring?
What do I need to set to correctly get the loads/stores generated if not
setting the datalayout string in my targetmachine class?
Thanks,
Micah Villmow
Systems Engineer
Advanced Technology & Performance
Advanced Micro Devices Inc.
S1-609 One AMD Place
Sunnyvale, CA. 94085
P: 408-749-3966
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20090212/510e8534/attachment.html>
On Thu, Feb 12, 2009 at 4:53 PM, Villmow, Micah <Micah.Villmow at amd.com> wrote:> The > problem that I am having is somewhere along the line the 16bit load is being > promoted to a 32bit loadFor the given testcase, that's clearly illegal. Either there's a serious bug in LLVM, or you're misinterpreting the meaning of the DAG. Are you sure you aren't seeing a sign-extending load? If you don't want to bother supporting extending loads, you can use setLoadExtAction to make Legalize take care of it.> 1) I'm limited to 32bit aligned loads and llvm is assuming a > 16bit/8bit alignmentYou shouldn't be seeing any unaligned loads post-Legalize unless you explicitly ask for them by setting allowUnalignedMemoryAccesses to true. -Eli
Hi,> This function should read from a memory location from input and write to > result with a promotion from i16 to i32, which seems simple enough. The > problem that I am having is somewhere along the line the 16bit load is > being promoted to a 32bit load and then the lower 16 bits are being sign > extended away with a shl 16 followed by a shr 16.most likely it is being turned into an i32 extending load (extended from i16). You have to read the SDag node dumps carefully to notice this. Being an extending load means that only 16 bits will actually be loaded (only two bytes of memory touched), but the result will be an i32. Hard to say anything more without details. Ciao, Duncan.
Eli, Thanks that worked. ;) Micah -----Original Message----- From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Eli Friedman Sent: Thursday, February 12, 2009 5:52 PM To: LLVM Developers Mailing List Subject: Re: [LLVMdev] 16bit loads being promoted to 32bit? On Thu, Feb 12, 2009 at 4:53 PM, Villmow, Micah <Micah.Villmow at amd.com> wrote:> The > problem that I am having is somewhere along the line the 16bit load isbeing> promoted to a 32bit loadFor the given testcase, that's clearly illegal. Either there's a serious bug in LLVM, or you're misinterpreting the meaning of the DAG. Are you sure you aren't seeing a sign-extending load? If you don't want to bother supporting extending loads, you can use setLoadExtAction to make Legalize take care of it.> 1) I'm limited to 32bit aligned loads and llvm is assuming a > 16bit/8bit alignmentYou shouldn't be seeing any unaligned loads post-Legalize unless you explicitly ask for them by setting allowUnalignedMemoryAccesses to true. -Eli _______________________________________________ LLVM Developers mailing list LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev