1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -passes=sccp -S | FileCheck %s 3 4define i1 @float.1(i1 %cmp) { 5; CHECK-LABEL: define i1 @float.1( 6; CHECK-SAME: i1 [[CMP:%.*]]) { 7; CHECK-NEXT: [[ENTRY:.*:]] 8; CHECK-NEXT: br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]] 9; CHECK: [[IF_TRUE]]: 10; CHECK-NEXT: br label %[[END]] 11; CHECK: [[END]]: 12; CHECK-NEXT: ret i1 true 13; 14entry: 15 br i1 %cmp, label %if.true, label %end 16 17if.true: 18 br label %end 19 20end: 21 %p = phi float [ 1.0, %entry ], [ 1.0, %if.true] 22 %c = fcmp ueq float %p, 1.0 23 ret i1 %c 24} 25 26define i1 @float.2(i1 %cmp) { 27; CHECK-LABEL: define i1 @float.2( 28; CHECK-SAME: i1 [[CMP:%.*]]) { 29; CHECK-NEXT: [[ENTRY:.*]]: 30; CHECK-NEXT: br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]] 31; CHECK: [[IF_TRUE]]: 32; CHECK-NEXT: br label %[[END]] 33; CHECK: [[END]]: 34; CHECK-NEXT: [[P:%.*]] = phi float [ 1.000000e+00, %[[ENTRY]] ], [ 2.000000e+00, %[[IF_TRUE]] ] 35; CHECK-NEXT: [[C:%.*]] = fcmp ueq float [[P]], 1.000000e+00 36; CHECK-NEXT: ret i1 [[C]] 37; 38entry: 39 br i1 %cmp, label %if.true, label %end 40 41if.true: 42 br label %end 43 44end: 45 %p = phi float [ 1.0, %entry ], [ 2.0, %if.true] 46 %c = fcmp ueq float %p, 1.0 47 ret i1 %c 48} 49 50define i1 @float.3(float %f, i1 %cmp) { 51; CHECK-LABEL: define i1 @float.3( 52; CHECK-SAME: float [[F:%.*]], i1 [[CMP:%.*]]) { 53; CHECK-NEXT: [[ENTRY:.*]]: 54; CHECK-NEXT: br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]] 55; CHECK: [[IF_TRUE]]: 56; CHECK-NEXT: br label %[[END]] 57; CHECK: [[END]]: 58; CHECK-NEXT: [[P:%.*]] = phi float [ 1.000000e+00, %[[ENTRY]] ], [ [[F]], %[[IF_TRUE]] ] 59; CHECK-NEXT: [[C:%.*]] = fcmp ueq float [[P]], 1.000000e+00 60; CHECK-NEXT: ret i1 [[C]] 61; 62 63entry: 64 br i1 %cmp, label %if.true, label %end 65 66if.true: 67 br label %end 68 69end: 70 %p = phi float [ 1.0, %entry ], [ %f, %if.true] 71 %c = fcmp ueq float %p, 1.0 72 ret i1 %c 73} 74 75 76define i1 @float.4_unreachable(float %f, i1 %cmp) { 77; CHECK-LABEL: define i1 @float.4_unreachable( 78; CHECK-SAME: float [[F:%.*]], i1 [[CMP:%.*]]) { 79; CHECK-NEXT: [[ENTRY:.*:]] 80; CHECK-NEXT: br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]] 81; CHECK: [[IF_TRUE]]: 82; CHECK-NEXT: br label %[[END]] 83; CHECK: [[END]]: 84; CHECK-NEXT: ret i1 false 85; 86 87entry: 88 br i1 %cmp, label %if.true, label %end 89 90if.true: 91 br label %end 92 93dead: 94 br label %end 95 96end: 97 %p = phi float [ 1.0, %entry ], [ 1.0, %if.true], [ %f, %dead ] 98 %c = fcmp une float %p, 1.0 99 ret i1 %c 100} 101 102define <2 x i16> @phi_vector_merge1(i1 %c, <2 x i8> %a) { 103; CHECK-LABEL: define range(i16 2, 259) <2 x i16> @phi_vector_merge1( 104; CHECK-SAME: i1 [[C:%.*]], <2 x i8> [[A:%.*]]) { 105; CHECK-NEXT: [[ENTRY:.*]]: 106; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i8> [[A]] to <2 x i16> 107; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[JOIN:.*]] 108; CHECK: [[IF]]: 109; CHECK-NEXT: br label %[[JOIN]] 110; CHECK: [[JOIN]]: 111; CHECK-NEXT: [[PHI:%.*]] = phi <2 x i16> [ [[ZEXT]], %[[ENTRY]] ], [ <i16 1, i16 2>, %[[IF]] ] 112; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw <2 x i16> [[PHI]], <i16 2, i16 3> 113; CHECK-NEXT: ret <2 x i16> [[ADD]] 114; 115entry: 116 %zext = zext <2 x i8> %a to <2 x i16> 117 br i1 %c, label %if, label %join 118 119if: 120 br label %join 121 122join: 123 %phi = phi <2 x i16> [ %zext, %entry ], [ <i16 1, i16 2>, %if ] 124 %add = add <2 x i16> %phi, <i16 2, i16 3> 125 ret <2 x i16> %add 126} 127 128define <2 x i16> @phi_vector_merge2(i1 %c, <2 x i8> %a) { 129; CHECK-LABEL: define range(i16 2, 259) <2 x i16> @phi_vector_merge2( 130; CHECK-SAME: i1 [[C:%.*]], <2 x i8> [[A:%.*]]) { 131; CHECK-NEXT: [[ENTRY:.*]]: 132; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i8> [[A]] to <2 x i16> 133; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[JOIN:.*]] 134; CHECK: [[IF]]: 135; CHECK-NEXT: br label %[[JOIN]] 136; CHECK: [[JOIN]]: 137; CHECK-NEXT: [[PHI:%.*]] = phi <2 x i16> [ <i16 1, i16 2>, %[[ENTRY]] ], [ [[ZEXT]], %[[IF]] ] 138; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw <2 x i16> [[PHI]], <i16 2, i16 3> 139; CHECK-NEXT: ret <2 x i16> [[ADD]] 140; 141entry: 142 %zext = zext <2 x i8> %a to <2 x i16> 143 br i1 %c, label %if, label %join 144 145if: 146 br label %join 147 148join: 149 %phi = phi <2 x i16> [ <i16 1, i16 2>, %entry ], [ %zext, %if ] 150 %add = add <2 x i16> %phi, <i16 2, i16 3> 151 ret <2 x i16> %add 152} 153 154define <2 x float> @phi_vector_merge_float(i1 %c) { 155; CHECK-LABEL: define <2 x float> @phi_vector_merge_float( 156; CHECK-SAME: i1 [[C:%.*]]) { 157; CHECK-NEXT: [[ENTRY:.*]]: 158; CHECK-NEXT: br i1 [[C]], label %[[IF:.*]], label %[[JOIN:.*]] 159; CHECK: [[IF]]: 160; CHECK-NEXT: br label %[[JOIN]] 161; CHECK: [[JOIN]]: 162; CHECK-NEXT: [[PHI:%.*]] = phi <2 x float> [ <float 2.000000e+00, float 1.000000e+00>, %[[ENTRY]] ], [ <float 1.000000e+00, float 2.000000e+00>, %[[IF]] ] 163; CHECK-NEXT: ret <2 x float> [[PHI]] 164; 165entry: 166 br i1 %c, label %if, label %join 167 168if: 169 br label %join 170 171join: 172 %phi = phi <2 x float> [ <float 2.0, float 1.0>, %entry ], [ <float 1.0, float 2.0>, %if ] 173 ret <2 x float> %phi 174} 175