You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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) {
Extended Description
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) {
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*, ...)
The text was updated successfully, but these errors were encountered: