; RUN: opt -S -gvn-hoist < %s | FileCheck %s ; CHECK-LABEL: build_tree ; CHECK: load ; CHECK: load ; Check that the load is not hoisted because the call can potentially ; modify the global target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" @heap = external global i32, align 4 define i32 @build_tree() unnamed_addr { entry: br label %do.body do.body: ; preds = %do.body, %entry %tmp9 = load i32, i32* @heap, align 4 %cmp = call i1 @pqdownheap(i32 %tmp9) br i1 %cmp, label %do.body, label %do.end do.end: ; preds = %do.body %tmp20 = load i32, i32* @heap, align 4 ret i32 %tmp20 } declare i1 @pqdownheap(i32) @i = external hidden unnamed_addr global i32, align 4 @j = external hidden unnamed_addr global [573 x i32], align 4 @v = external global i1 ; CHECK-LABEL: test ; CHECK-LABEL: do.end ; CHECK: load ; Check that the load is not hoisted because the call can potentially ; modify the global define i32 @test() { entry: br label %for.cond for.cond: %a3 = load volatile i1, i1* @v br i1 %a3, label %for.body, label %while.end for.body: br label %if.then if.then: %tmp4 = load i32, i32* @i, align 4 br label %for.cond while.end: br label %do.body do.body: %tmp9 = load i32, i32* getelementptr inbounds ([573 x i32], [573 x i32]* @j, i32 0, i32 1), align 4 %tmp10 = load i32, i32* @i, align 4 call void @fn() %a1 = load volatile i1, i1* @v br i1 %a1, label %do.body, label %do.end do.end: %tmp20 = load i32, i32* getelementptr inbounds ([573 x i32], [573 x i32]* @j, i32 0, i32 1), align 4 ret i32 %tmp20 } declare void @fn()