1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instcombine -S < %s | FileCheck %s
7 ; Check that !noundef metadata is combined
8 define 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:%.*]]
12 ; CHECK-NEXT: call void @bar()
13 ; CHECK-NEXT: br label [[CONT:%.*]]
15 ; CHECK-NEXT: call void @baz()
16 ; CHECK-NEXT: br label [[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]]
22 br i1 %c, label %t, label %f
25 %v1 = load ptr, ptr %p1, align 8, !noundef !0
30 %v2 = load ptr, ptr %p2, align 8, !noundef !0
34 %res = phi ptr [ %v1, %t ], [ %v2, %f ]
38 ; Check that !noundef metadata is not combined as a result of
39 ; there is a load don't have a noundef metadata.
40 define 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:%.*]]
44 ; CHECK-NEXT: call void @bar()
45 ; CHECK-NEXT: br label [[CONT:%.*]]
47 ; CHECK-NEXT: call void @baz()
48 ; CHECK-NEXT: br label [[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]]
54 br i1 %c, label %t, label %f
57 %v1 = load ptr, ptr %p1, align 8, !noundef !0
62 %v2 = load ptr, ptr %p2, align 8
66 %res = phi ptr [ %v1, %t ], [ %v2, %f ]