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