xref: /llvm-project/llvm/test/Transforms/InstCombine/phi-load-metadata-4.ll (revision 232698dc171ed7e3639db4a18e6d1abfba89f68b)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3
4declare void @bar()
5declare void @baz()
6
7; Check that !noundef metadata is combined
8define ptr @test_phi_combine_load_metadata(i1 %c, ptr dereferenceable(8) %p1, ptr dereferenceable(8) %p2) {
9; CHECK-LABEL: @test_phi_combine_load_metadata(
10; CHECK-NEXT:    br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]
11; CHECK:       t:
12; CHECK-NEXT:    call void @bar()
13; CHECK-NEXT:    br label [[CONT:%.*]]
14; CHECK:       f:
15; CHECK-NEXT:    call void @baz()
16; CHECK-NEXT:    br label [[CONT]]
17; CHECK:       cont:
18; CHECK-NEXT:    [[RES_IN:%.*]] = phi ptr [ [[P1:%.*]], [[T]] ], [ [[P2:%.*]], [[F]] ]
19; CHECK-NEXT:    [[RES:%.*]] = load ptr, ptr [[RES_IN]], align 8, !noundef !0
20; CHECK-NEXT:    ret ptr [[RES]]
21;
22  br i1 %c, label %t, label %f
23t:
24  call void @bar()
25  %v1 = load ptr, ptr %p1, align 8, !noundef !0
26  br label %cont
27
28f:
29  call void @baz()
30  %v2 = load ptr, ptr %p2, align 8, !noundef !0
31  br label %cont
32
33cont:
34  %res = phi ptr [ %v1, %t ], [ %v2, %f ]
35  ret ptr %res
36}
37
38; Check that !noundef metadata is not combined as a result of
39; there is a load don't have a noundef metadata.
40define ptr @test_phi_combine_load_metadata_negative(i1 %c, ptr dereferenceable(8) %p1, ptr dereferenceable(8) %p2) {
41; CHECK-LABEL: @test_phi_combine_load_metadata_negative(
42; CHECK-NEXT:    br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]
43; CHECK:       t:
44; CHECK-NEXT:    call void @bar()
45; CHECK-NEXT:    br label [[CONT:%.*]]
46; CHECK:       f:
47; CHECK-NEXT:    call void @baz()
48; CHECK-NEXT:    br label [[CONT]]
49; CHECK:       cont:
50; CHECK-NEXT:    [[RES_IN:%.*]] = phi ptr [ [[P1:%.*]], [[T]] ], [ [[P2:%.*]], [[F]] ]
51; CHECK-NEXT:    [[RES:%.*]] = load ptr, ptr [[RES_IN]], align 8
52; CHECK-NEXT:    ret ptr [[RES]]
53;
54  br i1 %c, label %t, label %f
55t:
56  call void @bar()
57  %v1 = load ptr, ptr %p1, align 8, !noundef !0
58  br label %cont
59
60f:
61  call void @baz()
62  %v2 = load ptr, ptr %p2, align 8
63  br label %cont
64
65cont:
66  %res = phi ptr [ %v1, %t ], [ %v2, %f ]
67  ret ptr %res
68}
69
70!0 = !{}
71