1542a3cb9SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2542a3cb9SYingwei Zheng; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3542a3cb9SYingwei Zheng 4542a3cb9SYingwei Zhengdefine i1 @test1(float %x) { 5542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test1( 6542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) { 7542a3cb9SYingwei Zheng; CHECK-NEXT: entry: 8542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00 9542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 10542a3cb9SYingwei Zheng; CHECK: if.then: 11542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 12542a3cb9SYingwei Zheng; CHECK: if.else: 13542a3cb9SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780) 14542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 15542a3cb9SYingwei Zheng; 16542a3cb9SYingwei Zhengentry: 17542a3cb9SYingwei Zheng %cond = fcmp ueq float %x, 0.000000e+00 18542a3cb9SYingwei Zheng br i1 %cond, label %if.then, label %if.else 19542a3cb9SYingwei Zheng 20542a3cb9SYingwei Zhengif.then: 21542a3cb9SYingwei Zheng ret i1 false 22542a3cb9SYingwei Zheng 23542a3cb9SYingwei Zhengif.else: 24542a3cb9SYingwei Zheng %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783) 25542a3cb9SYingwei Zheng ret i1 %ret 26542a3cb9SYingwei Zheng} 27542a3cb9SYingwei Zheng 28542a3cb9SYingwei Zhengdefine i1 @test2(double %x) { 29542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test2( 30542a3cb9SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) { 31542a3cb9SYingwei Zheng; CHECK-NEXT: entry: 32542a3cb9SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000 33542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 34542a3cb9SYingwei Zheng; CHECK: if.then: 35542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 36542a3cb9SYingwei Zheng; CHECK: if.end: 37542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 38542a3cb9SYingwei Zheng; 39542a3cb9SYingwei Zhengentry: 40542a3cb9SYingwei Zheng %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000 41542a3cb9SYingwei Zheng br i1 %cmp, label %if.then, label %if.end 42542a3cb9SYingwei Zhengif.then: 43542a3cb9SYingwei Zheng ret i1 false 44542a3cb9SYingwei Zhengif.end: 45542a3cb9SYingwei Zheng %cmp.i = fcmp oeq double %x, 0.000000e+00 46542a3cb9SYingwei Zheng ret i1 %cmp.i 47542a3cb9SYingwei Zheng} 48542a3cb9SYingwei Zheng 4916ec5349SYingwei Zhengdefine i1 @test2_or(double %x, i1 %cond) { 5016ec5349SYingwei Zheng; CHECK-LABEL: define i1 @test2_or( 5116ec5349SYingwei Zheng; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) { 5216ec5349SYingwei Zheng; CHECK-NEXT: entry: 5316ec5349SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0x3EB0C6F7A0000000 5416ec5349SYingwei Zheng; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP]], [[COND]] 5516ec5349SYingwei Zheng; CHECK-NEXT: br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 5616ec5349SYingwei Zheng; CHECK: if.then: 5716ec5349SYingwei Zheng; CHECK-NEXT: ret i1 false 5816ec5349SYingwei Zheng; CHECK: if.end: 5916ec5349SYingwei Zheng; CHECK-NEXT: ret i1 false 6016ec5349SYingwei Zheng; 6116ec5349SYingwei Zhengentry: 6216ec5349SYingwei Zheng %cmp = fcmp olt double %x, 0x3EB0C6F7A0000000 6316ec5349SYingwei Zheng %or = or i1 %cmp, %cond 6416ec5349SYingwei Zheng br i1 %or, label %if.then, label %if.end 6516ec5349SYingwei Zheng 6616ec5349SYingwei Zhengif.then: 6716ec5349SYingwei Zheng ret i1 false 6816ec5349SYingwei Zheng 6916ec5349SYingwei Zhengif.end: 7016ec5349SYingwei Zheng %cmp.i = fcmp oeq double %x, 0.000000e+00 7116ec5349SYingwei Zheng ret i1 %cmp.i 7216ec5349SYingwei Zheng} 7316ec5349SYingwei Zheng 74542a3cb9SYingwei Zhengdefine i1 @test3(float %x) { 75542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test3( 76542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) { 77542a3cb9SYingwei Zheng; CHECK-NEXT: entry: 78542a3cb9SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[X]], 3.000000e+00 79542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 80542a3cb9SYingwei Zheng; CHECK: if.then: 81542a3cb9SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = fcmp oeq float [[X]], 0x7FF0000000000000 82542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 83542a3cb9SYingwei Zheng; CHECK: if.else: 84542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 85542a3cb9SYingwei Zheng; 86542a3cb9SYingwei Zhengentry: 87542a3cb9SYingwei Zheng %cmp = fcmp ogt float %x, 3.000000e+00 88542a3cb9SYingwei Zheng br i1 %cmp, label %if.then, label %if.else 89542a3cb9SYingwei Zhengif.then: 90542a3cb9SYingwei Zheng %abs = call float @llvm.fabs.f32(float %x) 91542a3cb9SYingwei Zheng %ret = fcmp oeq float %abs, 0x7FF0000000000000 92542a3cb9SYingwei Zheng ret i1 %ret 93542a3cb9SYingwei Zhengif.else: 94542a3cb9SYingwei Zheng ret i1 false 95542a3cb9SYingwei Zheng} 96542a3cb9SYingwei Zheng 97542a3cb9SYingwei Zhengdefine float @test4(float %x) { 98542a3cb9SYingwei Zheng; CHECK-LABEL: define float @test4( 99542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) { 100542a3cb9SYingwei Zheng; CHECK-NEXT: entry: 101542a3cb9SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[X]], 0x3EB0C6F7A0000000 102542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 103542a3cb9SYingwei Zheng; CHECK: if.then: 104542a3cb9SYingwei Zheng; CHECK-NEXT: ret float 1.000000e+00 105542a3cb9SYingwei Zheng; CHECK: if.end: 106542a3cb9SYingwei Zheng; CHECK-NEXT: [[DIV:%.*]] = fdiv float 1.000000e+00, [[X]] 107542a3cb9SYingwei Zheng; CHECK-NEXT: ret float [[DIV]] 108542a3cb9SYingwei Zheng; 109542a3cb9SYingwei Zhengentry: 110542a3cb9SYingwei Zheng %cmp = fcmp olt float %x, 0x3EB0C6F7A0000000 111542a3cb9SYingwei Zheng br i1 %cmp, label %if.then, label %if.end 112542a3cb9SYingwei Zheng 113542a3cb9SYingwei Zhengif.then: 114542a3cb9SYingwei Zheng ret float 1.0 115542a3cb9SYingwei Zheng 116542a3cb9SYingwei Zhengif.end: 117542a3cb9SYingwei Zheng %cmp.i = fcmp oeq float %x, 0.000000e+00 118542a3cb9SYingwei Zheng %div = fdiv float 1.000000e+00, %x 119542a3cb9SYingwei Zheng %ret = select i1 %cmp.i, float 1.000000e+00, float %div 120542a3cb9SYingwei Zheng ret float %ret 121542a3cb9SYingwei Zheng} 122542a3cb9SYingwei Zheng 123542a3cb9SYingwei Zhengdefine i1 @test5(double %x, i1 %cond) { 124542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test5( 125542a3cb9SYingwei Zheng; CHECK-SAME: double [[X:%.*]], i1 [[COND:%.*]]) { 126542a3cb9SYingwei Zheng; CHECK-NEXT: entry: 127542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]] 128542a3cb9SYingwei Zheng; CHECK: if: 129542a3cb9SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = fcmp uno double [[X]], 0.000000e+00 130542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 131542a3cb9SYingwei Zheng; CHECK: if.then: 132542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 133542a3cb9SYingwei Zheng; CHECK: if.end: 134542a3cb9SYingwei Zheng; CHECK-NEXT: br label [[EXIT]] 135542a3cb9SYingwei Zheng; CHECK: exit: 136542a3cb9SYingwei Zheng; CHECK-NEXT: [[Y:%.*]] = phi double [ -1.000000e+00, [[ENTRY:%.*]] ], [ [[X]], [[IF_END]] ] 137542a3cb9SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[Y]], i32 408) 138542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 139542a3cb9SYingwei Zheng; 140542a3cb9SYingwei Zhengentry: 141542a3cb9SYingwei Zheng br i1 %cond, label %if, label %exit 142542a3cb9SYingwei Zhengif: 143542a3cb9SYingwei Zheng %cmp = fcmp uno double %x, 0.000000e+00 144542a3cb9SYingwei Zheng br i1 %cmp, label %if.then, label %if.end 145542a3cb9SYingwei Zhengif.then: 146542a3cb9SYingwei Zheng ret i1 false 147542a3cb9SYingwei Zhengif.end: 148542a3cb9SYingwei Zheng br label %exit 149542a3cb9SYingwei Zhengexit: 150542a3cb9SYingwei Zheng %y = phi double [ -1.000000e+00, %entry ], [ %x, %if.end ] 151542a3cb9SYingwei Zheng %ret = tail call i1 @llvm.is.fpclass.f64(double %y, i32 411) 152542a3cb9SYingwei Zheng ret i1 %ret 153542a3cb9SYingwei Zheng} 154542a3cb9SYingwei Zheng 155542a3cb9SYingwei Zhengdefine i1 @test6(double %x) { 156542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test6( 157542a3cb9SYingwei Zheng; CHECK-SAME: double [[X:%.*]]) { 158542a3cb9SYingwei Zheng; CHECK-NEXT: entry: 159542a3cb9SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X]], 0.000000e+00 160542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[LAND_RHS:%.*]], label [[LAND_END:%.*]] 161542a3cb9SYingwei Zheng; CHECK: land.rhs: 162542a3cb9SYingwei Zheng; CHECK-NEXT: [[CMP_I:%.*]] = fcmp oeq double [[X]], 0x7FF0000000000000 163542a3cb9SYingwei Zheng; CHECK-NEXT: br label [[LAND_END]] 164542a3cb9SYingwei Zheng; CHECK: land.end: 165542a3cb9SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[CMP_I]], [[LAND_RHS]] ] 166542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 167542a3cb9SYingwei Zheng; 168542a3cb9SYingwei Zhengentry: 169542a3cb9SYingwei Zheng %cmp = fcmp ogt double %x, 0.000000e+00 170542a3cb9SYingwei Zheng br i1 %cmp, label %land.rhs, label %land.end 171542a3cb9SYingwei Zheng 172542a3cb9SYingwei Zhengland.rhs: 173542a3cb9SYingwei Zheng %abs = tail call double @llvm.fabs.f64(double %x) 174542a3cb9SYingwei Zheng %and.i = bitcast double %abs to i64 175542a3cb9SYingwei Zheng %cmp.i = icmp eq i64 %and.i, 9218868437227405312 176542a3cb9SYingwei Zheng br label %land.end 177542a3cb9SYingwei Zheng 178542a3cb9SYingwei Zhengland.end: 179542a3cb9SYingwei Zheng %ret = phi i1 [ false, %entry ], [ %cmp.i, %land.rhs ] 180542a3cb9SYingwei Zheng ret i1 %ret 181542a3cb9SYingwei Zheng} 182542a3cb9SYingwei Zheng 183542a3cb9SYingwei Zhengdefine i1 @test7(float %x) { 184542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test7( 185542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) { 186542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 345) 187542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 188542a3cb9SYingwei Zheng; CHECK: if.then: 189542a3cb9SYingwei Zheng; CHECK-NEXT: [[RET1:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 328) 190542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET1]] 191542a3cb9SYingwei Zheng; CHECK: if.else: 192542a3cb9SYingwei Zheng; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 128) 193542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET2]] 194542a3cb9SYingwei Zheng; 195542a3cb9SYingwei Zheng %cond = call i1 @llvm.is.fpclass.f32(float %x, i32 345) 196542a3cb9SYingwei Zheng br i1 %cond, label %if.then, label %if.else 197542a3cb9SYingwei Zhengif.then: 198542a3cb9SYingwei Zheng %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 456) 199542a3cb9SYingwei Zheng ret i1 %ret1 200542a3cb9SYingwei Zhengif.else: 201542a3cb9SYingwei Zheng %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 456) 202542a3cb9SYingwei Zheng ret i1 %ret2 203542a3cb9SYingwei Zheng} 204542a3cb9SYingwei Zheng 205542a3cb9SYingwei Zheng; TODO: These two is.fpclass can be simplified. 206542a3cb9SYingwei Zhengdefine i1 @test8(float %x) { 207542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test8( 208542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) { 209542a3cb9SYingwei Zheng; CHECK-NEXT: [[ABS:%.*]] = call float @llvm.fabs.f32(float [[X]]) 210542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = fcmp oeq float [[ABS]], 0x7FF0000000000000 211542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 212542a3cb9SYingwei Zheng; CHECK: if.then: 213db3bbe03SNoah Goldstein; CHECK-NEXT: ret i1 true 214542a3cb9SYingwei Zheng; CHECK: if.else: 215db3bbe03SNoah Goldstein; CHECK-NEXT: [[RET2:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 59) 216542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET2]] 217542a3cb9SYingwei Zheng; 218542a3cb9SYingwei Zheng %abs = call float @llvm.fabs.f32(float %x) 219542a3cb9SYingwei Zheng %cond = fcmp oeq float %abs, 0x7FF0000000000000 220542a3cb9SYingwei Zheng br i1 %cond, label %if.then, label %if.else 221542a3cb9SYingwei Zhengif.then: 222542a3cb9SYingwei Zheng %ret1 = call i1 @llvm.is.fpclass.f32(float %x, i32 575) 223542a3cb9SYingwei Zheng ret i1 %ret1 224542a3cb9SYingwei Zhengif.else: 225542a3cb9SYingwei Zheng %ret2 = call i1 @llvm.is.fpclass.f32(float %x, i32 575) 226542a3cb9SYingwei Zheng ret i1 %ret2 227542a3cb9SYingwei Zheng} 228542a3cb9SYingwei Zheng 229542a3cb9SYingwei Zhengdefine i1 @test9(float %x) { 230542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test9( 231542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) { 232542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00 233542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 234542a3cb9SYingwei Zheng; CHECK: if.then: 235542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 236542a3cb9SYingwei Zheng; CHECK: if.else: 237542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 238542a3cb9SYingwei Zheng; 239542a3cb9SYingwei Zheng %cond = fcmp olt float %x, -1.0 240542a3cb9SYingwei Zheng br i1 %cond, label %if.then, label %if.else 241542a3cb9SYingwei Zhengif.then: 242542a3cb9SYingwei Zheng %ret1 = fcmp oeq float %x, 0x7FF0000000000000 243542a3cb9SYingwei Zheng ret i1 %ret1 244542a3cb9SYingwei Zhengif.else: 245542a3cb9SYingwei Zheng ret i1 false 246542a3cb9SYingwei Zheng} 247542a3cb9SYingwei Zheng 248542a3cb9SYingwei Zhengdefine i1 @test10(float %x) { 249542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test10( 250542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]]) { 251542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00 252542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 253542a3cb9SYingwei Zheng; CHECK: if.then: 254542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 255542a3cb9SYingwei Zheng; CHECK: if.else: 256542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 257542a3cb9SYingwei Zheng; 258542a3cb9SYingwei Zheng %cond = fcmp olt float %x, -1.0 259542a3cb9SYingwei Zheng %neg = fneg float %x 260542a3cb9SYingwei Zheng br i1 %cond, label %if.then, label %if.else 261542a3cb9SYingwei Zhengif.then: 262542a3cb9SYingwei Zheng %ret1 = fcmp oeq float %neg, 0xFFF0000000000000 263542a3cb9SYingwei Zheng ret i1 %ret1 264542a3cb9SYingwei Zhengif.else: 265542a3cb9SYingwei Zheng ret i1 false 266542a3cb9SYingwei Zheng} 267542a3cb9SYingwei Zheng 268542a3cb9SYingwei Zhengdefine i1 @test11_and(float %x, i1 %cond2) { 269542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test11_and( 270542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) { 271542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = fcmp olt float [[X]], -1.000000e+00 272542a3cb9SYingwei Zheng; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND]], [[COND2]] 273542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[AND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 274542a3cb9SYingwei Zheng; CHECK: if.then: 27516ec5349SYingwei Zheng; CHECK-NEXT: ret i1 false 276542a3cb9SYingwei Zheng; CHECK: if.else: 277542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 278542a3cb9SYingwei Zheng; 279542a3cb9SYingwei Zheng %cond = fcmp olt float %x, -1.0 280542a3cb9SYingwei Zheng %neg = fneg float %x 281542a3cb9SYingwei Zheng %and = and i1 %cond, %cond2 282542a3cb9SYingwei Zheng br i1 %and, label %if.then, label %if.else 283542a3cb9SYingwei Zhengif.then: 284542a3cb9SYingwei Zheng %ret1 = fcmp oeq float %neg, 0xFFF0000000000000 285542a3cb9SYingwei Zheng ret i1 %ret1 286542a3cb9SYingwei Zhengif.else: 287542a3cb9SYingwei Zheng ret i1 false 288542a3cb9SYingwei Zheng} 289542a3cb9SYingwei Zheng 290542a3cb9SYingwei Zhengdefine i1 @test12_or(float %x, i1 %cond2) { 291542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test12_or( 292542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND2:%.*]]) { 293542a3cb9SYingwei Zheng; CHECK-NEXT: entry: 294542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00 295542a3cb9SYingwei Zheng; CHECK-NEXT: [[OR:%.*]] = or i1 [[COND]], [[COND2]] 296542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[OR]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] 297542a3cb9SYingwei Zheng; CHECK: if.then: 298542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 299542a3cb9SYingwei Zheng; CHECK: if.else: 30016ec5349SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 780) 301542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 302542a3cb9SYingwei Zheng; 303542a3cb9SYingwei Zhengentry: 304542a3cb9SYingwei Zheng %cond = fcmp ueq float %x, 0.000000e+00 305542a3cb9SYingwei Zheng %or = or i1 %cond, %cond2 306542a3cb9SYingwei Zheng br i1 %or, label %if.then, label %if.else 307542a3cb9SYingwei Zheng 308542a3cb9SYingwei Zhengif.then: 309542a3cb9SYingwei Zheng ret i1 false 310542a3cb9SYingwei Zheng 311542a3cb9SYingwei Zhengif.else: 312542a3cb9SYingwei Zheng %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783) 313542a3cb9SYingwei Zheng ret i1 %ret 314542a3cb9SYingwei Zheng} 315542a3cb9SYingwei Zheng 316542a3cb9SYingwei Zhengdefine i1 @test1_no_dominating(float %x, i1 %c) { 317542a3cb9SYingwei Zheng; CHECK-LABEL: define i1 @test1_no_dominating( 318542a3cb9SYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[C:%.*]]) { 319542a3cb9SYingwei Zheng; CHECK-NEXT: entry0: 320542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[C]], label [[ENTRY:%.*]], label [[IF_ELSE:%.*]] 321542a3cb9SYingwei Zheng; CHECK: entry: 322542a3cb9SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = fcmp ueq float [[X]], 0.000000e+00 323542a3cb9SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE]] 324542a3cb9SYingwei Zheng; CHECK: if.then: 325542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 false 326542a3cb9SYingwei Zheng; CHECK: if.else: 327542a3cb9SYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call i1 @llvm.is.fpclass.f32(float [[X]], i32 783) 328542a3cb9SYingwei Zheng; CHECK-NEXT: ret i1 [[RET]] 329542a3cb9SYingwei Zheng; 330542a3cb9SYingwei Zhengentry0: 331542a3cb9SYingwei Zheng br i1 %c, label %entry, label %if.else 332542a3cb9SYingwei Zheng 333542a3cb9SYingwei Zhengentry: 334542a3cb9SYingwei Zheng %cond = fcmp ueq float %x, 0.000000e+00 335542a3cb9SYingwei Zheng br i1 %cond, label %if.then, label %if.else 336542a3cb9SYingwei Zheng 337542a3cb9SYingwei Zhengif.then: 338542a3cb9SYingwei Zheng ret i1 false 339542a3cb9SYingwei Zheng 340542a3cb9SYingwei Zhengif.else: 341542a3cb9SYingwei Zheng %ret = call i1 @llvm.is.fpclass.f32(float %x, i32 783) 342542a3cb9SYingwei Zheng ret i1 %ret 343542a3cb9SYingwei Zheng} 34416a0629eSYingwei Zheng 34516a0629eSYingwei Zhengdefine float @test_signbit_check(float %x, i1 %cond) { 34616a0629eSYingwei Zheng; CHECK-LABEL: define float @test_signbit_check( 34716a0629eSYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) { 34816a0629eSYingwei Zheng; CHECK-NEXT: [[I32:%.*]] = bitcast float [[X]] to i32 34916a0629eSYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I32]], 0 35016a0629eSYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]] 35116a0629eSYingwei Zheng; CHECK: if.then1: 35216a0629eSYingwei Zheng; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] 35316a0629eSYingwei Zheng; CHECK-NEXT: br label [[IF_END:%.*]] 35416a0629eSYingwei Zheng; CHECK: if.else: 35516a0629eSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]] 35616a0629eSYingwei Zheng; CHECK: if.then2: 35716a0629eSYingwei Zheng; CHECK-NEXT: br label [[IF_END]] 35816a0629eSYingwei Zheng; CHECK: if.end: 35916a0629eSYingwei Zheng; CHECK-NEXT: [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ] 36016a0629eSYingwei Zheng; CHECK-NEXT: ret float [[VALUE]] 36116a0629eSYingwei Zheng; 36216a0629eSYingwei Zheng %i32 = bitcast float %x to i32 36316a0629eSYingwei Zheng %cmp = icmp slt i32 %i32, 0 36416a0629eSYingwei Zheng br i1 %cmp, label %if.then1, label %if.else 36516a0629eSYingwei Zheng 36616a0629eSYingwei Zhengif.then1: 36716a0629eSYingwei Zheng %fneg = fneg float %x 36816a0629eSYingwei Zheng br label %if.end 36916a0629eSYingwei Zheng 37016a0629eSYingwei Zhengif.else: 37116a0629eSYingwei Zheng br i1 %cond, label %if.then2, label %if.end 37216a0629eSYingwei Zheng 37316a0629eSYingwei Zhengif.then2: 37416a0629eSYingwei Zheng br label %if.end 37516a0629eSYingwei Zheng 37616a0629eSYingwei Zhengif.end: 37716a0629eSYingwei Zheng %value = phi float [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ] 37816a0629eSYingwei Zheng %ret = call float @llvm.fabs.f32(float %value) 37916a0629eSYingwei Zheng ret float %ret 38016a0629eSYingwei Zheng} 38116a0629eSYingwei Zheng 38216a0629eSYingwei Zhengdefine float @test_signbit_check_fail(float %x, i1 %cond) { 38316a0629eSYingwei Zheng; CHECK-LABEL: define float @test_signbit_check_fail( 38416a0629eSYingwei Zheng; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) { 38516a0629eSYingwei Zheng; CHECK-NEXT: [[I32:%.*]] = bitcast float [[X]] to i32 38616a0629eSYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I32]], 0 38716a0629eSYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]] 38816a0629eSYingwei Zheng; CHECK: if.then1: 38916a0629eSYingwei Zheng; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] 39016a0629eSYingwei Zheng; CHECK-NEXT: br label [[IF_END:%.*]] 39116a0629eSYingwei Zheng; CHECK: if.else: 39216a0629eSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]] 39316a0629eSYingwei Zheng; CHECK: if.then2: 39416a0629eSYingwei Zheng; CHECK-NEXT: [[FNEG2:%.*]] = fneg float [[X]] 39516a0629eSYingwei Zheng; CHECK-NEXT: br label [[IF_END]] 39616a0629eSYingwei Zheng; CHECK: if.end: 39716a0629eSYingwei Zheng; CHECK-NEXT: [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[FNEG2]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ] 39816a0629eSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fabs.f32(float [[VALUE]]) 39916a0629eSYingwei Zheng; CHECK-NEXT: ret float [[RET]] 40016a0629eSYingwei Zheng; 40116a0629eSYingwei Zheng %i32 = bitcast float %x to i32 40216a0629eSYingwei Zheng %cmp = icmp slt i32 %i32, 0 40316a0629eSYingwei Zheng br i1 %cmp, label %if.then1, label %if.else 40416a0629eSYingwei Zheng 40516a0629eSYingwei Zhengif.then1: 40616a0629eSYingwei Zheng %fneg = fneg float %x 40716a0629eSYingwei Zheng br label %if.end 40816a0629eSYingwei Zheng 40916a0629eSYingwei Zhengif.else: 41016a0629eSYingwei Zheng br i1 %cond, label %if.then2, label %if.end 41116a0629eSYingwei Zheng 41216a0629eSYingwei Zhengif.then2: 41316a0629eSYingwei Zheng %fneg2 = fneg float %x 41416a0629eSYingwei Zheng br label %if.end 41516a0629eSYingwei Zheng 41616a0629eSYingwei Zhengif.end: 41716a0629eSYingwei Zheng %value = phi float [ %fneg, %if.then1 ], [ %fneg2, %if.then2 ], [ %x, %if.else ] 41816a0629eSYingwei Zheng %ret = call float @llvm.fabs.f32(float %value) 41916a0629eSYingwei Zheng ret float %ret 42016a0629eSYingwei Zheng} 42116a0629eSYingwei Zheng 42216a0629eSYingwei Zhengdefine <2 x float> @test_signbit_check_wrong_type(<2 x float> %x, i1 %cond) { 42316a0629eSYingwei Zheng; CHECK-LABEL: define <2 x float> @test_signbit_check_wrong_type( 42416a0629eSYingwei Zheng; CHECK-SAME: <2 x float> [[X:%.*]], i1 [[COND:%.*]]) { 42516a0629eSYingwei Zheng; CHECK-NEXT: [[I32:%.*]] = bitcast <2 x float> [[X]] to i64 42616a0629eSYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[I32]], 0 42716a0629eSYingwei Zheng; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]] 42816a0629eSYingwei Zheng; CHECK: if.then1: 42916a0629eSYingwei Zheng; CHECK-NEXT: [[FNEG:%.*]] = fneg <2 x float> [[X]] 43016a0629eSYingwei Zheng; CHECK-NEXT: br label [[IF_END:%.*]] 43116a0629eSYingwei Zheng; CHECK: if.else: 43216a0629eSYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]] 43316a0629eSYingwei Zheng; CHECK: if.then2: 43416a0629eSYingwei Zheng; CHECK-NEXT: br label [[IF_END]] 43516a0629eSYingwei Zheng; CHECK: if.end: 43616a0629eSYingwei Zheng; CHECK-NEXT: [[VALUE:%.*]] = phi <2 x float> [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ] 43716a0629eSYingwei Zheng; CHECK-NEXT: [[RET:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[VALUE]]) 43816a0629eSYingwei Zheng; CHECK-NEXT: ret <2 x float> [[RET]] 43916a0629eSYingwei Zheng; 44016a0629eSYingwei Zheng %i32 = bitcast <2 x float> %x to i64 44116a0629eSYingwei Zheng %cmp = icmp slt i64 %i32, 0 44216a0629eSYingwei Zheng br i1 %cmp, label %if.then1, label %if.else 44316a0629eSYingwei Zheng 44416a0629eSYingwei Zhengif.then1: 44516a0629eSYingwei Zheng %fneg = fneg <2 x float> %x 44616a0629eSYingwei Zheng br label %if.end 44716a0629eSYingwei Zheng 44816a0629eSYingwei Zhengif.else: 44916a0629eSYingwei Zheng br i1 %cond, label %if.then2, label %if.end 45016a0629eSYingwei Zheng 45116a0629eSYingwei Zhengif.then2: 45216a0629eSYingwei Zheng br label %if.end 45316a0629eSYingwei Zheng 45416a0629eSYingwei Zhengif.end: 45516a0629eSYingwei Zheng %value = phi <2 x float> [ %fneg, %if.then1 ], [ %x, %if.then2 ], [ %x, %if.else ] 45616a0629eSYingwei Zheng %ret = call <2 x float> @llvm.fabs.v2f32(<2 x float> %value) 45716a0629eSYingwei Zheng ret <2 x float> %ret 45816a0629eSYingwei Zheng} 459*a67bd94fSYingwei Zheng 460*a67bd94fSYingwei Zhengdefine i1 @pr118257(half %v0, half %v1) { 461*a67bd94fSYingwei Zheng; CHECK-LABEL: define i1 @pr118257( 462*a67bd94fSYingwei Zheng; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) { 463*a67bd94fSYingwei Zheng; CHECK-NEXT: entry: 464*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000 465*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CAST0:%.*]] = bitcast half [[V0]] to i16 466*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[CAST0]], 0 467*a67bd94fSYingwei Zheng; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]] 468*a67bd94fSYingwei Zheng; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]] 469*a67bd94fSYingwei Zheng; CHECK: if.else: 470*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CAST1:%.*]] = bitcast half [[V1]] to i16 471*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0 472*a67bd94fSYingwei Zheng; CHECK-NEXT: ret i1 [[CMP3]] 473*a67bd94fSYingwei Zheng; CHECK: if.end: 474*a67bd94fSYingwei Zheng; CHECK-NEXT: ret i1 false 475*a67bd94fSYingwei Zheng; 476*a67bd94fSYingwei Zhengentry: 477*a67bd94fSYingwei Zheng %cmp1 = fcmp une half %v1, 0.000000e+00 478*a67bd94fSYingwei Zheng %cast0 = bitcast half %v0 to i16 479*a67bd94fSYingwei Zheng %cmp2 = icmp slt i16 %cast0, 0 480*a67bd94fSYingwei Zheng %or.cond = or i1 %cmp1, %cmp2 481*a67bd94fSYingwei Zheng br i1 %or.cond, label %if.end, label %if.else 482*a67bd94fSYingwei Zheng 483*a67bd94fSYingwei Zhengif.else: 484*a67bd94fSYingwei Zheng %cast1 = bitcast half %v1 to i16 485*a67bd94fSYingwei Zheng %cmp3 = icmp slt i16 %cast1, 0 486*a67bd94fSYingwei Zheng ret i1 %cmp3 487*a67bd94fSYingwei Zheng 488*a67bd94fSYingwei Zhengif.end: 489*a67bd94fSYingwei Zheng ret i1 false 490*a67bd94fSYingwei Zheng} 491*a67bd94fSYingwei Zheng 492*a67bd94fSYingwei Zhengdefine i1 @pr118257_is_fpclass(half %v0, half %v1) { 493*a67bd94fSYingwei Zheng; CHECK-LABEL: define i1 @pr118257_is_fpclass( 494*a67bd94fSYingwei Zheng; CHECK-SAME: half [[V0:%.*]], half [[V1:%.*]]) { 495*a67bd94fSYingwei Zheng; CHECK-NEXT: entry: 496*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CMP1:%.*]] = fcmp une half [[V1]], 0xH0000 497*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CMP2:%.*]] = call i1 @llvm.is.fpclass.f16(half [[V0]], i32 35) 498*a67bd94fSYingwei Zheng; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP1]], [[CMP2]] 499*a67bd94fSYingwei Zheng; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_END:%.*]], label [[IF_ELSE:%.*]] 500*a67bd94fSYingwei Zheng; CHECK: if.else: 501*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CAST1:%.*]] = bitcast half [[V1]] to i16 502*a67bd94fSYingwei Zheng; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i16 [[CAST1]], 0 503*a67bd94fSYingwei Zheng; CHECK-NEXT: ret i1 [[CMP3]] 504*a67bd94fSYingwei Zheng; CHECK: if.end: 505*a67bd94fSYingwei Zheng; CHECK-NEXT: ret i1 false 506*a67bd94fSYingwei Zheng; 507*a67bd94fSYingwei Zhengentry: 508*a67bd94fSYingwei Zheng %cmp1 = fcmp une half %v1, 0.000000e+00 509*a67bd94fSYingwei Zheng %cmp2 = call i1 @llvm.is.fpclass.half(half %v0, i32 35) 510*a67bd94fSYingwei Zheng %or.cond = or i1 %cmp1, %cmp2 511*a67bd94fSYingwei Zheng br i1 %or.cond, label %if.end, label %if.else 512*a67bd94fSYingwei Zheng 513*a67bd94fSYingwei Zhengif.else: 514*a67bd94fSYingwei Zheng %cast1 = bitcast half %v1 to i16 515*a67bd94fSYingwei Zheng %cmp3 = icmp slt i16 %cast1, 0 516*a67bd94fSYingwei Zheng ret i1 %cmp3 517*a67bd94fSYingwei Zheng 518*a67bd94fSYingwei Zhengif.end: 519*a67bd94fSYingwei Zheng ret i1 false 520*a67bd94fSYingwei Zheng} 521