; This testcase tests for a problem where LICM hoists loads out of a loop | |
; despite the fact that calls to unknown functions may modify what is being | |
; loaded from. Basically if the load gets hoisted, the subtract gets turned | |
; into a constant zero. | |
; | |
; RUN: opt < %s -licm -gvn -instcombine -S | grep load | |
@X = global i32 7 ; <i32*> [#uses=2] | |
declare void @foo() | |
define i32 @test(i1 %c) { | |
%A = load i32* @X ; <i32> [#uses=1] | |
br label %Loop | |
Loop: ; preds = %Loop, %0 | |
call void @foo( ) | |
;; Should not hoist this load! | |
%B = load i32* @X ; <i32> [#uses=1] | |
br i1 %c, label %Loop, label %Out | |
Out: ; preds = %Loop | |
%C = sub i32 %A, %B ; <i32> [#uses=1] | |
ret i32 %C | |
} |