Hi All,
I am using llvm-2.9 to cross compile to alpha. I know that alpha is in
experimental stage, but i can not get even the "Hello World" program
to run
on it.
Here is what happens, the bitcode file for the hello world program is as
follow:
; ModuleID = 'hello.bc'
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"
@.str = private constant [12 x i8] c"Hello World\00", align 1
define i32 @main() nounwind {
entry:
%retval = alloca i32
%0 = alloca i32
%"alloca point" = bitcast i32 0 to i32
*%1 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64 0,
i64 0)) nounwind*
store i32 0, i32* %0, align 4
%2 = load i32* %0, align 4
store i32 %2, i32* %retval, align 4
br label %return
return: ; preds = %entry
%retval1 = load i32* %retval
ret i32 %retval1
}
declare i32 @puts(i8*)
The .str is present in the argument to the puts function in %1 is present in
the bitcode.
But when i use llc to change the bitcode to alpha assembly, i get the
following:
ldah $29,0($27) !gpdisp!1
lda $29,0($29) !gpdisp!1
$main..ng:
lda $30,-32($30)
stq $9,24($30)
stq $11,16($30)
bis $26,$26,$9
* ldq $27,puts($29) * !literal
lda $11,8($30)
jsr $26,($27),0
The puts call is there, but register 16 which i believe is supposed to have
the arguments to a function call is not set.
If i manually add the line to the assembly,
lda $16, $.str($29)
where $.str is defined in the assembly to be the appropriate string, it
works fine, and i get the hello world output.
It seems that for some reason llc is not setting the argument of the
function call.
Are there any tests for alpha assembly that presently work with function
call? I would like to confirm that something with alpha is working.
--
Ankit
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20110629/6baea47a/attachment.html>
Hi, I found that machine dead code elimination, does not respect the calling convention of alpha and eliminates r16, which was set correctly during code generation. I verified it with -print-after-all. Does anybody have a patch for this? On Wed, Jun 29, 2011 at 11:12 AM, Ankit Sethia <asethia at eecs.umich.edu>wrote:> Hi All, > > I am using llvm-2.9 to cross compile to alpha. I know that alpha is in > experimental stage, but i can not get even the "Hello World" program to run > on it. > > Here is what happens, the bitcode file for the hello world program is as > follow: > > ; ModuleID = 'hello.bc' > 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" > > @.str = private constant [12 x i8] c"Hello World\00", align 1 > > define i32 @main() nounwind { > entry: > %retval = alloca i32 > %0 = alloca i32 > %"alloca point" = bitcast i32 0 to i32 > *%1 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64 > 0, i64 0)) nounwind* > store i32 0, i32* %0, align 4 > %2 = load i32* %0, align 4 > store i32 %2, i32* %retval, align 4 > br label %return > > return: ; preds = %entry > %retval1 = load i32* %retval > ret i32 %retval1 > } > > declare i32 @puts(i8*) > > The .str is present in the argument to the puts function in %1 is present > in the bitcode. > But when i use llc to change the bitcode to alpha assembly, i get the > following: > > > ldah $29,0($27) !gpdisp!1 > lda $29,0($29) !gpdisp!1 > $main..ng: > lda $30,-32($30) > stq $9,24($30) > stq $11,16($30) > bis $26,$26,$9 > * ldq $27,puts($29) * !literal > lda $11,8($30) > jsr $26,($27),0 > > > The puts call is there, but register 16 which i believe is supposed to have > the arguments to a function call is not set. > If i manually add the line to the assembly, > > lda $16, $.str($29) > > where $.str is defined in the assembly to be the appropriate string, it > works fine, and i get the hello world output. > It seems that for some reason llc is not setting the argument of the > function call. > > Are there any tests for alpha assembly that presently work with function > call? I would like to confirm that something with alpha is working. > > > > > -- > Ankit >-- Ankit -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110629/b6e77d84/attachment.html>
Hi, Can people suggest how this is solved for other ISAs? This happens only for Alpha and not for x86-64. The register 16 does not have any uses within that function, but is used inside puts. So Machine DCE thinks it is dead code. On Wed, Jun 29, 2011 at 4:20 PM, Ankit Sethia <asethia at eecs.umich.edu>wrote:> Hi, > > I found that machine dead code elimination, does not respect the calling > convention of alpha and eliminates r16, which was set correctly during code > generation. I verified it with -print-after-all. > Does anybody have a patch for this? > > On Wed, Jun 29, 2011 at 11:12 AM, Ankit Sethia <asethia at eecs.umich.edu>wrote: > >> Hi All, >> >> I am using llvm-2.9 to cross compile to alpha. I know that alpha is in >> experimental stage, but i can not get even the "Hello World" program to run >> on it. >> >> Here is what happens, the bitcode file for the hello world program is as >> follow: >> >> ; ModuleID = 'hello.bc' >> 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" >> >> @.str = private constant [12 x i8] c"Hello World\00", align 1 >> >> define i32 @main() nounwind { >> entry: >> %retval = alloca i32 >> %0 = alloca i32 >> %"alloca point" = bitcast i32 0 to i32 >> *%1 = call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64 >> 0, i64 0)) nounwind* >> store i32 0, i32* %0, align 4 >> %2 = load i32* %0, align 4 >> store i32 %2, i32* %retval, align 4 >> br label %return >> >> return: ; preds = %entry >> %retval1 = load i32* %retval >> ret i32 %retval1 >> } >> >> declare i32 @puts(i8*) >> >> The .str is present in the argument to the puts function in %1 is present >> in the bitcode. >> But when i use llc to change the bitcode to alpha assembly, i get the >> following: >> >> >> ldah $29,0($27) !gpdisp!1 >> lda $29,0($29) !gpdisp!1 >> $main..ng: >> lda $30,-32($30) >> stq $9,24($30) >> stq $11,16($30) >> bis $26,$26,$9 >> * ldq $27,puts($29) * !literal >> lda $11,8($30) >> jsr $26,($27),0 >> >> >> The puts call is there, but register 16 which i believe is supposed to >> have the arguments to a function call is not set. >> If i manually add the line to the assembly, >> >> lda $16, $.str($29) >> >> where $.str is defined in the assembly to be the appropriate string, it >> works fine, and i get the hello world output. >> It seems that for some reason llc is not setting the argument of the >> function call. >> >> Are there any tests for alpha assembly that presently work with function >> call? I would like to confirm that something with alpha is working. >> >> >> >> >> -- >> Ankit >> > > > > -- > Ankit >-- Ankit -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110629/1630c635/attachment.html>