xref: /aosp_15_r20/external/llvm/test/Transforms/LICM/2003-05-02-LoadHoist.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; This testcase tests for a problem where LICM hoists loads out of a loop
2*9880d681SAndroid Build Coastguard Worker; despite the fact that calls to unknown functions may modify what is being
3*9880d681SAndroid Build Coastguard Worker; loaded from.  Basically if the load gets hoisted, the subtract gets turned
4*9880d681SAndroid Build Coastguard Worker; into a constant zero.
5*9880d681SAndroid Build Coastguard Worker;
6*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -licm -gvn -instcombine -S | grep load
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker@X = global i32 7		; <i32*> [#uses=2]
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdeclare void @foo()
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i1 %c) {
13*9880d681SAndroid Build Coastguard Worker	%A = load i32, i32* @X		; <i32> [#uses=1]
14*9880d681SAndroid Build Coastguard Worker	br label %Loop
15*9880d681SAndroid Build Coastguard WorkerLoop:		; preds = %Loop, %0
16*9880d681SAndroid Build Coastguard Worker	call void @foo( )
17*9880d681SAndroid Build Coastguard Worker        ;; Should not hoist this load!
18*9880d681SAndroid Build Coastguard Worker	%B = load i32, i32* @X		; <i32> [#uses=1]
19*9880d681SAndroid Build Coastguard Worker	br i1 %c, label %Loop, label %Out
20*9880d681SAndroid Build Coastguard WorkerOut:		; preds = %Loop
21*9880d681SAndroid Build Coastguard Worker	%C = sub i32 %A, %B		; <i32> [#uses=1]
22*9880d681SAndroid Build Coastguard Worker	ret i32 %C
23*9880d681SAndroid Build Coastguard Worker}
24