1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2 3; The tests in this file check that we do not simplify based on metadata that is 4; not available on all code paths. 5 6; RUN: opt < %s -S -passes=newgvn | FileCheck %s 7 8define i1 @test1(ptr %arg, i1 %arg2) { 9; CHECK-LABEL: @test1( 10; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 11; CHECK: bb1: 12; CHECK-NEXT: [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]], align 8, !nonnull [[META0:![0-9]+]] 13; CHECK-NEXT: [[CMP1:%.*]] = icmp eq ptr [[LOAD1]], null 14; CHECK-NEXT: ret i1 [[CMP1]] 15; CHECK: bb2: 16; CHECK-NEXT: [[LOAD2:%.*]] = load ptr, ptr [[ARG]], align 8 17; CHECK-NEXT: [[CMP2:%.*]] = icmp eq ptr [[LOAD2]], null 18; CHECK-NEXT: ret i1 [[CMP2]] 19; 20 br i1 %arg2, label %bb1, label %bb2 21 22bb1: 23 %load1 = load ptr, ptr %arg, !nonnull !0 24 %cmp1 = icmp eq ptr %load1, null 25 ret i1 %cmp1 26 27bb2: 28 %load2 = load ptr, ptr %arg 29 %cmp2 = icmp eq ptr %load2, null 30 ret i1 %cmp2 31} 32 33define i1 @test2(ptr %arg, i1 %arg2) { 34; CHECK-LABEL: @test2( 35; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 36; CHECK: bb1: 37; CHECK-NEXT: [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]], align 8 38; CHECK-NEXT: [[CMP1:%.*]] = icmp eq ptr [[LOAD1]], null 39; CHECK-NEXT: ret i1 [[CMP1]] 40; CHECK: bb2: 41; CHECK-NEXT: [[LOAD2:%.*]] = load ptr, ptr [[ARG]], align 8, !nonnull [[META0]] 42; CHECK-NEXT: [[CMP2:%.*]] = icmp eq ptr [[LOAD2]], null 43; CHECK-NEXT: ret i1 [[CMP2]] 44; 45 br i1 %arg2, label %bb1, label %bb2 46 47bb1: 48 %load1 = load ptr, ptr %arg 49 %cmp1 = icmp eq ptr %load1, null 50 ret i1 %cmp1 51 52bb2: 53 %load2 = load ptr, ptr %arg, !nonnull !0 54 %cmp2 = icmp eq ptr %load2, null 55 ret i1 %cmp2 56} 57 58 59define i1 @test3(ptr %ptr, i1 %arg2) { 60; CHECK-LABEL: @test3( 61; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 62; CHECK: bb1: 63; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !range [[RNG1:![0-9]+]] 64; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999 65; CHECK-NEXT: ret i1 [[CMP1]] 66; CHECK: bb2: 67; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4 68; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999 69; CHECK-NEXT: ret i1 [[CMP2]] 70; 71 br i1 %arg2, label %bb1, label %bb2 72 73bb1: 74 %load1 = load i32, ptr %ptr, !range !1 75 %cmp1 = icmp ne i32 %load1, 999 76 ret i1 %cmp1 77 78bb2: 79 %load2 = load i32, ptr %ptr 80 %cmp2 = icmp ne i32 %load2, 999 81 ret i1 %cmp2 82} 83 84define i1 @test4(ptr %ptr, i1 %arg2) { 85; CHECK-LABEL: @test4( 86; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 87; CHECK: bb1: 88; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4 89; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999 90; CHECK-NEXT: ret i1 [[CMP1]] 91; CHECK: bb2: 92; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4, !range [[RNG1]] 93; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999 94; CHECK-NEXT: ret i1 [[CMP2]] 95; 96 br i1 %arg2, label %bb1, label %bb2 97 98bb1: 99 %load1 = load i32, ptr %ptr 100 %cmp1 = icmp ne i32 %load1, 999 101 ret i1 %cmp1 102 103bb2: 104 %load2 = load i32, ptr %ptr, !range !1 105 %cmp2 = icmp ne i32 %load2, 999 106 ret i1 %cmp2 107} 108 109define i1 @test5(ptr %ptr, i1 %arg2) { 110; CHECK-LABEL: @test5( 111; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 112; CHECK: bb1: 113; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !range [[RNG1]] 114; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999 115; CHECK-NEXT: ret i1 [[CMP1]] 116; CHECK: bb2: 117; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4 118; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999 119; CHECK-NEXT: ret i1 [[CMP2]] 120; 121 br i1 %arg2, label %bb1, label %bb2 122 123bb1: 124 %load1 = load i32, ptr %ptr, !range !1 125 %cmp1 = icmp slt i32 %load1, 999 126 ret i1 %cmp1 127 128bb2: 129 %load2 = load i32, ptr %ptr 130 %cmp2 = icmp slt i32 %load2, 999 131 ret i1 %cmp2 132} 133 134define i1 @test6(ptr %ptr, i1 %arg2) { 135; CHECK-LABEL: @test6( 136; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 137; CHECK: bb1: 138; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4 139; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999 140; CHECK-NEXT: ret i1 [[CMP1]] 141; CHECK: bb2: 142; CHECK-NEXT: [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4, !range [[RNG1]] 143; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999 144; CHECK-NEXT: ret i1 [[CMP2]] 145; 146 br i1 %arg2, label %bb1, label %bb2 147 148bb1: 149 %load1 = load i32, ptr %ptr 150 %cmp1 = icmp slt i32 %load1, 999 151 ret i1 %cmp1 152 153bb2: 154 %load2 = load i32, ptr %ptr, !range !1 155 %cmp2 = icmp slt i32 %load2, 999 156 ret i1 %cmp2 157} 158 159!0 = !{} 160!1 = !{ i32 10, i32 20 } 161