[LLVMdev] Bug in optimization pass related to strcmp and big endian back-ends

Stripf, Timo Timo.Stripf at itiv.uni-karlsruhe.de
Tue Aug 11 01:13:12 PDT 2009


Hi all,

 

i'm working on a LLVM back-end right now and i think I found a bug in an
optimization pass. When compiling the following code using llvm-gcc (the
current 2.5 release) with -O2 

 

int main(int argc, char** argv) {

            char* pStr = "I" + (argc > 100);

            

            printf("%d\n", strcmp(pStr, "I") == 0);

}

 

the strcmp function is replaced by a 16 bit load and compared against
the integer value of 'I':

 

define i32 @main(i32 %argc, i8** nocapture %argv) nounwind {

entry:

            %0 = icmp sgt i32 %argc, 100               ; <i1> [#uses=1]

            %1 = zext i1 %0 to i32              ; <i32> [#uses=1]

            %2 = getelementptr [2 x i8]* @.str, i32 0, i32 %1
; <i8*> [#uses=1]

            %tmp = bitcast i8* %2 to i16*                ; <i16*>
[#uses=1]

            %lhsv = load i16* %tmp, align 1             ; <i16>
[#uses=1]

            %3 = icmp eq i16 %lhsv, 73                  ; <i1> [#uses=1]

            %4 = zext i1 %3 to i32              ; <i32> [#uses=1]

            %5 = tail call i32 (i8*, ...)* @printf(i8* getelementptr ([4
x i8]* @.str1, i32 0, i32 0), i32 %4) nounwind                    ;
<i32> [#uses=0]

            ret i32 undef

}

 

On little endian machines the code works correct but on big endian %lhsv
must be compared against 73 << 8.

 

Kind regards

Timo Stripf

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090811/9ec73875/attachment.html>


More information about the llvm-dev mailing list