Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

folding load of non-constant initializer #1395

Closed
sunfishcode opened this issue Nov 28, 2006 · 1 comment
Closed

folding load of non-constant initializer #1395

sunfishcode opened this issue Nov 28, 2006 · 1 comment
Labels
bugzilla Issues migrated from bugzilla llvm:codegen miscompilation

Comments

@sunfishcode
Copy link
Member

Bugzilla Link 1023
Resolution FIXED
Resolved on Feb 22, 2010 12:47
Version trunk
OS Linux

Extended Description

The logic that folds loads of static initializers doesn't take into account
whether the variable being initialized may be modified at runtime.

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
@@ -3298,7 +3298,7 @@
}
if (G) {
GlobalVariable *GV = dyn_cast(G->getGlobal());

  •      if (GV) {
    
  •      if (GV && GV->isConstant()) {
           Str = GV->getStringValue(false);
           if (!Str.empty()) {
             CopyFromStr = true;
    

And here's a testcase that reproduces it:

target datalayout = "e-p:32:32"
target endian = little
target pointersize = 32
target triple = "i686-pc-linux-gnu"
%fmt = global [4 x sbyte] c"%x\0A\00"
%bytes = global [4 x sbyte] c"\AA\BB\CC\DD"

implementation

void %foo() {
%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 void
}

declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint)

declare int %printf(sbyte*, ...)

@llvmbot
Copy link
Collaborator

llvmbot commented Nov 29, 2006

Patch applied. Thanks!

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 3, 2021
clementval added a commit to clementval/llvm-project that referenced this issue Jan 20, 2022
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugzilla Issues migrated from bugzilla llvm:codegen miscompilation
Projects
None yet
Development

No branches or pull requests

2 participants