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