602 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			602 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: opt -instcombine -S < %s | FileCheck %s
 | 
						|
 | 
						|
; --------------------------------------------------------------------
 | 
						|
; llvm.amdgcn.rcp
 | 
						|
; --------------------------------------------------------------------
 | 
						|
 | 
						|
declare float @llvm.amdgcn.rcp.f32(float) nounwind readnone
 | 
						|
declare double @llvm.amdgcn.rcp.f64(double) nounwind readnone
 | 
						|
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_rcp_f32_1
 | 
						|
; CHECK-NEXT: ret float 1.000000e+00
 | 
						|
define float @test_constant_fold_rcp_f32_1() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.rcp.f32(float 1.0) nounwind readnone
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_rcp_f64_1
 | 
						|
; CHECK-NEXT:  ret double 1.000000e+00
 | 
						|
define double @test_constant_fold_rcp_f64_1() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.rcp.f64(double 1.0) nounwind readnone
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_rcp_f32_half
 | 
						|
; CHECK-NEXT: ret float 2.000000e+00
 | 
						|
define float @test_constant_fold_rcp_f32_half() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.rcp.f32(float 0.5) nounwind readnone
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_rcp_f64_half
 | 
						|
; CHECK-NEXT:  ret double 2.000000e+00
 | 
						|
define double @test_constant_fold_rcp_f64_half() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.rcp.f64(double 0.5) nounwind readnone
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_rcp_f32_43
 | 
						|
; CHECK-NEXT: call float @llvm.amdgcn.rcp.f32(float 4.300000e+01)
 | 
						|
