@@ -320,3 +320,119 @@ if.else:
320
320
%ret = call i1 @llvm.is.fpclass.f32 (float %x , i32 783 )
321
321
ret i1 %ret
322
322
}
323
+
324
+ define float @test_signbit_check (float %x , i1 %cond ) {
325
+ ; CHECK-LABEL: define float @test_signbit_check(
326
+ ; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {
327
+ ; CHECK-NEXT: [[I32:%.*]] = bitcast float [[X]] to i32
328
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I32]], 0
329
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
330
+ ; CHECK: if.then1:
331
+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]]
332
+ ; CHECK-NEXT: br label [[IF_END:%.*]]
333
+ ; CHECK: if.else:
334
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
335
+ ; CHECK: if.then2:
336
+ ; CHECK-NEXT: br label [[IF_END]]
337
+ ; CHECK: if.end:
338
+ ; CHECK-NEXT: [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
339
+ ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fabs.f32(float [[VALUE]])
340
+ ; CHECK-NEXT: ret float [[RET]]
341
+ ;
342
+ %i32 = bitcast float %x to i32
343
+ %cmp = icmp slt i32 %i32 , 0
344
+ br i1 %cmp , label %if.then1 , label %if.else
345
+
346
+ if.then1:
347
+ %fneg = fneg float %x
348
+ br label %if.end
349
+
350
+ if.else:
351
+ br i1 %cond , label %if.then2 , label %if.end
352
+
353
+ if.then2:
354
+ br label %if.end
355
+
356
+ if.end:
357
+ %value = phi float [ %fneg , %if.then1 ], [ %x , %if.then2 ], [ %x , %if.else ]
358
+ %ret = call float @llvm.fabs.f32 (float %value )
359
+ ret float %ret
360
+ }
361
+
362
+ define float @test_signbit_check_fail (float %x , i1 %cond ) {
363
+ ; CHECK-LABEL: define float @test_signbit_check_fail(
364
+ ; CHECK-SAME: float [[X:%.*]], i1 [[COND:%.*]]) {
365
+ ; CHECK-NEXT: [[I32:%.*]] = bitcast float [[X]] to i32
366
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[I32]], 0
367
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
368
+ ; CHECK: if.then1:
369
+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]]
370
+ ; CHECK-NEXT: br label [[IF_END:%.*]]
371
+ ; CHECK: if.else:
372
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
373
+ ; CHECK: if.then2:
374
+ ; CHECK-NEXT: [[FNEG2:%.*]] = fneg float [[X]]
375
+ ; CHECK-NEXT: br label [[IF_END]]
376
+ ; CHECK: if.end:
377
+ ; CHECK-NEXT: [[VALUE:%.*]] = phi float [ [[FNEG]], [[IF_THEN1]] ], [ [[FNEG2]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
378
+ ; CHECK-NEXT: [[RET:%.*]] = call float @llvm.fabs.f32(float [[VALUE]])
379
+ ; CHECK-NEXT: ret float [[RET]]
380
+ ;
381
+ %i32 = bitcast float %x to i32
382
+ %cmp = icmp slt i32 %i32 , 0
383
+ br i1 %cmp , label %if.then1 , label %if.else
384
+
385
+ if.then1:
386
+ %fneg = fneg float %x
387
+ br label %if.end
388
+
389
+ if.else:
390
+ br i1 %cond , label %if.then2 , label %if.end
391
+
392
+ if.then2:
393
+ %fneg2 = fneg float %x
394
+ br label %if.end
395
+
396
+ if.end:
397
+ %value = phi float [ %fneg , %if.then1 ], [ %fneg2 , %if.then2 ], [ %x , %if.else ]
398
+ %ret = call float @llvm.fabs.f32 (float %value )
399
+ ret float %ret
400
+ }
401
+
402
+ define <2 x float > @test_signbit_check_wrong_type (<2 x float > %x , i1 %cond ) {
403
+ ; CHECK-LABEL: define <2 x float> @test_signbit_check_wrong_type(
404
+ ; CHECK-SAME: <2 x float> [[X:%.*]], i1 [[COND:%.*]]) {
405
+ ; CHECK-NEXT: [[I32:%.*]] = bitcast <2 x float> [[X]] to i64
406
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[I32]], 0
407
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_ELSE:%.*]]
408
+ ; CHECK: if.then1:
409
+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg <2 x float> [[X]]
410
+ ; CHECK-NEXT: br label [[IF_END:%.*]]
411
+ ; CHECK: if.else:
412
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN2:%.*]], label [[IF_END]]
413
+ ; CHECK: if.then2:
414
+ ; CHECK-NEXT: br label [[IF_END]]
415
+ ; CHECK: if.end:
416
+ ; CHECK-NEXT: [[VALUE:%.*]] = phi <2 x float> [ [[FNEG]], [[IF_THEN1]] ], [ [[X]], [[IF_THEN2]] ], [ [[X]], [[IF_ELSE]] ]
417
+ ; CHECK-NEXT: [[RET:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[VALUE]])
418
+ ; CHECK-NEXT: ret <2 x float> [[RET]]
419
+ ;
420
+ %i32 = bitcast <2 x float > %x to i64
421
+ %cmp = icmp slt i64 %i32 , 0
422
+ br i1 %cmp , label %if.then1 , label %if.else
423
+
424
+ if.then1:
425
+ %fneg = fneg <2 x float > %x
426
+ br label %if.end
427
+
428
+ if.else:
429
+ br i1 %cond , label %if.then2 , label %if.end
430
+
431
+ if.then2:
432
+ br label %if.end
433
+
434
+ if.end:
435
+ %value = phi <2 x float > [ %fneg , %if.then1 ], [ %x , %if.then2 ], [ %x , %if.else ]
436
+ %ret = call <2 x float > @llvm.fabs.v2f32 (<2 x float > %value )
437
+ ret <2 x float > %ret
438
+ }
0 commit comments