; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; The tests in this file check that we do not simplify based on metadata that is ; not available on all code paths. ; RUN: opt < %s -S -newgvn | FileCheck %s define i1 @test1(i32** %arg, i1 %arg2) { ; CHECK-LABEL: @test1( ; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[LOAD1:%.*]] = load i32*, i32** [[ARG:%.*]], !nonnull !0 ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32* [[LOAD1]], null ; CHECK-NEXT: ret i1 [[CMP1]] ; CHECK: bb2: ; CHECK-NEXT: [[LOAD2:%.*]] = load i32*, i32** [[ARG]] ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32* [[LOAD2]], null ; CHECK-NEXT: ret i1 [[CMP2]] ; br i1 %arg2, label %bb1, label %bb2 bb1: %load1 = load i32*, i32** %arg, !nonnull !0 %cmp1 = icmp eq i32* %load1, null ret i1 %cmp1 bb2: %load2 = load i32*, i32** %arg %cmp2 = icmp eq i32* %load2, null ret i1 %cmp2 } define i1 @test2(i32** %arg, i1 %arg2) { ; CHECK-LABEL: @test2( ; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[LOAD1:%.*]] = load i32*, i32** [[ARG:%.*]] ; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32* [[LOAD1]], null ; CHECK-NEXT: ret i1 [[CMP1]] ; CHECK: bb2: ; CHECK-NEXT: [[LOAD2:%.*]] = load i32*, i32** [[ARG]], !nonnull !0 ; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32* [[LOAD2]], null ; CHECK-NEXT: ret i1 [[CMP2]] ; br i1 %arg2, label %bb1, label %bb2 bb1: %load1 = load i32*, i32** %arg %cmp1 = icmp eq i32* %load1, null ret i1 %cmp1 bb2: %load2 = load i32*, i32** %arg, !nonnull !0 %cmp2 = icmp eq i32* %load2, null ret i1 %cmp2 } define i1 @test3(i32* %ptr, i1 %arg2) { ; CHECK-LABEL: @test3( ; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]], !range !1 ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999 ; CHECK-NEXT: ret i1 [[CMP1]] ; CHECK: bb2: ; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]] ; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999 ; CHECK-NEXT: ret i1 [[CMP2]] ; br i1 %arg2, label %bb1, label %bb2 bb1: %load1 = load i32, i32* %ptr, !range !1 %cmp1 = icmp ne i32 %load1, 999 ret i1 %cmp1 bb2: %load2 = load i32, i32* %ptr %cmp2 = icmp ne i32 %load2, 999 ret i1 %cmp2 } define i1 @test4(i32* %ptr, i1 %arg2) { ; CHECK-LABEL: @test4( ; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]] ; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999 ; CHECK-NEXT: ret i1 [[CMP1]] ; CHECK: bb2: ; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]], !range !1 ; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999 ; CHECK-NEXT: ret i1 [[CMP2]] ; br i1 %arg2, label %bb1, label %bb2 bb1: %load1 = load i32, i32* %ptr %cmp1 = icmp ne i32 %load1, 999 ret i1 %cmp1 bb2: %load2 = load i32, i32* %ptr, !range !1 %cmp2 = icmp ne i32 %load2, 999 ret i1 %cmp2 } define i1 @test5(i32* %ptr, i1 %arg2) { ; CHECK-LABEL: @test5( ; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]], !range !1 ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999 ; CHECK-NEXT: ret i1 [[CMP1]] ; CHECK: bb2: ; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]] ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999 ; CHECK-NEXT: ret i1 [[CMP2]] ; br i1 %arg2, label %bb1, label %bb2 bb1: %load1 = load i32, i32* %ptr, !range !1 %cmp1 = icmp slt i32 %load1, 999 ret i1 %cmp1 bb2: %load2 = load i32, i32* %ptr %cmp2 = icmp slt i32 %load2, 999 ret i1 %cmp2 } define i1 @test6(i32* %ptr, i1 %arg2) { ; CHECK-LABEL: @test6( ; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] ; CHECK: bb1: ; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]] ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999 ; CHECK-NEXT: ret i1 [[CMP1]] ; CHECK: bb2: ; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]], !range !1 ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999 ; CHECK-NEXT: ret i1 [[CMP2]] ; br i1 %arg2, label %bb1, label %bb2 bb1: %load1 = load i32, i32* %ptr %cmp1 = icmp slt i32 %load1, 999 ret i1 %cmp1 bb2: %load2 = load i32, i32* %ptr, !range !1 %cmp2 = icmp slt i32 %load2, 999 ret i1 %cmp2 } !0 = !{} !1 = !{ i32 10, i32 20 }