define float @test_constant_fold_rcp_f32_43() nounwind {
 | 
						|
 %val = call float @llvm.amdgcn.rcp.f32(float 4.300000e+01) nounwind readnone
 | 
						|
 ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_rcp_f64_43
 | 
						|
; CHECK-NEXT: call double @llvm.amdgcn.rcp.f64(double 4.300000e+01)
 | 
						|
define double @test_constant_fold_rcp_f64_43() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.rcp.f64(double 4.300000e+01) nounwind readnone
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
; --------------------------------------------------------------------
 | 
						|
; llvm.amdgcn.frexp.mant
 | 
						|
; --------------------------------------------------------------------
 | 
						|
 | 
						|
declare float @llvm.amdgcn.frexp.mant.f32(float) nounwind readnone
 | 
						|
declare double @llvm.amdgcn.frexp.mant.f64(double) nounwind readnone
 | 
						|
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_undef(
 | 
						|
; CHECK-NEXT: ret float undef
 | 
						|
define float @test_constant_fold_frexp_mant_f32_undef() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float undef)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_undef(
 | 
						|
; CHECK-NEXT:  ret double undef
 | 
						|
define double @test_constant_fold_frexp_mant_f64_undef() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double undef)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_0(
 | 
						|
; CHECK-NEXT: ret float 0.000000e+00
 | 
						|
define float @test_constant_fold_frexp_mant_f32_0() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0.0)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_0(
 | 
						|
; CHECK-NEXT:  ret double 0.000000e+00
 | 
						|
define double @test_constant_fold_frexp_mant_f64_0() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0.0)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n0(
 | 
						|
; CHECK-NEXT: ret float -0.000000e+00
 | 
						|
define float @test_constant_fold_frexp_mant_f32_n0() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float -0.0)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n0(
 | 
						|
; CHECK-NEXT:  ret double -0.000000e+00
 | 
						|
define double @test_constant_fold_frexp_mant_f64_n0() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double -0.0)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_1(
 | 
						|
; CHECK-NEXT: ret float 5.000000e-01
 | 
						|
define float @test_constant_fold_frexp_mant_f32_1() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float 1.0)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_1(
 | 
						|
; CHECK-NEXT:  ret double 5.000000e-01
 | 
						|
define double @test_constant_fold_frexp_mant_f64_1() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double 1.0)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_n1(
 | 
						|
; CHECK-NEXT: ret float -5.000000e-01
 | 
						|
define float @test_constant_fold_frexp_mant_f32_n1() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float -1.0)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_n1(
 | 
						|
; CHECK-NEXT:  ret double -5.000000e-01
 | 
						|
define double @test_constant_fold_frexp_mant_f64_n1() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double -1.0)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_nan(
 | 
						|
; CHECK-NEXT: ret float 0x7FF8000000000000
 | 
						|
define float @test_constant_fold_frexp_mant_f32_nan() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF8000000000000)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_nan(
 | 
						|
; CHECK-NEXT:  ret double 0x7FF8000000000000
 | 
						|
define double @test_constant_fold_frexp_mant_f64_nan() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF8000000000000)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_inf(
 | 
						|
; CHECK-NEXT: ret float 0x7FF0000000000000
 | 
						|
define float @test_constant_fold_frexp_mant_f32_inf() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x7FF0000000000000)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_inf(
 | 
						|
; CHECK-NEXT:  ret double 0x7FF0000000000000
 | 
						|
define double @test_constant_fold_frexp_mant_f64_inf() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FF0000000000000)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_ninf(
 | 
						|
; CHECK-NEXT: ret float 0xFFF0000000000000
 | 
						|
define float @test_constant_fold_frexp_mant_f32_ninf() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0xFFF0000000000000)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_ninf(
 | 
						|
; CHECK-NEXT:  ret double 0xFFF0000000000000
 | 
						|
define double @test_constant_fold_frexp_mant_f64_ninf() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0xFFF0000000000000)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_max_num(
 | 
						|
; CHECK-NEXT: ret float 0x3FEFFFFFE0000000
 | 
						|
define float @test_constant_fold_frexp_mant_f32_max_num() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x47EFFFFFE0000000)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_max_num(
 | 
						|
; CHECK-NEXT:  ret double 0x3FEFFFFFFFFFFFFF
 | 
						|
define double @test_constant_fold_frexp_mant_f64_max_num() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double 0x7FEFFFFFFFFFFFFF)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f32_min_num(
 | 
						|
; CHECK-NEXT: ret float 5.000000e-01
 | 
						|
define float @test_constant_fold_frexp_mant_f32_min_num() nounwind {
 | 
						|
  %val = call float @llvm.amdgcn.frexp.mant.f32(float 0x36A0000000000000)
 | 
						|
  ret float %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_mant_f64_min_num(
 | 
						|
; CHECK-NEXT:  ret double 5.000000e-01
 | 
						|
define double @test_constant_fold_frexp_mant_f64_min_num() nounwind {
 | 
						|
  %val = call double @llvm.amdgcn.frexp.mant.f64(double 4.940656e-324)
 | 
						|
  ret double %val
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
; --------------------------------------------------------------------
 | 
						|
; llvm.amdgcn.frexp.exp
 | 
						|
; --------------------------------------------------------------------
 | 
						|
 | 
						|
declare i32 @llvm.amdgcn.frexp.exp.f32(float) nounwind readnone
 | 
						|
declare i32 @llvm.amdgcn.frexp.exp.f64(double) nounwind readnone
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_undef(
 | 
						|
; CHECK-NEXT: ret i32 undef
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_undef() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float undef)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_undef(
 | 
						|
; CHECK-NEXT:  ret i32 undef
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_undef() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double undef)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_0(
 | 
						|
; CHECK-NEXT: ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_0() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_0(
 | 
						|
; CHECK-NEXT:  ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_0() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n0(
 | 
						|
; CHECK-NEXT: ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_n0() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -0.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n0(
 | 
						|
; CHECK-NEXT:  ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_n0() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -0.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1024(
 | 
						|
; CHECK-NEXT: ret i32 11
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_1024() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 1024.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1024(
 | 
						|
; CHECK-NEXT:  ret i32 11
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_1024() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 1024.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_n1024(
 | 
						|
; CHECK-NEXT: ret i32 11
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_n1024() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float -1024.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_n1024(
 | 
						|
; CHECK-NEXT:  ret i32 11
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_n1024() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double -1024.0)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_1_1024(
 | 
						|
; CHECK-NEXT: ret i32 -9
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_1_1024() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0.0009765625)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_1_1024(
 | 
						|
; CHECK-NEXT:  ret i32 -9
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_1_1024() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0.0009765625)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_nan(
 | 
						|
; CHECK-NEXT: ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_nan() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF8000000000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_nan(
 | 
						|
; CHECK-NEXT:  ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_nan() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF8000000000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_inf(
 | 
						|
; CHECK-NEXT: ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_inf() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x7FF0000000000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_inf(
 | 
						|
; CHECK-NEXT:  ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_inf() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FF0000000000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_ninf(
 | 
						|
; CHECK-NEXT: ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_ninf() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0xFFF0000000000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_ninf(
 | 
						|
; CHECK-NEXT:  ret i32 0
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_ninf() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0xFFF0000000000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_max_num(
 | 
						|
; CHECK-NEXT: ret i32 128
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_max_num() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x47EFFFFFE0000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_max_num(
 | 
						|
; CHECK-NEXT:  ret i32 1024
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_max_num() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 0x7FEFFFFFFFFFFFFF)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f32_min_num(
 | 
						|
; CHECK-NEXT: ret i32 -148
 | 
						|
define i32 @test_constant_fold_frexp_exp_f32_min_num() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f32(float 0x36A0000000000000)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_fold_frexp_exp_f64_min_num(
 | 
						|
; CHECK-NEXT:  ret i32 -1073
 | 
						|
define i32 @test_constant_fold_frexp_exp_f64_min_num() nounwind {
 | 
						|
  %val = call i32 @llvm.amdgcn.frexp.exp.f64(double 4.940656e-324)
 | 
						|
  ret i32 %val
 | 
						|
}
 | 
						|
 | 
						|
; --------------------------------------------------------------------
 | 
						|
; llvm.amdgcn.class
 | 
						|
; --------------------------------------------------------------------
 | 
						|
 | 
						|
declare i1 @llvm.amdgcn.class.f32(float, i32) nounwind readnone
 | 
						|
declare i1 @llvm.amdgcn.class.f64(double, i32) nounwind readnone
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_undef_mask_f32(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_class_undef_mask_f32(float %x) nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 undef)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_over_max_mask_f32(
 | 
						|
; CHECK: %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 1)
 | 
						|
define i1 @test_class_over_max_mask_f32(float %x) nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 1025)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_no_mask_f32(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_class_no_mask_f32(float %x) nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 0)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_full_mask_f32(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_class_full_mask_f32(float %x) nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 1023)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_undef_no_mask_f32(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_class_undef_no_mask_f32() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 0)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_undef_full_mask_f32(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_class_undef_full_mask_f32() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 1023)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_undef_val_f32(
 | 
						|
; CHECK: ret i1 undef
 | 
						|
define i1 @test_class_undef_val_f32() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 4)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_undef_undef_f32(
 | 
						|
; CHECK: ret i1 undef
 | 
						|
define i1 @test_class_undef_undef_f32() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float undef, i32 undef)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_var_mask_f32(
 | 
						|
; CHECK: %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 %mask)
 | 
						|
define i1 @test_class_var_mask_f32(float %x, i32 %mask) nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 %mask)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_class_isnan_f32(
 | 
						|
; CHECK: %val = fcmp uno float %x, 0.000000e+00
 | 
						|
define i1 @test_class_isnan_f32(float %x) nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f32(float %x, i32 3)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_snan_test_snan_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_snan_test_snan_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000001, i32 1)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_qnan_test_qnan_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_qnan_test_qnan_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 2)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_qnan_test_snan_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_qnan_test_snan_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 1)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_ninf_test_ninf_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_ninf_test_ninf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0xFFF0000000000000, i32 4)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_pinf_test_ninf_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_pinf_test_ninf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000000, i32 4)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_qnan_test_ninf_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_qnan_test_ninf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 4)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_snan_test_ninf_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_snan_test_ninf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000001, i32 4)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_nnormal_test_nnormal_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_nnormal_test_nnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double -1.0, i32 8)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_pnormal_test_nnormal_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_pnormal_test_nnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 1.0, i32 8)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_nsubnormal_test_nsubnormal_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_nsubnormal_test_nsubnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x800fffffffffffff, i32 16)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_psubnormal_test_nsubnormal_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_psubnormal_test_nsubnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x000fffffffffffff, i32 16)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_nzero_test_nzero_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_nzero_test_nzero_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double -0.0, i32 32)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_pzero_test_nzero_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_pzero_test_nzero_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0.0, i32 32)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_pzero_test_pzero_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_pzero_test_pzero_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0.0, i32 64)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_nzero_test_pzero_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_nzero_test_pzero_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double -0.0, i32 64)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_psubnormal_test_psubnormal_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_psubnormal_test_psubnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x000fffffffffffff, i32 128)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_nsubnormal_test_psubnormal_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_nsubnormal_test_psubnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x800fffffffffffff, i32 128)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_pnormal_test_pnormal_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_pnormal_test_pnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 1.0, i32 256)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_nnormal_test_pnormal_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_nnormal_test_pnormal_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double -1.0, i32 256)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_pinf_test_pinf_f64(
 | 
						|
; CHECK: ret i1 true
 | 
						|
define i1 @test_constant_class_pinf_test_pinf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000000, i32 512)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_ninf_test_pinf_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_ninf_test_pinf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0xFFF0000000000000, i32 512)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_qnan_test_pinf_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_qnan_test_pinf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF8000000000000, i32 512)
 | 
						|
  ret i1 %val
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @test_constant_class_snan_test_pinf_f64(
 | 
						|
; CHECK: ret i1 false
 | 
						|
define i1 @test_constant_class_snan_test_pinf_f64() nounwind {
 | 
						|
  %val = call i1 @llvm.amdgcn.class.f64(double 0x7FF0000000000001, i32 512)
 | 
						|
  ret i1 %val
 | 
						|
}
 |