; 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, i32* @X ; <i32> [#uses=1] br label %Loop Loop: ; preds = %Loop, %0 call void @foo( ) ;; Should not hoist this load! %B = load i32, 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 }