1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=print-predicateinfo < %s 2>&1 | FileCheck %s 3 4define i32 @f1(i32 %x) { 5; CHECK-LABEL: @f1( 6; CHECK-NEXT: bb0: 7; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0 8; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]]) 9; CHECK-NEXT: br i1 [[CMP]], label [[BB2:%.*]], label [[BB1:%.*]] 10; CHECK: bb1: 11; CHECK-NEXT: br label [[BB2]] 12; CHECK: bb2: 13; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[X_0]], [[BB0:%.*]] ], [ 0, [[BB1]] ] 14; CHECK-NEXT: [[FOO:%.*]] = add i32 [[COND]], [[X]] 15; CHECK-NEXT: ret i32 [[FOO]] 16; 17bb0: 18 %cmp = icmp eq i32 %x, 0 19 br i1 %cmp, label %bb2, label %bb1 20bb1: 21 br label %bb2 22bb2: 23 %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ] 24 %foo = add i32 %cond, %x 25 ret i32 %foo 26} 27 28define i32 @f2(i32 %x) { 29; CHECK-LABEL: @f2( 30; CHECK-NEXT: bb0: 31; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[X:%.*]], 0 32; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X]]) 33; CHECK-NEXT: br i1 [[CMP]], label [[BB1:%.*]], label [[BB2:%.*]] 34; CHECK: bb1: 35; CHECK-NEXT: br label [[BB2]] 36; CHECK: bb2: 37; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[X_0]], [[BB0:%.*]] ], [ 0, [[BB1]] ] 38; CHECK-NEXT: [[FOO:%.*]] = add i32 [[COND]], [[X]] 39; CHECK-NEXT: ret i32 [[FOO]] 40; 41bb0: 42 %cmp = icmp ne i32 %x, 0 43 br i1 %cmp, label %bb1, label %bb2 44bb1: 45 br label %bb2 46bb2: 47 %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ] 48 %foo = add i32 %cond, %x 49 ret i32 %foo 50} 51 52define i32 @f3(i32 %x) { 53; CHECK-LABEL: @f3( 54; CHECK-NEXT: bb0: 55; CHECK: [[X_0:%.*]] = call i32 @llvm.ssa.copy.i32(i32 [[X:%.*]]) 56; CHECK-NEXT: switch i32 [[X]], label [[BB1:%.*]] [ 57; CHECK-NEXT: i32 0, label [[BB2:%.*]] 58; CHECK-NEXT: ] 59; CHECK: bb1: 60; CHECK-NEXT: br label [[BB2]] 61; CHECK: bb2: 62; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[X_0]], [[BB0:%.*]] ], [ 0, [[BB1]] ] 63; CHECK-NEXT: [[FOO:%.*]] = add i32 [[COND]], [[X]] 64; CHECK-NEXT: ret i32 [[FOO]] 65; 66bb0: 67 switch i32 %x, label %bb1 [ i32 0, label %bb2] 68bb1: 69 br label %bb2 70bb2: 71 %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ] 72 %foo = add i32 %cond, %x 73 ret i32 %foo 74} 75 76 77define double @fcmp_oeq_not_zero(double %x, double %y) { 78; CHECK-LABEL: @fcmp_oeq_not_zero( 79; CHECK-NEXT: entry: 80; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y:%.*]], 2.000000e+00 81; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]]) 82; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]] 83; CHECK: if: 84; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]] 85; CHECK-NEXT: br label [[RETURN]] 86; CHECK: return: 87; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[IF]] ], [ [[X]], [[ENTRY:%.*]] ] 88; CHECK-NEXT: ret double [[RETVAL]] 89; 90entry: 91 %cmp = fcmp oeq double %y, 2.0 92 br i1 %cmp, label %if, label %return 93 94if: 95 %div = fdiv double %x, %y 96 br label %return 97 98return: 99 %retval = phi double [ %div, %if ], [ %x, %entry ] 100 ret double %retval 101 102} 103 104define double @fcmp_une_not_zero(double %x, double %y) { 105; CHECK-LABEL: @fcmp_une_not_zero( 106; CHECK-NEXT: entry: 107; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y:%.*]], 2.000000e+00 108; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]]) 109; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]] 110; CHECK: else: 111; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]] 112; CHECK-NEXT: br label [[RETURN]] 113; CHECK: return: 114; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[ELSE]] ], [ [[X]], [[ENTRY:%.*]] ] 115; CHECK-NEXT: ret double [[RETVAL]] 116; 117entry: 118 %cmp = fcmp une double %y, 2.0 119 br i1 %cmp, label %return, label %else 120 121else: 122 %div = fdiv double %x, %y 123 br label %return 124 125return: 126 %retval = phi double [ %div, %else ], [ %x, %entry ] 127 ret double %retval 128 129} 130 131define double @fcmp_oeq_zero(double %x, double %y) { 132; CHECK-LABEL: @fcmp_oeq_zero( 133; CHECK-NEXT: entry: 134; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y:%.*]], 0.000000e+00 135; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]]) 136; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]] 137; CHECK: if: 138; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]] 139; CHECK-NEXT: br label [[RETURN]] 140; CHECK: return: 141; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[IF]] ], [ [[X]], [[ENTRY:%.*]] ] 142; CHECK-NEXT: ret double [[RETVAL]] 143; 144entry: 145 %cmp = fcmp oeq double %y, 0.0 146 br i1 %cmp, label %if, label %return 147 148if: 149 %div = fdiv double %x, %y 150 br label %return 151 152return: 153 %retval = phi double [ %div, %if ], [ %x, %entry ] 154 ret double %retval 155 156} 157 158define double @fcmp_une_zero(double %x, double %y) { 159; CHECK-LABEL: @fcmp_une_zero( 160; CHECK-NEXT: entry: 161; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y:%.*]], -0.000000e+00 162; CHECK: [[Y_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Y]]) 163; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]] 164; CHECK: else: 165; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Y_0]] 166; CHECK-NEXT: br label [[RETURN]] 167; CHECK: return: 168; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[ELSE]] ], [ [[X]], [[ENTRY:%.*]] ] 169; CHECK-NEXT: ret double [[RETVAL]] 170; 171entry: 172 %cmp = fcmp une double %y, -0.0 173 br i1 %cmp, label %return, label %else 174 175else: 176 %div = fdiv double %x, %y 177 br label %return 178 179return: 180 %retval = phi double [ %div, %else ], [ %x, %entry ] 181 ret double %retval 182 183} 184 185 186define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) { 187; CHECK-LABEL: @fcmp_oeq_maybe_zero( 188; CHECK-NEXT: entry: 189; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1:%.*]], [[Z2:%.*]] 190; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[Y:%.*]], [[Z]] 191; CHECK: [[Z_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Z]]) 192; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[RETURN:%.*]] 193; CHECK: if: 194; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Z_0]] 195; CHECK-NEXT: br label [[RETURN]] 196; CHECK: return: 197; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[IF]] ], [ [[X]], [[ENTRY:%.*]] ] 198; CHECK-NEXT: ret double [[RETVAL]] 199; 200entry: 201 %z = fadd double %z1, %z2 202 %cmp = fcmp oeq double %y, %z 203 br i1 %cmp, label %if, label %return 204 205if: 206 %div = fdiv double %x, %z 207 br label %return 208 209return: 210 %retval = phi double [ %div, %if ], [ %x, %entry ] 211 ret double %retval 212 213} 214 215define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) { 216; CHECK-LABEL: @fcmp_une_maybe_zero( 217; CHECK-NEXT: entry: 218; CHECK-NEXT: [[Z:%.*]] = fadd double [[Z1:%.*]], [[Z2:%.*]] 219; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[Y:%.*]], [[Z]] 220; CHECK: [[Z_0:%.*]] = call double @llvm.ssa.copy.f64(double [[Z]]) 221; CHECK-NEXT: br i1 [[CMP]], label [[RETURN:%.*]], label [[ELSE:%.*]] 222; CHECK: else: 223; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[X:%.*]], [[Z_0]] 224; CHECK-NEXT: br label [[RETURN]] 225; CHECK: return: 226; CHECK-NEXT: [[RETVAL:%.*]] = phi double [ [[DIV]], [[ELSE]] ], [ [[X]], [[ENTRY:%.*]] ] 227; CHECK-NEXT: ret double [[RETVAL]] 228; 229entry: 230 %z = fadd double %z1, %z2 231 %cmp = fcmp une double %y, %z 232 br i1 %cmp, label %return, label %else 233 234else: 235 %div = fdiv double %x, %z 236 br label %return 237 238return: 239 %retval = phi double [ %div, %else ], [ %x, %entry ] 240 ret double %retval 241 242} 243