[LLVMbugs] [Bug 3923] New: Undef store doesn't clobber earlier stores: overaggressive instcombine

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Wed Apr 1 13:39:00 PDT 2009


http://llvm.org/bugs/show_bug.cgi?id=3923

           Summary: Undef store doesn't clobber earlier stores:
                    overaggressive instcombine
           Product: libraries
           Version: 2.5
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: minor
          Priority: P2
         Component: Scalar Optimizations
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: jyasskin at google.com
                CC: llvmbugs at cs.uiuc.edu, nlewycky at google.com


In some admittedly naive stack-based code, I'm trying to store undef into
popped stack locations so that LLVM will optimize away unneeded stores.
However, the instcombine pass seems to eliminate undef stores before other
passes can use them.

Here's the original code:

$ llvm-dis <~/tmp/dead_store.bc 
; ModuleID = '<stdin>'

declare i32 @rand()

define i32 @foo(i32* %stack) {
entry:
        %0 = call i32 @rand()           ; <i32> [#uses=1]
        store i32 %0, i32* %stack
        %1 = load i32* %stack           ; <i32> [#uses=1]
        store i32 undef, i32* %stack
        ret i32 %1
}

GVN + DSE does the right thing:

$ opt -gvn -dse ~/tmp/dead_store.bc |llvm-dis
; ModuleID = '<stdin>'

declare i32 @rand()

define i32 @foo(i32* %stack) {
entry:
        %0 = call i32 @rand()           ; <i32> [#uses=1]
        store i32 undef, i32* %stack
        ret i32 %0
}

But instcombine alone just removes the "store i32 undef...", which means no
subsequent pass can optimize away the store I was trying to clobber.

$ opt -instcombine ~/tmp/dead_store.bc |llvm-dis
; ModuleID = '<stdin>'

declare i32 @rand()

define i32 @foo(i32* %stack) {
entry:
        %0 = call i32 @rand()           ; <i32> [#uses=2]
        store i32 %0, i32* %stack
        ret i32 %0
}

This causes -O3 and -std-compile-opts to fail to optimize the code too:

$ opt -O3 ~/tmp/dead_store.bc |llvm-dis
; ModuleID = '<stdin>'

declare i32 @rand()

define i32 @foo(i32* %stack) {
entry:
        %0 = tail call i32 @rand()              ; <i32> [#uses=2]
        store i32 %0, i32* %stack
        ret i32 %0
}


-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list