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