xref: /aosp_15_r20/external/llvm/test/Transforms/LICM/hoist-nounwind.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -basicaa -licm < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -aa-pipeline=basic-aa -passes='lcssa,require<aa>,require<targetir>,require<scalar-evolution>,loop(licm)' -S %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare void @f() nounwind
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; Don't hoist load past nounwind call.
9*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32* noalias nocapture readonly %a) nounwind uwtable {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  br label %for.body
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @f()
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i32
16*9880d681SAndroid Build Coastguard Workerfor.body:
17*9880d681SAndroid Build Coastguard Worker  %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
18*9880d681SAndroid Build Coastguard Worker  %x.05 = phi i32 [ 0, %entry ], [ %add, %for.body ]
19*9880d681SAndroid Build Coastguard Worker  tail call void @f() nounwind
20*9880d681SAndroid Build Coastguard Worker  %i1 = load i32, i32* %a, align 4
21*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %i1, %x.05
22*9880d681SAndroid Build Coastguard Worker  %inc = add nuw nsw i32 %i.06, 1
23*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %inc, 1000
24*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.cond.cleanup, label %for.body
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:
27*9880d681SAndroid Build Coastguard Worker  ret i32 %add
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; Don't hoist division past nounwind call.
31*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %N, i32 %c) nounwind uwtable {
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp sgt i32 %N, 0
35*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %for.body, label %for.cond.cleanup
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; CHECK: tail call void @f()
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sdiv i32
39*9880d681SAndroid Build Coastguard Workerfor.body:
40*9880d681SAndroid Build Coastguard Worker  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
41*9880d681SAndroid Build Coastguard Worker  tail call void @f() nounwind
42*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 5, %c
43*9880d681SAndroid Build Coastguard Worker  %add = add i32 %i.05, 1
44*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %add, %div
45*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %inc, %N
46*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:
49*9880d681SAndroid Build Coastguard Worker  ret i32 0
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; Don't hoist load past volatile load.
53*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32* noalias nocapture readonly %a, i32* %v) nounwind uwtable {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  br label %for.body
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker; CHECK: load volatile i32
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i32
60*9880d681SAndroid Build Coastguard Workerfor.body:
61*9880d681SAndroid Build Coastguard Worker  %i.06 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
62*9880d681SAndroid Build Coastguard Worker  %x.05 = phi i32 [ 0, %entry ], [ %add, %for.body ]
63*9880d681SAndroid Build Coastguard Worker  %xxx = load volatile i32, i32* %v, align 4
64*9880d681SAndroid Build Coastguard Worker  %i1 = load i32, i32* %a, align 4
65*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %i1, %x.05
66*9880d681SAndroid Build Coastguard Worker  %inc = add nuw nsw i32 %i.06, 1
67*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %inc, 1000
68*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.cond.cleanup, label %for.body
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:
71*9880d681SAndroid Build Coastguard Worker  ret i32 %add
72*9880d681SAndroid Build Coastguard Worker}
73