Hi guys, Thanks for the input. However, it seems that the code still produces the wrong output on a Sparc machine. My current llvm_print.bc code is: -------------------------------------------------------------------------------------------------- ; MduleID = '<stdin>' target datalayout "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32" target triple = "sparc-unknown-linux" @P = global i32 1 @dP = global i32 1 @.str = private constant [4 x i8] c"%d\0A\00", align 1 define i32 @main() nounwind { entry: %. = load i32* @P, align 4 %t1 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %. ) nounwind %d. = load i32* @dP, align 4 %t2 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %d. ) nounwind %0 = icmp sgt i32 %., 0 %1 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %0 ) nounwind %2 = icmp sgt i32 %d., 0 %3 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %2 ) nounwind %t3 = icmp eq i32 %d., %d. %t4 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %t3 ) nounwind %4 = icmp sgt i32 1, 0 %5 = icmp sgt i32 1, 0 %6 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %4 ) nounwind %7 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %5 ) nounwind ret i32 undef } declare i32 @printf(i8* nocapture, ...) nounwind -------------------------------------------------------------------------------------------------- The output is still: 1 1 0 0 1 1 1 which should be all ones. Is there a sign error somewhere? Thanks a lot! Christine On Thu, Sep 15, 2011 at 11:28 AM, Bruno Cardoso Lopes < bruno.cardoso at gmail.com> wrote:> On Thu, Sep 15, 2011 at 11:06 AM, Christine Cheng <clcheng at stanford.edu> > wrote: > > Hi Duncan, > > > > Thanks for the reply! There is no LLVM on the Sparc machine so I cannot > > compile my code there into .s file. How shall I modify the target data > > layout and triple so it works on Sparc? Basically I got these from > compiling > > C code using llvm-gcc. > > You can use clang for that: > clang -ccc-host-triple sparc-unknown-linux -ccc-clang-archs sparc ... > > > -- > Bruno Cardoso Lopes > http://www.brunocardoso.cc >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110915/069d0be7/attachment.html>
Hi, On Thu, Sep 15, 2011 at 3:15 PM, Christine Cheng <clcheng at stanford.edu> wrote:> Hi guys, > > Thanks for the input. However, it seems that the code still produces the > wrong output on a Sparc machine. > > My current llvm_print.bc code is: > -------------------------------------------------------------------------------------------------- > ; MduleID = '<stdin>' > target datalayout > "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32" > target triple = "sparc-unknown-linux" > > @P = global i32 1 > @dP = global i32 1 > > @.str = private constant [4 x i8] c"%d\0A\00", align 1 > > define i32 @main() nounwind { > > entry: > %. = load i32* @P, align 4 > %t1 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr > inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %. ) nounwind > %d. = load i32* @dP, align 4 > %t2 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr > inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %d. ) nounwind > %0 = icmp sgt i32 %., 0 > %1 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds > ([4 x i8]* @.str, i32 0, i32 0), i1 %0 ) nounwind > %2 = icmp sgt i32 %d., 0 > %3 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr > inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %2 ) nounwind > %t3 = icmp eq i32 %d., %d. > %t4 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr > inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %t3 ) nounwind > %4 = icmp sgt i32 1, 0 > %5 = icmp sgt i32 1, 0 > %6 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr > inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %4 ) nounwind > %7 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr > inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %5 ) nounwind > ret i32 undef > } > > declare i32 @printf(i8* nocapture, ...) nounwind > > -------------------------------------------------------------------------------------------------- > > The output is still: > > 1 > 1 > 0 > 0 > 1 > 1 > 1 > > which should be all ones. Is there a sign error somewhere?Please file a bug to llvm.org/bugs I don't know of anyone working on Sparc right now, so if you could dig and find out what llvm is generating wrong, someone may provide a fix faster. Or if you're willing to right a patch that would be even better! :) -- Bruno Cardoso Lopes http://www.brunocardoso.cc
Venkatraman Govindaraju
2011-Sep-16 21:29 UTC
[LLVMdev] problem with sgt's on Sparc machine
Hello, What is your LLVM version? Also, can you attach the assembly generated? Thanks, Venkatraman On Thu, Sep 15, 2011 at 5:20 PM, Bruno Cardoso Lopes <bruno.cardoso at gmail.com> wrote:> Hi, > > On Thu, Sep 15, 2011 at 3:15 PM, Christine Cheng <clcheng at stanford.edu> wrote: >> Hi guys, >> >> Thanks for the input. However, it seems that the code still produces the >> wrong output on a Sparc machine. >> >> My current llvm_print.bc code is: >> -------------------------------------------------------------------------------------------------- >> ; MduleID = '<stdin>' >> target datalayout >> "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32" >> target triple = "sparc-unknown-linux" >> >> @P = global i32 1 >> @dP = global i32 1 >> >> @.str = private constant [4 x i8] c"%d\0A\00", align 1 >> >> define i32 @main() nounwind { >> >> entry: >> %. = load i32* @P, align 4 >> %t1 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr >> inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %. ) nounwind >> %d. = load i32* @dP, align 4 >> %t2 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr >> inbounds ([4 x i8]* @.str, i32 0, i32 0), i32 %d. ) nounwind >> %0 = icmp sgt i32 %., 0 >> %1 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds >> ([4 x i8]* @.str, i32 0, i32 0), i1 %0 ) nounwind >> %2 = icmp sgt i32 %d., 0 >> %3 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr >> inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %2 ) nounwind >> %t3 = icmp eq i32 %d., %d. >> %t4 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr >> inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %t3 ) nounwind >> %4 = icmp sgt i32 1, 0 >> %5 = icmp sgt i32 1, 0 >> %6 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr >> inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %4 ) nounwind >> %7 = tail call i32 (i8*, ...)* @printf(i8* noalias getelementptr >> inbounds ([4 x i8]* @.str, i32 0, i32 0), i1 %5 ) nounwind >> ret i32 undef >> } >> >> declare i32 @printf(i8* nocapture, ...) nounwind >> >> -------------------------------------------------------------------------------------------------- >> >> The output is still: >> >> 1 >> 1 >> 0 >> 0 >> 1 >> 1 >> 1 >> >> which should be all ones. Is there a sign error somewhere? > > Please file a bug to llvm.org/bugs > I don't know of anyone working on Sparc right now, so if you could dig > and find out what llvm is generating wrong, someone may provide a fix > faster. Or if you're willing to right a patch that would be even > better! :) > > -- > Bruno Cardoso Lopes > http://www.brunocardoso.cc > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >