There's a bug in folding loads of static initializers. If there are bytes with the high bit set, adjacent bytes are getting set to all ones when the compiler is running on a host with signed char. Here's a patch that fixes it: Index: SelectionDAGISel.cpp =================================================================== RCS file: /var/cvs/llvm/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp,v retrieving revision 1.319 diff -u -r1.319 SelectionDAGISel.cpp --- SelectionDAGISel.cpp +++ SelectionDAGISel.cpp @@ -3179,7 +3179,7 @@ if (TLI.isLittleEndian()) Offset = Offset + MSB - 1; for (unsigned i = 0; i != MSB; ++i) { - Val = (Val << 8) | Str[Offset]; + Val = (Val << 8) | (unsigned char) Str[Offset]; Offset += TLI.isLittleEndian() ? -1 : 1; } return DAG.getConstant(Val, VT); And here's a testcase that reproduces the problem. target datalayout = "e-p:32:32" target endian = little target pointersize = 32 target triple = "i686-pc-linux-gnu" %fmt = constant [4 x sbyte] c"%x\0A\00" %bytes = constant [4 x sbyte] c"\AA\BB\CC\DD" implementation int %main() { %y = alloca uint %c = cast uint* %y to sbyte* %z = getelementptr [4 x sbyte]* %bytes, int 0, int 0 call void %llvm.memcpy.i32( sbyte* %c, sbyte* %z, uint 4, uint 1 ) %r = load uint* %y %t = cast [4 x sbyte]* %fmt to sbyte* %tmp = call int (sbyte*, ...)* %printf( sbyte* %t, uint %r ) ret int 0 } declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint) declare int %printf(sbyte*, ...)
Patch applied. Thanks!