xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/fold-phi-load-metadata.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker@g1 = common global i32* null, align 8
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker%struct.S1 = type { i32, float }
6*9880d681SAndroid Build Coastguard Worker%struct.S2 = type { float, i32 }
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; Check that instcombine preserves metadata when it merges two loads.
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker; CHECK: return:
11*9880d681SAndroid Build Coastguard Worker; CHECK: load i32*, i32** %{{[a-z0-9.]+}}, align 8, !nonnull ![[EMPTYNODE:[0-9]+]]
12*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %{{[a-z0-9.]+}}, align 4, !tbaa ![[TBAA:[0-9]+]], !range ![[RANGE:[0-9]+]], !invariant.load ![[EMPTYNODE:[0-9]+]], !alias.scope ![[ALIAS_SCOPE:[0-9]+]], !noalias ![[NOALIAS:[0-9]+]]
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind ssp uwtable
15*9880d681SAndroid Build Coastguard Workerdefine i32 @phi_load_metadata(%struct.S1* %s1, %struct.S2* %s2, i32 %c, i32** %x0, i32 **%x1) #0 {
16*9880d681SAndroid Build Coastguard Workerentry:
17*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %c, 0
18*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if.end, label %if.then
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
21*9880d681SAndroid Build Coastguard Worker  %i = getelementptr inbounds %struct.S2, %struct.S2* %s2, i64 0, i32 1
22*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32* %i, align 4, !tbaa !0, !alias.scope !13, !noalias !14, !invariant.load !17, !range !18
23*9880d681SAndroid Build Coastguard Worker  %p0 = load i32*, i32** %x0, align 8, !nonnull !17
24*9880d681SAndroid Build Coastguard Worker  br label %return
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerif.end:                                           ; preds = %entry
27*9880d681SAndroid Build Coastguard Worker  %i2 = getelementptr inbounds %struct.S1, %struct.S1* %s1, i64 0, i32 0
28*9880d681SAndroid Build Coastguard Worker  %val2 = load i32, i32* %i2, align 4, !tbaa !2, !alias.scope !15, !noalias !16, !invariant.load !17, !range !19
29*9880d681SAndroid Build Coastguard Worker  %p1 = load i32*, i32** %x1, align 8, !nonnull !17
30*9880d681SAndroid Build Coastguard Worker  br label %return
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerreturn:                                           ; preds = %if.end, %if.then
33*9880d681SAndroid Build Coastguard Worker  %retval = phi i32 [ %val, %if.then ], [ %val2, %if.end ]
34*9880d681SAndroid Build Coastguard Worker  %pval = phi i32* [ %p0, %if.then ], [ %p1, %if.end ]
35*9880d681SAndroid Build Coastguard Worker  store i32* %pval, i32** @g1, align 8
36*9880d681SAndroid Build Coastguard Worker  ret i32 %retval
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK: ![[EMPTYNODE]] = !{}
40*9880d681SAndroid Build Coastguard Worker; CHECK: ![[TBAA]] = !{![[TAG1:[0-9]+]], ![[TAG1]], i64 0}
41*9880d681SAndroid Build Coastguard Worker; CHECK: ![[TAG1]] = !{!"int", !{{[0-9]+}}, i64 0}
42*9880d681SAndroid Build Coastguard Worker; CHECK: ![[RANGE]] = !{i32 10, i32 25}
43*9880d681SAndroid Build Coastguard Worker; CHECK: ![[ALIAS_SCOPE]] = !{![[SCOPE0:[0-9]+]], ![[SCOPE1:[0-9]+]], ![[SCOPE2:[0-9]+]]}
44*9880d681SAndroid Build Coastguard Worker; CHECK: ![[SCOPE0]] = distinct !{![[SCOPE0]], !{{[0-9]+}}, !"scope0"}
45*9880d681SAndroid Build Coastguard Worker; CHECK: ![[SCOPE1]] = distinct !{![[SCOPE1]], !{{[0-9]+}}, !"scope1"}
46*9880d681SAndroid Build Coastguard Worker; CHECK: ![[SCOPE2]] = distinct !{![[SCOPE2]], !{{[0-9]+}}, !"scope2"}
47*9880d681SAndroid Build Coastguard Worker; CHECK: ![[NOALIAS]] = !{![[SCOPE3:[0-9]+]]}
48*9880d681SAndroid Build Coastguard Worker; CHECK: ![[SCOPE3]] = distinct !{![[SCOPE3]], !{{[0-9]+}}, !"scope3"}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker!0 = !{!1, !4, i64 4}
51*9880d681SAndroid Build Coastguard Worker!1 = !{!"", !7, i64 0, !4, i64 4}
52*9880d681SAndroid Build Coastguard Worker!2 = !{!3, !4, i64 0}
53*9880d681SAndroid Build Coastguard Worker!3 = !{!"", !4, i64 0, !7, i64 4}
54*9880d681SAndroid Build Coastguard Worker!4 = !{!"int", !5, i64 0}
55*9880d681SAndroid Build Coastguard Worker!5 = !{!"omnipotent char", !6, i64 0}
56*9880d681SAndroid Build Coastguard Worker!6 = !{!"Simple C/C++ TBAA"}
57*9880d681SAndroid Build Coastguard Worker!7 = !{!"float", !5, i64 0}
58*9880d681SAndroid Build Coastguard Worker!8 = !{!8, !"some domain"}
59*9880d681SAndroid Build Coastguard Worker!9 = !{!9, !8, !"scope0"}
60*9880d681SAndroid Build Coastguard Worker!10 = !{!10, !8, !"scope1"}
61*9880d681SAndroid Build Coastguard Worker!11 = !{!11, !8, !"scope2"}
62*9880d681SAndroid Build Coastguard Worker!12 = !{!12, !8, !"scope3"}
63*9880d681SAndroid Build Coastguard Worker!13 = !{!9, !10}
64*9880d681SAndroid Build Coastguard Worker!14 = !{!11, !12}
65*9880d681SAndroid Build Coastguard Worker!15 = !{!9, !11}
66*9880d681SAndroid Build Coastguard Worker!16 = !{!10, !12}
67*9880d681SAndroid Build Coastguard Worker!17 = !{}
68*9880d681SAndroid Build Coastguard Worker!18 = !{i32 10, i32 20}
69*9880d681SAndroid Build Coastguard Worker!19 = !{i32 15, i32 25}
70