1919 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 52// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -emit-llvm %s | FileCheck %s -check-prefixes=DEFAULT3// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -ffp-exception-behavior=ignore -emit-llvm %s | FileCheck %s -check-prefixes=IGNORE4// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s -check-prefixes=STRICT5// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s -check-prefixes=MAYTRAP6// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -fmath-errno -emit-llvm %s | FileCheck %s -check-prefixes=ERRNO7// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -emit-llvm %s | FileCheck %s -check-prefixes=AMDGCNSPIRV-DEFAULT8// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -ffp-exception-behavior=ignore -emit-llvm %s | FileCheck %s -check-prefixes=AMDGCNSPIRV-IGNORE9// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s -check-prefixes=AMDGCNSPIRV-STRICT10// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s -check-prefixes=AMDGCNSPIRV-MAYTRAP11// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -fmath-errno -emit-llvm %s | FileCheck %s -check-prefixes=AMDGCNSPIRV-ERRNO12 13// DEFAULT-LABEL: define dso_local void @test_logbf(14// DEFAULT-SAME: ) #[[ATTR0:[0-9]+]] {15// DEFAULT-NEXT: [[ENTRY:.*:]]16// DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)17// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr18// DEFAULT-NEXT: [[TMP0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)19// DEFAULT-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 120// DEFAULT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -121// DEFAULT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float22// DEFAULT-NEXT: [[TMP4:%.*]] = call float @llvm.fabs.f32(float 0x40301999A0000000)23// DEFAULT-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF000000000000024// DEFAULT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]25// DEFAULT-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]26// DEFAULT-NEXT: store float [[TMP7]], ptr [[D1_ASCAST]], align 427// DEFAULT-NEXT: ret void28//29// IGNORE-LABEL: define dso_local void @test_logbf(30// IGNORE-SAME: ) #[[ATTR0:[0-9]+]] {31// IGNORE-NEXT: [[ENTRY:.*:]]32// IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)33// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr34// IGNORE-NEXT: [[TMP0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)35// IGNORE-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 136// IGNORE-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -137// IGNORE-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float38// IGNORE-NEXT: [[TMP4:%.*]] = call float @llvm.fabs.f32(float 0x40301999A0000000)39// IGNORE-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF000000000000040// IGNORE-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]41// IGNORE-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]42// IGNORE-NEXT: store float [[TMP7]], ptr [[D1_ASCAST]], align 443// IGNORE-NEXT: ret void44//45// STRICT-LABEL: define dso_local void @test_logbf(46// STRICT-SAME: ) #[[ATTR0:[0-9]+]] {47// STRICT-NEXT: [[ENTRY:.*:]]48// STRICT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)49// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr50// STRICT-NEXT: [[TMP0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)51// STRICT-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 152// STRICT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -153// STRICT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float54// STRICT-NEXT: [[TMP4:%.*]] = call float @llvm.fabs.f32(float 0x40301999A0000000)55// STRICT-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF000000000000056// STRICT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]57// STRICT-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]58// STRICT-NEXT: store float [[TMP7]], ptr [[D1_ASCAST]], align 459// STRICT-NEXT: ret void60//61// MAYTRAP-LABEL: define dso_local void @test_logbf(62// MAYTRAP-SAME: ) #[[ATTR0:[0-9]+]] {63// MAYTRAP-NEXT: [[ENTRY:.*:]]64// MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)65// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr66// MAYTRAP-NEXT: [[TMP0:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)67// MAYTRAP-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 168// MAYTRAP-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -169// MAYTRAP-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float70// MAYTRAP-NEXT: [[TMP4:%.*]] = call float @llvm.fabs.f32(float 0x40301999A0000000)71// MAYTRAP-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF000000000000072// MAYTRAP-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]73// MAYTRAP-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]74// MAYTRAP-NEXT: store float [[TMP7]], ptr [[D1_ASCAST]], align 475// MAYTRAP-NEXT: ret void76//77// ERRNO-LABEL: define dso_local void @test_logbf(78// ERRNO-SAME: ) #[[ATTR0:[0-9]+]] {79// ERRNO-NEXT: [[ENTRY:.*:]]80// ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)81// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr82// ERRNO-NEXT: [[CALL:%.*]] = call float @logbf(float noundef 0x40301999A0000000) #[[ATTR2:[0-9]+]]83// ERRNO-NEXT: store float [[CALL]], ptr [[D1_ASCAST]], align 484// ERRNO-NEXT: ret void85//86// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logbf(87// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {88// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]89// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 490// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)91// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)92// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 193// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -194// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float95// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP4:%.*]] = call addrspace(4) float @llvm.fabs.f32(float 0x40301999A0000000)96// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF000000000000097// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]98// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]99// AMDGCNSPIRV-DEFAULT-NEXT: store float [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 4100// AMDGCNSPIRV-DEFAULT-NEXT: ret void101//102// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logbf(103// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {104// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]105// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4106// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)107// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)108// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 1109// AMDGCNSPIRV-IGNORE-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1110// AMDGCNSPIRV-IGNORE-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float111// AMDGCNSPIRV-IGNORE-NEXT: [[TMP4:%.*]] = call addrspace(4) float @llvm.fabs.f32(float 0x40301999A0000000)112// AMDGCNSPIRV-IGNORE-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF0000000000000113// AMDGCNSPIRV-IGNORE-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]114// AMDGCNSPIRV-IGNORE-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]115// AMDGCNSPIRV-IGNORE-NEXT: store float [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 4116// AMDGCNSPIRV-IGNORE-NEXT: ret void117//118// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_logbf(119// AMDGCNSPIRV-STRICT-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {120// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]121// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca float, align 4122// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)123// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)124// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 1125// AMDGCNSPIRV-STRICT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1126// AMDGCNSPIRV-STRICT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float127// AMDGCNSPIRV-STRICT-NEXT: [[TMP4:%.*]] = call addrspace(4) float @llvm.fabs.f32(float 0x40301999A0000000)128// AMDGCNSPIRV-STRICT-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF0000000000000129// AMDGCNSPIRV-STRICT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]130// AMDGCNSPIRV-STRICT-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]131// AMDGCNSPIRV-STRICT-NEXT: store float [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 4132// AMDGCNSPIRV-STRICT-NEXT: ret void133//134// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_logbf(135// AMDGCNSPIRV-MAYTRAP-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {136// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]137// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4138// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)139// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float 0x40301999A0000000)140// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 1141// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1142// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to float143// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP4:%.*]] = call addrspace(4) float @llvm.fabs.f32(float 0x40301999A0000000)144// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP5:%.*]] = fcmp one float [[TMP4]], 0x7FF0000000000000145// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], float [[TMP3]], float [[TMP4]]146// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP7:%.*]] = select i1 false, float 0xFFF0000000000000, float [[TMP6]]147// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 4148// AMDGCNSPIRV-MAYTRAP-NEXT: ret void149//150// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_logbf(151// AMDGCNSPIRV-ERRNO-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {152// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]153// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4154// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)155// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) float @logbf(float noundef 0x40301999A0000000) #[[ATTR2:[0-9]+]]156// AMDGCNSPIRV-ERRNO-NEXT: store float [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 4157// AMDGCNSPIRV-ERRNO-NEXT: ret void158//159void test_logbf() {160 float D1 = __builtin_logbf(16.1f);161}162// DEFAULT-LABEL: define dso_local void @test_logbf_var(163// DEFAULT-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {164// DEFAULT-NEXT: [[ENTRY:.*:]]165// DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)166// DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)167// DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr168// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr169// DEFAULT-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4170// DEFAULT-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4171// DEFAULT-NEXT: [[TMP1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])172// DEFAULT-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1173// DEFAULT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1174// DEFAULT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float175// DEFAULT-NEXT: [[TMP5:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4176// DEFAULT-NEXT: [[TMP6:%.*]] = call float @llvm.fabs.f32(float [[TMP5]])177// DEFAULT-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000178// DEFAULT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]179// DEFAULT-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00180// DEFAULT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]181// DEFAULT-NEXT: store float [[TMP10]], ptr [[D1_ASCAST]], align 4182// DEFAULT-NEXT: ret void183//184// IGNORE-LABEL: define dso_local void @test_logbf_var(185// IGNORE-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {186// IGNORE-NEXT: [[ENTRY:.*:]]187// IGNORE-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)188// IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)189// IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr190// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr191// IGNORE-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4192// IGNORE-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4193// IGNORE-NEXT: [[TMP1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])194// IGNORE-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1195// IGNORE-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1196// IGNORE-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float197// IGNORE-NEXT: [[TMP5:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4198// IGNORE-NEXT: [[TMP6:%.*]] = call float @llvm.fabs.f32(float [[TMP5]])199// IGNORE-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000200// IGNORE-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]201// IGNORE-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00202// IGNORE-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]203// IGNORE-NEXT: store float [[TMP10]], ptr [[D1_ASCAST]], align 4204// IGNORE-NEXT: ret void205//206// STRICT-LABEL: define dso_local void @test_logbf_var(207// STRICT-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {208// STRICT-NEXT: [[ENTRY:.*:]]209// STRICT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)210// STRICT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)211// STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr212// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr213// STRICT-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4214// STRICT-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4215// STRICT-NEXT: [[TMP1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])216// STRICT-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1217// STRICT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1218// STRICT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float219// STRICT-NEXT: [[TMP5:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4220// STRICT-NEXT: [[TMP6:%.*]] = call float @llvm.fabs.f32(float [[TMP5]])221// STRICT-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000222// STRICT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]223// STRICT-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00224// STRICT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]225// STRICT-NEXT: store float [[TMP10]], ptr [[D1_ASCAST]], align 4226// STRICT-NEXT: ret void227//228// MAYTRAP-LABEL: define dso_local void @test_logbf_var(229// MAYTRAP-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {230// MAYTRAP-NEXT: [[ENTRY:.*:]]231// MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)232// MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)233// MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr234// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr235// MAYTRAP-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4236// MAYTRAP-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4237// MAYTRAP-NEXT: [[TMP1:%.*]] = call { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])238// MAYTRAP-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1239// MAYTRAP-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1240// MAYTRAP-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float241// MAYTRAP-NEXT: [[TMP5:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4242// MAYTRAP-NEXT: [[TMP6:%.*]] = call float @llvm.fabs.f32(float [[TMP5]])243// MAYTRAP-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000244// MAYTRAP-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]245// MAYTRAP-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00246// MAYTRAP-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]247// MAYTRAP-NEXT: store float [[TMP10]], ptr [[D1_ASCAST]], align 4248// MAYTRAP-NEXT: ret void249//250// ERRNO-LABEL: define dso_local void @test_logbf_var(251// ERRNO-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {252// ERRNO-NEXT: [[ENTRY:.*:]]253// ERRNO-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)254// ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)255// ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr256// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr257// ERRNO-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4258// ERRNO-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4259// ERRNO-NEXT: [[CALL:%.*]] = call float @logbf(float noundef [[TMP0]]) #[[ATTR2]]260// ERRNO-NEXT: store float [[CALL]], ptr [[D1_ASCAST]], align 4261// ERRNO-NEXT: ret void262//263// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logbf_var(264// AMDGCNSPIRV-DEFAULT-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {265// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]266// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4267// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4268// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)269// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)270// AMDGCNSPIRV-DEFAULT-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4271// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4272// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])273// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1274// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1275// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float276// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP5:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4277// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP6:%.*]] = call addrspace(4) float @llvm.fabs.f32(float [[TMP5]])278// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000279// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]280// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00281// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]282// AMDGCNSPIRV-DEFAULT-NEXT: store float [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 4283// AMDGCNSPIRV-DEFAULT-NEXT: ret void284//285// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logbf_var(286// AMDGCNSPIRV-IGNORE-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {287// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]288// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR:%.*]] = alloca float, align 4289// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4290// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)291// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)292// AMDGCNSPIRV-IGNORE-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4293// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4294// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])295// AMDGCNSPIRV-IGNORE-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1296// AMDGCNSPIRV-IGNORE-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1297// AMDGCNSPIRV-IGNORE-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float298// AMDGCNSPIRV-IGNORE-NEXT: [[TMP5:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4299// AMDGCNSPIRV-IGNORE-NEXT: [[TMP6:%.*]] = call addrspace(4) float @llvm.fabs.f32(float [[TMP5]])300// AMDGCNSPIRV-IGNORE-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000301// AMDGCNSPIRV-IGNORE-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]302// AMDGCNSPIRV-IGNORE-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00303// AMDGCNSPIRV-IGNORE-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]304// AMDGCNSPIRV-IGNORE-NEXT: store float [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 4305// AMDGCNSPIRV-IGNORE-NEXT: ret void306//307// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_logbf_var(308// AMDGCNSPIRV-STRICT-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {309// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]310// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4311// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca float, align 4312// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)313// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)314// AMDGCNSPIRV-STRICT-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4315// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4316// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])317// AMDGCNSPIRV-STRICT-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1318// AMDGCNSPIRV-STRICT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1319// AMDGCNSPIRV-STRICT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float320// AMDGCNSPIRV-STRICT-NEXT: [[TMP5:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4321// AMDGCNSPIRV-STRICT-NEXT: [[TMP6:%.*]] = call addrspace(4) float @llvm.fabs.f32(float [[TMP5]])322// AMDGCNSPIRV-STRICT-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000323// AMDGCNSPIRV-STRICT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]324// AMDGCNSPIRV-STRICT-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00325// AMDGCNSPIRV-STRICT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]326// AMDGCNSPIRV-STRICT-NEXT: store float [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 4327// AMDGCNSPIRV-STRICT-NEXT: ret void328//329// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_logbf_var(330// AMDGCNSPIRV-MAYTRAP-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {331// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]332// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca float, align 4333// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4334// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)335// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)336// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4337// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4338// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = call addrspace(4) { float, i32 } @llvm.frexp.f32.i32(float [[TMP0]])339// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP2:%.*]] = extractvalue { float, i32 } [[TMP1]], 1340// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1341// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to float342// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP5:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4343// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP6:%.*]] = call addrspace(4) float @llvm.fabs.f32(float [[TMP5]])344// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP7:%.*]] = fcmp one float [[TMP6]], 0x7FF0000000000000345// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], float [[TMP4]], float [[TMP6]]346// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP9:%.*]] = fcmp oeq float [[TMP0]], 0.000000e+00347// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], float 0xFFF0000000000000, float [[TMP8]]348// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 4349// AMDGCNSPIRV-MAYTRAP-NEXT: ret void350//351// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_logbf_var(352// AMDGCNSPIRV-ERRNO-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {353// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]354// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR:%.*]] = alloca float, align 4355// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4356// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)357// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)358// AMDGCNSPIRV-ERRNO-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4359// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4360// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) float @logbf(float noundef [[TMP0]]) #[[ATTR2]]361// AMDGCNSPIRV-ERRNO-NEXT: store float [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 4362// AMDGCNSPIRV-ERRNO-NEXT: ret void363//364void test_logbf_var(float a) {365 float D1 = __builtin_logbf(a);366}367// CHECK-LABEL: define dso_local void @test_logb(368// CHECK-SAME: ) #[[ATTR0]] {369// CHECK-NEXT: [[ENTRY:.*:]]370// CHECK-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)371// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr372// CHECK-NEXT: [[TMP0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)373// CHECK-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1374// CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1375// CHECK-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double376// CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.fabs.f64(double 1.510000e+01)377// CHECK-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000378// CHECK-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]379// CHECK-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]380// CHECK-NEXT: store double [[TMP7]], ptr [[D1_ASCAST]], align 8381// CHECK-NEXT: ret void382// DEFAULT-LABEL: define dso_local void @test_logb(383// DEFAULT-SAME: ) #[[ATTR0]] {384// DEFAULT-NEXT: [[ENTRY:.*:]]385// DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)386// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr387// DEFAULT-NEXT: [[TMP0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)388// DEFAULT-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1389// DEFAULT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1390// DEFAULT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double391// DEFAULT-NEXT: [[TMP4:%.*]] = call double @llvm.fabs.f64(double 1.510000e+01)392// DEFAULT-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000393// DEFAULT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]394// DEFAULT-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]395// DEFAULT-NEXT: store double [[TMP7]], ptr [[D1_ASCAST]], align 8396// DEFAULT-NEXT: ret void397//398// IGNORE-LABEL: define dso_local void @test_logb(399// IGNORE-SAME: ) #[[ATTR0]] {400// IGNORE-NEXT: [[ENTRY:.*:]]401// IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)402// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr403// IGNORE-NEXT: [[TMP0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)404// IGNORE-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1405// IGNORE-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1406// IGNORE-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double407// IGNORE-NEXT: [[TMP4:%.*]] = call double @llvm.fabs.f64(double 1.510000e+01)408// IGNORE-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000409// IGNORE-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]410// IGNORE-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]411// IGNORE-NEXT: store double [[TMP7]], ptr [[D1_ASCAST]], align 8412// IGNORE-NEXT: ret void413//414// STRICT-LABEL: define dso_local void @test_logb(415// STRICT-SAME: ) #[[ATTR0]] {416// STRICT-NEXT: [[ENTRY:.*:]]417// STRICT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)418// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr419// STRICT-NEXT: [[TMP0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)420// STRICT-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1421// STRICT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1422// STRICT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double423// STRICT-NEXT: [[TMP4:%.*]] = call double @llvm.fabs.f64(double 1.510000e+01)424// STRICT-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000425// STRICT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]426// STRICT-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]427// STRICT-NEXT: store double [[TMP7]], ptr [[D1_ASCAST]], align 8428// STRICT-NEXT: ret void429//430// MAYTRAP-LABEL: define dso_local void @test_logb(431// MAYTRAP-SAME: ) #[[ATTR0]] {432// MAYTRAP-NEXT: [[ENTRY:.*:]]433// MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)434// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr435// MAYTRAP-NEXT: [[TMP0:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)436// MAYTRAP-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1437// MAYTRAP-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1438// MAYTRAP-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double439// MAYTRAP-NEXT: [[TMP4:%.*]] = call double @llvm.fabs.f64(double 1.510000e+01)440// MAYTRAP-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000441// MAYTRAP-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]442// MAYTRAP-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]443// MAYTRAP-NEXT: store double [[TMP7]], ptr [[D1_ASCAST]], align 8444// MAYTRAP-NEXT: ret void445//446// ERRNO-LABEL: define dso_local void @test_logb(447// ERRNO-SAME: ) #[[ATTR0]] {448// ERRNO-NEXT: [[ENTRY:.*:]]449// ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)450// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr451// ERRNO-NEXT: [[CALL:%.*]] = call double @logb(double noundef 1.510000e+01) #[[ATTR2]]452// ERRNO-NEXT: store double [[CALL]], ptr [[D1_ASCAST]], align 8453// ERRNO-NEXT: ret void454//455// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logb(456// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0]] {457// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]458// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8459// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)460// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)461// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1462// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1463// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double464// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP4:%.*]] = call addrspace(4) double @llvm.fabs.f64(double 1.510000e+01)465// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000466// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]467// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]468// AMDGCNSPIRV-DEFAULT-NEXT: store double [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 8469// AMDGCNSPIRV-DEFAULT-NEXT: ret void470//471// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logb(472// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0]] {473// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]474// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8475// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)476// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)477// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1478// AMDGCNSPIRV-IGNORE-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1479// AMDGCNSPIRV-IGNORE-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double480// AMDGCNSPIRV-IGNORE-NEXT: [[TMP4:%.*]] = call addrspace(4) double @llvm.fabs.f64(double 1.510000e+01)481// AMDGCNSPIRV-IGNORE-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000482// AMDGCNSPIRV-IGNORE-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]483// AMDGCNSPIRV-IGNORE-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]484// AMDGCNSPIRV-IGNORE-NEXT: store double [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 8485// AMDGCNSPIRV-IGNORE-NEXT: ret void486//487// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_logb(488// AMDGCNSPIRV-STRICT-SAME: ) addrspace(4) #[[ATTR0]] {489// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]490// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca double, align 8491// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)492// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)493// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1494// AMDGCNSPIRV-STRICT-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1495// AMDGCNSPIRV-STRICT-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double496// AMDGCNSPIRV-STRICT-NEXT: [[TMP4:%.*]] = call addrspace(4) double @llvm.fabs.f64(double 1.510000e+01)497// AMDGCNSPIRV-STRICT-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000498// AMDGCNSPIRV-STRICT-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]499// AMDGCNSPIRV-STRICT-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]500// AMDGCNSPIRV-STRICT-NEXT: store double [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 8501// AMDGCNSPIRV-STRICT-NEXT: ret void502//503// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_logb(504// AMDGCNSPIRV-MAYTRAP-SAME: ) addrspace(4) #[[ATTR0]] {505// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]506// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8507// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)508// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double 1.510000e+01)509// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1510// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1511// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP3:%.*]] = sitofp i32 [[TMP2]] to double512// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP4:%.*]] = call addrspace(4) double @llvm.fabs.f64(double 1.510000e+01)513// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP5:%.*]] = fcmp one double [[TMP4]], 0x7FF0000000000000514// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], double [[TMP3]], double [[TMP4]]515// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP7:%.*]] = select i1 false, double 0xFFF0000000000000, double [[TMP6]]516// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[TMP7]], ptr addrspace(4) [[D1_ASCAST]], align 8517// AMDGCNSPIRV-MAYTRAP-NEXT: ret void518//519// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_logb(520// AMDGCNSPIRV-ERRNO-SAME: ) addrspace(4) #[[ATTR0]] {521// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]522// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8523// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)524// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) double @logb(double noundef 1.510000e+01) #[[ATTR2]]525// AMDGCNSPIRV-ERRNO-NEXT: store double [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 8526// AMDGCNSPIRV-ERRNO-NEXT: ret void527//528void test_logb() {529 double D1 = __builtin_logb(15.1);530}531// CHECK-LABEL: define dso_local void @test_logb_var(532// CHECK-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {533// CHECK-NEXT: [[ENTRY:.*:]]534// CHECK-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)535// CHECK-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)536// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr537// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr538// CHECK-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 8539// CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8540// CHECK-NEXT: [[TMP1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])541// CHECK-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1542// CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1543// CHECK-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double544// CHECK-NEXT: [[TMP5:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8545// CHECK-NEXT: [[TMP6:%.*]] = call double @llvm.fabs.f64(double [[TMP5]])546// CHECK-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000547// CHECK-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]548// CHECK-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00549// CHECK-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]550// CHECK-NEXT: store double [[TMP10]], ptr [[D1_ASCAST]], align 8551// CHECK-NEXT: ret void552// DEFAULT-LABEL: define dso_local void @test_logb_var(553// DEFAULT-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {554// DEFAULT-NEXT: [[ENTRY:.*:]]555// DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)556// DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)557// DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr558// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr559// DEFAULT-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 8560// DEFAULT-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8561// DEFAULT-NEXT: [[TMP1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])562// DEFAULT-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1563// DEFAULT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1564// DEFAULT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double565// DEFAULT-NEXT: [[TMP5:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8566// DEFAULT-NEXT: [[TMP6:%.*]] = call double @llvm.fabs.f64(double [[TMP5]])567// DEFAULT-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000568// DEFAULT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]569// DEFAULT-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00570// DEFAULT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]571// DEFAULT-NEXT: store double [[TMP10]], ptr [[D1_ASCAST]], align 8572// DEFAULT-NEXT: ret void573//574// IGNORE-LABEL: define dso_local void @test_logb_var(575// IGNORE-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {576// IGNORE-NEXT: [[ENTRY:.*:]]577// IGNORE-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)578// IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)579// IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr580// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr581// IGNORE-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 8582// IGNORE-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8583// IGNORE-NEXT: [[TMP1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])584// IGNORE-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1585// IGNORE-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1586// IGNORE-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double587// IGNORE-NEXT: [[TMP5:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8588// IGNORE-NEXT: [[TMP6:%.*]] = call double @llvm.fabs.f64(double [[TMP5]])589// IGNORE-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000590// IGNORE-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]591// IGNORE-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00592// IGNORE-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]593// IGNORE-NEXT: store double [[TMP10]], ptr [[D1_ASCAST]], align 8594// IGNORE-NEXT: ret void595//596// STRICT-LABEL: define dso_local void @test_logb_var(597// STRICT-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {598// STRICT-NEXT: [[ENTRY:.*:]]599// STRICT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)600// STRICT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)601// STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr602// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr603// STRICT-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 8604// STRICT-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8605// STRICT-NEXT: [[TMP1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])606// STRICT-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1607// STRICT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1608// STRICT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double609// STRICT-NEXT: [[TMP5:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8610// STRICT-NEXT: [[TMP6:%.*]] = call double @llvm.fabs.f64(double [[TMP5]])611// STRICT-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000612// STRICT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]613// STRICT-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00614// STRICT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]615// STRICT-NEXT: store double [[TMP10]], ptr [[D1_ASCAST]], align 8616// STRICT-NEXT: ret void617//618// MAYTRAP-LABEL: define dso_local void @test_logb_var(619// MAYTRAP-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {620// MAYTRAP-NEXT: [[ENTRY:.*:]]621// MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)622// MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)623// MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr624// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr625// MAYTRAP-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 8626// MAYTRAP-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8627// MAYTRAP-NEXT: [[TMP1:%.*]] = call { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])628// MAYTRAP-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1629// MAYTRAP-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1630// MAYTRAP-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double631// MAYTRAP-NEXT: [[TMP5:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8632// MAYTRAP-NEXT: [[TMP6:%.*]] = call double @llvm.fabs.f64(double [[TMP5]])633// MAYTRAP-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000634// MAYTRAP-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]635// MAYTRAP-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00636// MAYTRAP-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]637// MAYTRAP-NEXT: store double [[TMP10]], ptr [[D1_ASCAST]], align 8638// MAYTRAP-NEXT: ret void639//640// ERRNO-LABEL: define dso_local void @test_logb_var(641// ERRNO-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {642// ERRNO-NEXT: [[ENTRY:.*:]]643// ERRNO-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)644// ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)645// ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr646// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr647// ERRNO-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 8648// ERRNO-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 8649// ERRNO-NEXT: [[CALL:%.*]] = call double @logb(double noundef [[TMP0]]) #[[ATTR2]]650// ERRNO-NEXT: store double [[CALL]], ptr [[D1_ASCAST]], align 8651// ERRNO-NEXT: ret void652//653// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logb_var(654// AMDGCNSPIRV-DEFAULT-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {655// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]656// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8657// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8658// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)659// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)660// AMDGCNSPIRV-DEFAULT-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 8661// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8662// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])663// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1664// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1665// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double666// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP5:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8667// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP6:%.*]] = call addrspace(4) double @llvm.fabs.f64(double [[TMP5]])668// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000669// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]670// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00671// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]672// AMDGCNSPIRV-DEFAULT-NEXT: store double [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 8673// AMDGCNSPIRV-DEFAULT-NEXT: ret void674//675// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logb_var(676// AMDGCNSPIRV-IGNORE-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {677// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]678// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR:%.*]] = alloca double, align 8679// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8680// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)681// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)682// AMDGCNSPIRV-IGNORE-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 8683// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8684// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])685// AMDGCNSPIRV-IGNORE-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1686// AMDGCNSPIRV-IGNORE-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1687// AMDGCNSPIRV-IGNORE-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double688// AMDGCNSPIRV-IGNORE-NEXT: [[TMP5:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8689// AMDGCNSPIRV-IGNORE-NEXT: [[TMP6:%.*]] = call addrspace(4) double @llvm.fabs.f64(double [[TMP5]])690// AMDGCNSPIRV-IGNORE-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000691// AMDGCNSPIRV-IGNORE-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]692// AMDGCNSPIRV-IGNORE-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00693// AMDGCNSPIRV-IGNORE-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]694// AMDGCNSPIRV-IGNORE-NEXT: store double [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 8695// AMDGCNSPIRV-IGNORE-NEXT: ret void696//697// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_logb_var(698// AMDGCNSPIRV-STRICT-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {699// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]700// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8701// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca double, align 8702// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)703// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)704// AMDGCNSPIRV-STRICT-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 8705// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8706// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])707// AMDGCNSPIRV-STRICT-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1708// AMDGCNSPIRV-STRICT-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1709// AMDGCNSPIRV-STRICT-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double710// AMDGCNSPIRV-STRICT-NEXT: [[TMP5:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8711// AMDGCNSPIRV-STRICT-NEXT: [[TMP6:%.*]] = call addrspace(4) double @llvm.fabs.f64(double [[TMP5]])712// AMDGCNSPIRV-STRICT-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000713// AMDGCNSPIRV-STRICT-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]714// AMDGCNSPIRV-STRICT-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00715// AMDGCNSPIRV-STRICT-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]716// AMDGCNSPIRV-STRICT-NEXT: store double [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 8717// AMDGCNSPIRV-STRICT-NEXT: ret void718//719// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_logb_var(720// AMDGCNSPIRV-MAYTRAP-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {721// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]722// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca double, align 8723// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8724// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)725// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)726// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 8727// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8728// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = call addrspace(4) { double, i32 } @llvm.frexp.f64.i32(double [[TMP0]])729// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP2:%.*]] = extractvalue { double, i32 } [[TMP1]], 1730// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1731// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP4:%.*]] = sitofp i32 [[TMP3]] to double732// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP5:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8733// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP6:%.*]] = call addrspace(4) double @llvm.fabs.f64(double [[TMP5]])734// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP7:%.*]] = fcmp one double [[TMP6]], 0x7FF0000000000000735// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP8:%.*]] = select i1 [[TMP7]], double [[TMP4]], double [[TMP6]]736// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP9:%.*]] = fcmp oeq double [[TMP0]], 0.000000e+00737// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP10:%.*]] = select i1 [[TMP9]], double 0xFFF0000000000000, double [[TMP8]]738// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[TMP10]], ptr addrspace(4) [[D1_ASCAST]], align 8739// AMDGCNSPIRV-MAYTRAP-NEXT: ret void740//741// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_logb_var(742// AMDGCNSPIRV-ERRNO-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {743// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]744// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR:%.*]] = alloca double, align 8745// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8746// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)747// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)748// AMDGCNSPIRV-ERRNO-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 8749// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 8750// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) double @logb(double noundef [[TMP0]]) #[[ATTR2]]751// AMDGCNSPIRV-ERRNO-NEXT: store double [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 8752// AMDGCNSPIRV-ERRNO-NEXT: ret void753//754void test_logb_var(double a) {755 double D1 = __builtin_logb(a);756}757 758// CHECK-LABEL: define dso_local void @test_scalbnf(759// CHECK-SAME: ) #[[ATTR0]] {760// CHECK-NEXT: [[ENTRY:.*:]]761// CHECK-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)762// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr763// CHECK-NEXT: [[TMP0:%.*]] = call float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)764// CHECK-NEXT: store float [[TMP0]], ptr [[D1_ASCAST]], align 4765// CHECK-NEXT: ret void766// DEFAULT-LABEL: define dso_local void @test_scalbnf(767// DEFAULT-SAME: ) #[[ATTR0]] {768// DEFAULT-NEXT: [[ENTRY:.*:]]769// DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)770// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr771// DEFAULT-NEXT: [[TMP0:%.*]] = call float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)772// DEFAULT-NEXT: store float [[TMP0]], ptr [[D1_ASCAST]], align 4773// DEFAULT-NEXT: ret void774//775// IGNORE-LABEL: define dso_local void @test_scalbnf(776// IGNORE-SAME: ) #[[ATTR0]] {777// IGNORE-NEXT: [[ENTRY:.*:]]778// IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)779// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr780// IGNORE-NEXT: [[TMP0:%.*]] = call float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)781// IGNORE-NEXT: store float [[TMP0]], ptr [[D1_ASCAST]], align 4782// IGNORE-NEXT: ret void783//784// STRICT-LABEL: define dso_local void @test_scalbnf(785// STRICT-SAME: ) #[[ATTR0]] {786// STRICT-NEXT: [[ENTRY:.*:]]787// STRICT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)788// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr789// STRICT-NEXT: [[TMP0:%.*]] = call float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)790// STRICT-NEXT: store float [[TMP0]], ptr [[D1_ASCAST]], align 4791// STRICT-NEXT: ret void792//793// MAYTRAP-LABEL: define dso_local void @test_scalbnf(794// MAYTRAP-SAME: ) #[[ATTR0]] {795// MAYTRAP-NEXT: [[ENTRY:.*:]]796// MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)797// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr798// MAYTRAP-NEXT: [[TMP0:%.*]] = call float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)799// MAYTRAP-NEXT: store float [[TMP0]], ptr [[D1_ASCAST]], align 4800// MAYTRAP-NEXT: ret void801//802// ERRNO-LABEL: define dso_local void @test_scalbnf(803// ERRNO-SAME: ) #[[ATTR0]] {804// ERRNO-NEXT: [[ENTRY:.*:]]805// ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)806// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr807// ERRNO-NEXT: [[CALL:%.*]] = call float @scalbnf(float noundef 0x4030B33340000000, i32 noundef 10) #[[ATTR2]]808// ERRNO-NEXT: store float [[CALL]], ptr [[D1_ASCAST]], align 4809// ERRNO-NEXT: ret void810//811// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbnf(812// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0]] {813// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]814// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4815// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)816// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)817// AMDGCNSPIRV-DEFAULT-NEXT: store float [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 4818// AMDGCNSPIRV-DEFAULT-NEXT: ret void819//820// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbnf(821// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0]] {822// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]823// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4824// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)825// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)826// AMDGCNSPIRV-IGNORE-NEXT: store float [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 4827// AMDGCNSPIRV-IGNORE-NEXT: ret void828//829// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbnf(830// AMDGCNSPIRV-STRICT-SAME: ) addrspace(4) #[[ATTR0]] {831// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]832// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca float, align 4833// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)834// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)835// AMDGCNSPIRV-STRICT-NEXT: store float [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 4836// AMDGCNSPIRV-STRICT-NEXT: ret void837//838// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbnf(839// AMDGCNSPIRV-MAYTRAP-SAME: ) addrspace(4) #[[ATTR0]] {840// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]841// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4842// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)843// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x4030B33340000000, i32 10)844// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 4845// AMDGCNSPIRV-MAYTRAP-NEXT: ret void846//847// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbnf(848// AMDGCNSPIRV-ERRNO-SAME: ) addrspace(4) #[[ATTR0]] {849// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]850// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4851// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)852// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) float @scalbnf(float noundef 0x4030B33340000000, i32 noundef 10) #[[ATTR2]]853// AMDGCNSPIRV-ERRNO-NEXT: store float [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 4854// AMDGCNSPIRV-ERRNO-NEXT: ret void855//856void test_scalbnf() {857 float D1 = __builtin_scalbnf(16.7f, 10);858}859// CHECK-LABEL: define dso_local void @test_scalbnf_var1(860// CHECK-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {861// CHECK-NEXT: [[ENTRY:.*:]]862// CHECK-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)863// CHECK-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)864// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr865// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr866// CHECK-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4867// CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4868// CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)869// CHECK-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 4870// CHECK-NEXT: ret void871// DEFAULT-LABEL: define dso_local void @test_scalbnf_var1(872// DEFAULT-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {873// DEFAULT-NEXT: [[ENTRY:.*:]]874// DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)875// DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)876// DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr877// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr878// DEFAULT-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4879// DEFAULT-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4880// DEFAULT-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)881// DEFAULT-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 4882// DEFAULT-NEXT: ret void883//884// IGNORE-LABEL: define dso_local void @test_scalbnf_var1(885// IGNORE-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {886// IGNORE-NEXT: [[ENTRY:.*:]]887// IGNORE-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)888// IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)889// IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr890// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr891// IGNORE-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4892// IGNORE-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4893// IGNORE-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)894// IGNORE-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 4895// IGNORE-NEXT: ret void896//897// STRICT-LABEL: define dso_local void @test_scalbnf_var1(898// STRICT-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {899// STRICT-NEXT: [[ENTRY:.*:]]900// STRICT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)901// STRICT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)902// STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr903// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr904// STRICT-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4905// STRICT-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4906// STRICT-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)907// STRICT-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 4908// STRICT-NEXT: ret void909//910// MAYTRAP-LABEL: define dso_local void @test_scalbnf_var1(911// MAYTRAP-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {912// MAYTRAP-NEXT: [[ENTRY:.*:]]913// MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)914// MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)915// MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr916// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr917// MAYTRAP-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4918// MAYTRAP-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4919// MAYTRAP-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)920// MAYTRAP-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 4921// MAYTRAP-NEXT: ret void922//923// ERRNO-LABEL: define dso_local void @test_scalbnf_var1(924// ERRNO-SAME: float noundef [[A:%.*]]) #[[ATTR0]] {925// ERRNO-NEXT: [[ENTRY:.*:]]926// ERRNO-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)927// ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)928// ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr929// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr930// ERRNO-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 4931// ERRNO-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 4932// ERRNO-NEXT: [[CALL:%.*]] = call float @scalbnf(float noundef [[TMP0]], i32 noundef 9) #[[ATTR2]]933// ERRNO-NEXT: store float [[CALL]], ptr [[D1_ASCAST]], align 4934// ERRNO-NEXT: ret void935//936// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbnf_var1(937// AMDGCNSPIRV-DEFAULT-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {938// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]939// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4940// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4941// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)942// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)943// AMDGCNSPIRV-DEFAULT-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4944// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4945// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)946// AMDGCNSPIRV-DEFAULT-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 4947// AMDGCNSPIRV-DEFAULT-NEXT: ret void948//949// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbnf_var1(950// AMDGCNSPIRV-IGNORE-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {951// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]952// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR:%.*]] = alloca float, align 4953// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4954// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)955// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)956// AMDGCNSPIRV-IGNORE-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4957// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4958// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)959// AMDGCNSPIRV-IGNORE-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 4960// AMDGCNSPIRV-IGNORE-NEXT: ret void961//962// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbnf_var1(963// AMDGCNSPIRV-STRICT-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {964// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]965// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4966// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca float, align 4967// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)968// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)969// AMDGCNSPIRV-STRICT-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4970// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4971// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)972// AMDGCNSPIRV-STRICT-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 4973// AMDGCNSPIRV-STRICT-NEXT: ret void974//975// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbnf_var1(976// AMDGCNSPIRV-MAYTRAP-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {977// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]978// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca float, align 4979// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4980// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)981// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)982// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4983// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4984// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 9)985// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 4986// AMDGCNSPIRV-MAYTRAP-NEXT: ret void987//988// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbnf_var1(989// AMDGCNSPIRV-ERRNO-SAME: float noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {990// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]991// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR:%.*]] = alloca float, align 4992// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4993// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)994// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)995// AMDGCNSPIRV-ERRNO-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 4996// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 4997// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) float @scalbnf(float noundef [[TMP0]], i32 noundef 9) #[[ATTR2]]998// AMDGCNSPIRV-ERRNO-NEXT: store float [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 4999// AMDGCNSPIRV-ERRNO-NEXT: ret void1000//1001void test_scalbnf_var1(float a) {1002 float D1 = __builtin_scalbnf(a, 9);1003}1004// CHECK-LABEL: define dso_local void @test_scalbnf_var2(1005// CHECK-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1006// CHECK-NEXT: [[ENTRY:.*:]]1007// CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1008// CHECK-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1009// CHECK-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1010// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1011// CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41012// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41013// CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1014// CHECK-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 41015// CHECK-NEXT: ret void1016// DEFAULT-LABEL: define dso_local void @test_scalbnf_var2(1017// DEFAULT-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1018// DEFAULT-NEXT: [[ENTRY:.*:]]1019// DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1020// DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1021// DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1022// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1023// DEFAULT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41024// DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41025// DEFAULT-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1026// DEFAULT-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 41027// DEFAULT-NEXT: ret void1028//1029// IGNORE-LABEL: define dso_local void @test_scalbnf_var2(1030// IGNORE-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1031// IGNORE-NEXT: [[ENTRY:.*:]]1032// IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1033// IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1034// IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1035// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1036// IGNORE-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41037// IGNORE-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41038// IGNORE-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1039// IGNORE-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 41040// IGNORE-NEXT: ret void1041//1042// STRICT-LABEL: define dso_local void @test_scalbnf_var2(1043// STRICT-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1044// STRICT-NEXT: [[ENTRY:.*:]]1045// STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1046// STRICT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1047// STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1048// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1049// STRICT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41050// STRICT-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41051// STRICT-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1052// STRICT-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 41053// STRICT-NEXT: ret void1054//1055// MAYTRAP-LABEL: define dso_local void @test_scalbnf_var2(1056// MAYTRAP-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1057// MAYTRAP-NEXT: [[ENTRY:.*:]]1058// MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1059// MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1060// MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1061// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1062// MAYTRAP-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41063// MAYTRAP-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41064// MAYTRAP-NEXT: [[TMP1:%.*]] = call float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1065// MAYTRAP-NEXT: store float [[TMP1]], ptr [[D1_ASCAST]], align 41066// MAYTRAP-NEXT: ret void1067//1068// ERRNO-LABEL: define dso_local void @test_scalbnf_var2(1069// ERRNO-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1070// ERRNO-NEXT: [[ENTRY:.*:]]1071// ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1072// ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1073// ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1074// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1075// ERRNO-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41076// ERRNO-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41077// ERRNO-NEXT: [[CALL:%.*]] = call float @scalbnf(float noundef 0x402E666660000000, i32 noundef [[TMP0]]) #[[ATTR2]]1078// ERRNO-NEXT: store float [[CALL]], ptr [[D1_ASCAST]], align 41079// ERRNO-NEXT: ret void1080//1081// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbnf_var2(1082// AMDGCNSPIRV-DEFAULT-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1083// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]1084// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41085// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 41086// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1087// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1088// AMDGCNSPIRV-DEFAULT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41089// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41090// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1091// AMDGCNSPIRV-DEFAULT-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 41092// AMDGCNSPIRV-DEFAULT-NEXT: ret void1093//1094// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbnf_var2(1095// AMDGCNSPIRV-IGNORE-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1096// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]1097// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41098// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca float, align 41099// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1100// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1101// AMDGCNSPIRV-IGNORE-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41102// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41103// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1104// AMDGCNSPIRV-IGNORE-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 41105// AMDGCNSPIRV-IGNORE-NEXT: ret void1106//1107// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbnf_var2(1108// AMDGCNSPIRV-STRICT-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1109// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]1110// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41111// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca float, align 41112// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1113// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1114// AMDGCNSPIRV-STRICT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41115// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41116// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1117// AMDGCNSPIRV-STRICT-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 41118// AMDGCNSPIRV-STRICT-NEXT: ret void1119//1120// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbnf_var2(1121// AMDGCNSPIRV-MAYTRAP-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1122// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]1123// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41124// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 41125// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1126// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1127// AMDGCNSPIRV-MAYTRAP-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41128// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41129// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float 0x402E666660000000, i32 [[TMP0]])1130// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 41131// AMDGCNSPIRV-MAYTRAP-NEXT: ret void1132//1133// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbnf_var2(1134// AMDGCNSPIRV-ERRNO-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1135// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]1136// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41137// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca float, align 41138// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1139// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1140// AMDGCNSPIRV-ERRNO-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41141// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41142// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) float @scalbnf(float noundef 0x402E666660000000, i32 noundef [[TMP0]]) #[[ATTR2]]1143// AMDGCNSPIRV-ERRNO-NEXT: store float [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 41144// AMDGCNSPIRV-ERRNO-NEXT: ret void1145//1146void test_scalbnf_var2(int b) {1147 float D1 = __builtin_scalbnf(15.2f, b);1148}1149// CHECK-LABEL: define dso_local void @test_scalbnf_var3(1150// CHECK-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1151// CHECK-NEXT: [[ENTRY:.*:]]1152// CHECK-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)1153// CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1154// CHECK-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1155// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1156// CHECK-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1157// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1158// CHECK-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 41159// CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41160// CHECK-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 41161// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41162// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1163// CHECK-NEXT: store float [[TMP2]], ptr [[D1_ASCAST]], align 41164// CHECK-NEXT: ret void1165// DEFAULT-LABEL: define dso_local void @test_scalbnf_var3(1166// DEFAULT-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1167// DEFAULT-NEXT: [[ENTRY:.*:]]1168// DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)1169// DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1170// DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1171// DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1172// DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1173// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1174// DEFAULT-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 41175// DEFAULT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41176// DEFAULT-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 41177// DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41178// DEFAULT-NEXT: [[TMP2:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1179// DEFAULT-NEXT: store float [[TMP2]], ptr [[D1_ASCAST]], align 41180// DEFAULT-NEXT: ret void1181//1182// IGNORE-LABEL: define dso_local void @test_scalbnf_var3(1183// IGNORE-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1184// IGNORE-NEXT: [[ENTRY:.*:]]1185// IGNORE-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)1186// IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1187// IGNORE-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1188// IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1189// IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1190// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1191// IGNORE-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 41192// IGNORE-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41193// IGNORE-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 41194// IGNORE-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41195// IGNORE-NEXT: [[TMP2:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1196// IGNORE-NEXT: store float [[TMP2]], ptr [[D1_ASCAST]], align 41197// IGNORE-NEXT: ret void1198//1199// STRICT-LABEL: define dso_local void @test_scalbnf_var3(1200// STRICT-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1201// STRICT-NEXT: [[ENTRY:.*:]]1202// STRICT-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)1203// STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1204// STRICT-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1205// STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1206// STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1207// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1208// STRICT-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 41209// STRICT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41210// STRICT-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 41211// STRICT-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41212// STRICT-NEXT: [[TMP2:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1213// STRICT-NEXT: store float [[TMP2]], ptr [[D1_ASCAST]], align 41214// STRICT-NEXT: ret void1215//1216// MAYTRAP-LABEL: define dso_local void @test_scalbnf_var3(1217// MAYTRAP-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1218// MAYTRAP-NEXT: [[ENTRY:.*:]]1219// MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)1220// MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1221// MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1222// MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1223// MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1224// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1225// MAYTRAP-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 41226// MAYTRAP-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41227// MAYTRAP-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 41228// MAYTRAP-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41229// MAYTRAP-NEXT: [[TMP2:%.*]] = call float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1230// MAYTRAP-NEXT: store float [[TMP2]], ptr [[D1_ASCAST]], align 41231// MAYTRAP-NEXT: ret void1232//1233// ERRNO-LABEL: define dso_local void @test_scalbnf_var3(1234// ERRNO-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1235// ERRNO-NEXT: [[ENTRY:.*:]]1236// ERRNO-NEXT: [[A_ADDR:%.*]] = alloca float, align 4, addrspace(5)1237// ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1238// ERRNO-NEXT: [[D1:%.*]] = alloca float, align 4, addrspace(5)1239// ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1240// ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1241// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1242// ERRNO-NEXT: store float [[A]], ptr [[A_ADDR_ASCAST]], align 41243// ERRNO-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41244// ERRNO-NEXT: [[TMP0:%.*]] = load float, ptr [[A_ADDR_ASCAST]], align 41245// ERRNO-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41246// ERRNO-NEXT: [[CALL:%.*]] = call float @scalbnf(float noundef [[TMP0]], i32 noundef [[TMP1]]) #[[ATTR2]]1247// ERRNO-NEXT: store float [[CALL]], ptr [[D1_ASCAST]], align 41248// ERRNO-NEXT: ret void1249//1250// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbnf_var3(1251// AMDGCNSPIRV-DEFAULT-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1252// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]1253// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca float, align 41254// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41255// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca float, align 41256// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1257// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1258// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1259// AMDGCNSPIRV-DEFAULT-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 41260// AMDGCNSPIRV-DEFAULT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41261// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 41262// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41263// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP2:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1264// AMDGCNSPIRV-DEFAULT-NEXT: store float [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 41265// AMDGCNSPIRV-DEFAULT-NEXT: ret void1266//1267// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbnf_var3(1268// AMDGCNSPIRV-IGNORE-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1269// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]1270// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR:%.*]] = alloca float, align 41271// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41272// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca float, align 41273// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1274// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1275// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1276// AMDGCNSPIRV-IGNORE-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 41277// AMDGCNSPIRV-IGNORE-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41278// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 41279// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41280// AMDGCNSPIRV-IGNORE-NEXT: [[TMP2:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1281// AMDGCNSPIRV-IGNORE-NEXT: store float [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 41282// AMDGCNSPIRV-IGNORE-NEXT: ret void1283//1284// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbnf_var3(1285// AMDGCNSPIRV-STRICT-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1286// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]1287// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR:%.*]] = alloca float, align 41288// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41289// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca float, align 41290// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1291// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1292// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1293// AMDGCNSPIRV-STRICT-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 41294// AMDGCNSPIRV-STRICT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41295// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 41296// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41297// AMDGCNSPIRV-STRICT-NEXT: [[TMP2:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1298// AMDGCNSPIRV-STRICT-NEXT: store float [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 41299// AMDGCNSPIRV-STRICT-NEXT: ret void1300//1301// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbnf_var3(1302// AMDGCNSPIRV-MAYTRAP-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1303// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]1304// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca float, align 41305// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41306// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca float, align 41307// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1308// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1309// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1310// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 41311// AMDGCNSPIRV-MAYTRAP-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41312// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 41313// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41314// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP2:%.*]] = call addrspace(4) float @llvm.ldexp.f32.i32(float [[TMP0]], i32 [[TMP1]])1315// AMDGCNSPIRV-MAYTRAP-NEXT: store float [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 41316// AMDGCNSPIRV-MAYTRAP-NEXT: ret void1317//1318// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbnf_var3(1319// AMDGCNSPIRV-ERRNO-SAME: float noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1320// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]1321// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR:%.*]] = alloca float, align 41322// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41323// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca float, align 41324// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1325// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1326// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1327// AMDGCNSPIRV-ERRNO-NEXT: store float [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 41328// AMDGCNSPIRV-ERRNO-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41329// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load float, ptr addrspace(4) [[A_ADDR_ASCAST]], align 41330// AMDGCNSPIRV-ERRNO-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41331// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) float @scalbnf(float noundef [[TMP0]], i32 noundef [[TMP1]]) #[[ATTR2]]1332// AMDGCNSPIRV-ERRNO-NEXT: store float [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 41333// AMDGCNSPIRV-ERRNO-NEXT: ret void1334//1335void test_scalbnf_var3(float a, int b) {1336 float D1 = __builtin_scalbnf(a, b);1337}1338 1339// CHECK-LABEL: define dso_local void @test_scalbn(1340// CHECK-SAME: ) #[[ATTR0]] {1341// CHECK-NEXT: [[ENTRY:.*:]]1342// CHECK-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1343// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1344// CHECK-NEXT: [[TMP0:%.*]] = call double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1345// CHECK-NEXT: store double [[TMP0]], ptr [[D1_ASCAST]], align 81346// CHECK-NEXT: ret void1347// DEFAULT-LABEL: define dso_local void @test_scalbn(1348// DEFAULT-SAME: ) #[[ATTR0]] {1349// DEFAULT-NEXT: [[ENTRY:.*:]]1350// DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1351// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1352// DEFAULT-NEXT: [[TMP0:%.*]] = call double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1353// DEFAULT-NEXT: store double [[TMP0]], ptr [[D1_ASCAST]], align 81354// DEFAULT-NEXT: ret void1355//1356// IGNORE-LABEL: define dso_local void @test_scalbn(1357// IGNORE-SAME: ) #[[ATTR0]] {1358// IGNORE-NEXT: [[ENTRY:.*:]]1359// IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1360// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1361// IGNORE-NEXT: [[TMP0:%.*]] = call double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1362// IGNORE-NEXT: store double [[TMP0]], ptr [[D1_ASCAST]], align 81363// IGNORE-NEXT: ret void1364//1365// STRICT-LABEL: define dso_local void @test_scalbn(1366// STRICT-SAME: ) #[[ATTR0]] {1367// STRICT-NEXT: [[ENTRY:.*:]]1368// STRICT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1369// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1370// STRICT-NEXT: [[TMP0:%.*]] = call double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1371// STRICT-NEXT: store double [[TMP0]], ptr [[D1_ASCAST]], align 81372// STRICT-NEXT: ret void1373//1374// MAYTRAP-LABEL: define dso_local void @test_scalbn(1375// MAYTRAP-SAME: ) #[[ATTR0]] {1376// MAYTRAP-NEXT: [[ENTRY:.*:]]1377// MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1378// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1379// MAYTRAP-NEXT: [[TMP0:%.*]] = call double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1380// MAYTRAP-NEXT: store double [[TMP0]], ptr [[D1_ASCAST]], align 81381// MAYTRAP-NEXT: ret void1382//1383// ERRNO-LABEL: define dso_local void @test_scalbn(1384// ERRNO-SAME: ) #[[ATTR0]] {1385// ERRNO-NEXT: [[ENTRY:.*:]]1386// ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1387// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1388// ERRNO-NEXT: [[CALL:%.*]] = call double @scalbn(double noundef 1.720000e+01, i32 noundef 10) #[[ATTR2]]1389// ERRNO-NEXT: store double [[CALL]], ptr [[D1_ASCAST]], align 81390// ERRNO-NEXT: ret void1391//1392// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbn(1393// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0]] {1394// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]1395// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 81396// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1397// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1398// AMDGCNSPIRV-DEFAULT-NEXT: store double [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 81399// AMDGCNSPIRV-DEFAULT-NEXT: ret void1400//1401// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbn(1402// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0]] {1403// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]1404// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca double, align 81405// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1406// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1407// AMDGCNSPIRV-IGNORE-NEXT: store double [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 81408// AMDGCNSPIRV-IGNORE-NEXT: ret void1409//1410// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbn(1411// AMDGCNSPIRV-STRICT-SAME: ) addrspace(4) #[[ATTR0]] {1412// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]1413// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca double, align 81414// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1415// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1416// AMDGCNSPIRV-STRICT-NEXT: store double [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 81417// AMDGCNSPIRV-STRICT-NEXT: ret void1418//1419// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbn(1420// AMDGCNSPIRV-MAYTRAP-SAME: ) addrspace(4) #[[ATTR0]] {1421// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]1422// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 81423// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1424// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.720000e+01, i32 10)1425// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[TMP0]], ptr addrspace(4) [[D1_ASCAST]], align 81426// AMDGCNSPIRV-MAYTRAP-NEXT: ret void1427//1428// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbn(1429// AMDGCNSPIRV-ERRNO-SAME: ) addrspace(4) #[[ATTR0]] {1430// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]1431// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca double, align 81432// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1433// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) double @scalbn(double noundef 1.720000e+01, i32 noundef 10) #[[ATTR2]]1434// AMDGCNSPIRV-ERRNO-NEXT: store double [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 81435// AMDGCNSPIRV-ERRNO-NEXT: ret void1436//1437void test_scalbn() {1438 double D1 = __builtin_scalbn(17.2, 10);1439}1440// CHECK-LABEL: define dso_local void @test_scalbn_var1(1441// CHECK-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {1442// CHECK-NEXT: [[ENTRY:.*:]]1443// CHECK-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1444// CHECK-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1445// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1446// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1447// CHECK-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81448// CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81449// CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1450// CHECK-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81451// CHECK-NEXT: ret void1452// DEFAULT-LABEL: define dso_local void @test_scalbn_var1(1453// DEFAULT-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {1454// DEFAULT-NEXT: [[ENTRY:.*:]]1455// DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1456// DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1457// DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1458// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1459// DEFAULT-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81460// DEFAULT-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81461// DEFAULT-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1462// DEFAULT-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81463// DEFAULT-NEXT: ret void1464//1465// IGNORE-LABEL: define dso_local void @test_scalbn_var1(1466// IGNORE-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {1467// IGNORE-NEXT: [[ENTRY:.*:]]1468// IGNORE-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1469// IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1470// IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1471// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1472// IGNORE-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81473// IGNORE-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81474// IGNORE-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1475// IGNORE-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81476// IGNORE-NEXT: ret void1477//1478// STRICT-LABEL: define dso_local void @test_scalbn_var1(1479// STRICT-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {1480// STRICT-NEXT: [[ENTRY:.*:]]1481// STRICT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1482// STRICT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1483// STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1484// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1485// STRICT-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81486// STRICT-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81487// STRICT-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1488// STRICT-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81489// STRICT-NEXT: ret void1490//1491// MAYTRAP-LABEL: define dso_local void @test_scalbn_var1(1492// MAYTRAP-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {1493// MAYTRAP-NEXT: [[ENTRY:.*:]]1494// MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1495// MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1496// MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1497// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1498// MAYTRAP-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81499// MAYTRAP-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81500// MAYTRAP-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1501// MAYTRAP-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81502// MAYTRAP-NEXT: ret void1503//1504// ERRNO-LABEL: define dso_local void @test_scalbn_var1(1505// ERRNO-SAME: double noundef [[A:%.*]]) #[[ATTR0]] {1506// ERRNO-NEXT: [[ENTRY:.*:]]1507// ERRNO-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1508// ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1509// ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1510// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1511// ERRNO-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81512// ERRNO-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81513// ERRNO-NEXT: [[CALL:%.*]] = call double @scalbn(double noundef [[TMP0]], i32 noundef 9) #[[ATTR2]]1514// ERRNO-NEXT: store double [[CALL]], ptr [[D1_ASCAST]], align 81515// ERRNO-NEXT: ret void1516//1517// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbn_var1(1518// AMDGCNSPIRV-DEFAULT-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {1519// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]1520// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca double, align 81521// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 81522// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1523// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1524// AMDGCNSPIRV-DEFAULT-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81525// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81526// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1527// AMDGCNSPIRV-DEFAULT-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81528// AMDGCNSPIRV-DEFAULT-NEXT: ret void1529//1530// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbn_var1(1531// AMDGCNSPIRV-IGNORE-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {1532// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]1533// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR:%.*]] = alloca double, align 81534// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca double, align 81535// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1536// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1537// AMDGCNSPIRV-IGNORE-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81538// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81539// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1540// AMDGCNSPIRV-IGNORE-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81541// AMDGCNSPIRV-IGNORE-NEXT: ret void1542//1543// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbn_var1(1544// AMDGCNSPIRV-STRICT-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {1545// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]1546// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR:%.*]] = alloca double, align 81547// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca double, align 81548// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1549// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1550// AMDGCNSPIRV-STRICT-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81551// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81552// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1553// AMDGCNSPIRV-STRICT-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81554// AMDGCNSPIRV-STRICT-NEXT: ret void1555//1556// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbn_var1(1557// AMDGCNSPIRV-MAYTRAP-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {1558// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]1559// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca double, align 81560// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 81561// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1562// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1563// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81564// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81565// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 9)1566// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81567// AMDGCNSPIRV-MAYTRAP-NEXT: ret void1568//1569// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbn_var1(1570// AMDGCNSPIRV-ERRNO-SAME: double noundef [[A:%.*]]) addrspace(4) #[[ATTR0]] {1571// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]1572// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR:%.*]] = alloca double, align 81573// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca double, align 81574// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1575// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1576// AMDGCNSPIRV-ERRNO-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81577// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81578// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) double @scalbn(double noundef [[TMP0]], i32 noundef 9) #[[ATTR2]]1579// AMDGCNSPIRV-ERRNO-NEXT: store double [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 81580// AMDGCNSPIRV-ERRNO-NEXT: ret void1581//1582void test_scalbn_var1(double a) {1583 double D1 = __builtin_scalbn(a, 9);1584}1585// CHECK-LABEL: define dso_local void @test_scalbn_var2(1586// CHECK-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1587// CHECK-NEXT: [[ENTRY:.*:]]1588// CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1589// CHECK-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1590// CHECK-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1591// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1592// CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41593// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41594// CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1595// CHECK-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81596// CHECK-NEXT: ret void1597// DEFAULT-LABEL: define dso_local void @test_scalbn_var2(1598// DEFAULT-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1599// DEFAULT-NEXT: [[ENTRY:.*:]]1600// DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1601// DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1602// DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1603// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1604// DEFAULT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41605// DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41606// DEFAULT-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1607// DEFAULT-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81608// DEFAULT-NEXT: ret void1609//1610// IGNORE-LABEL: define dso_local void @test_scalbn_var2(1611// IGNORE-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1612// IGNORE-NEXT: [[ENTRY:.*:]]1613// IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1614// IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1615// IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1616// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1617// IGNORE-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41618// IGNORE-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41619// IGNORE-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1620// IGNORE-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81621// IGNORE-NEXT: ret void1622//1623// STRICT-LABEL: define dso_local void @test_scalbn_var2(1624// STRICT-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1625// STRICT-NEXT: [[ENTRY:.*:]]1626// STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1627// STRICT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1628// STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1629// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1630// STRICT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41631// STRICT-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41632// STRICT-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1633// STRICT-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81634// STRICT-NEXT: ret void1635//1636// MAYTRAP-LABEL: define dso_local void @test_scalbn_var2(1637// MAYTRAP-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1638// MAYTRAP-NEXT: [[ENTRY:.*:]]1639// MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1640// MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1641// MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1642// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1643// MAYTRAP-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41644// MAYTRAP-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41645// MAYTRAP-NEXT: [[TMP1:%.*]] = call double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1646// MAYTRAP-NEXT: store double [[TMP1]], ptr [[D1_ASCAST]], align 81647// MAYTRAP-NEXT: ret void1648//1649// ERRNO-LABEL: define dso_local void @test_scalbn_var2(1650// ERRNO-SAME: i32 noundef [[B:%.*]]) #[[ATTR0]] {1651// ERRNO-NEXT: [[ENTRY:.*:]]1652// ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1653// ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1654// ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1655// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1656// ERRNO-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41657// ERRNO-NEXT: [[TMP0:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41658// ERRNO-NEXT: [[CALL:%.*]] = call double @scalbn(double noundef 1.540000e+01, i32 noundef [[TMP0]]) #[[ATTR2]]1659// ERRNO-NEXT: store double [[CALL]], ptr [[D1_ASCAST]], align 81660// ERRNO-NEXT: ret void1661//1662// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbn_var2(1663// AMDGCNSPIRV-DEFAULT-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1664// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]1665// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41666// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 81667// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1668// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1669// AMDGCNSPIRV-DEFAULT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41670// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41671// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1672// AMDGCNSPIRV-DEFAULT-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81673// AMDGCNSPIRV-DEFAULT-NEXT: ret void1674//1675// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbn_var2(1676// AMDGCNSPIRV-IGNORE-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1677// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]1678// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41679// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca double, align 81680// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1681// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1682// AMDGCNSPIRV-IGNORE-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41683// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41684// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1685// AMDGCNSPIRV-IGNORE-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81686// AMDGCNSPIRV-IGNORE-NEXT: ret void1687//1688// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbn_var2(1689// AMDGCNSPIRV-STRICT-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1690// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]1691// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41692// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca double, align 81693// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1694// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1695// AMDGCNSPIRV-STRICT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41696// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41697// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1698// AMDGCNSPIRV-STRICT-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81699// AMDGCNSPIRV-STRICT-NEXT: ret void1700//1701// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbn_var2(1702// AMDGCNSPIRV-MAYTRAP-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1703// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]1704// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41705// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 81706// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1707// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1708// AMDGCNSPIRV-MAYTRAP-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41709// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41710// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double 1.540000e+01, i32 [[TMP0]])1711// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[TMP1]], ptr addrspace(4) [[D1_ASCAST]], align 81712// AMDGCNSPIRV-MAYTRAP-NEXT: ret void1713//1714// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbn_var2(1715// AMDGCNSPIRV-ERRNO-SAME: i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1716// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]1717// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41718// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca double, align 81719// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1720// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1721// AMDGCNSPIRV-ERRNO-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41722// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41723// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) double @scalbn(double noundef 1.540000e+01, i32 noundef [[TMP0]]) #[[ATTR2]]1724// AMDGCNSPIRV-ERRNO-NEXT: store double [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 81725// AMDGCNSPIRV-ERRNO-NEXT: ret void1726//1727void test_scalbn_var2(int b) {1728 double D1 = __builtin_scalbn(15.4, b);1729}1730// CHECK-LABEL: define dso_local void @test_scalbn_var3(1731// CHECK-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1732// CHECK-NEXT: [[ENTRY:.*:]]1733// CHECK-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1734// CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1735// CHECK-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1736// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1737// CHECK-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1738// CHECK-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1739// CHECK-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81740// CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41741// CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81742// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41743// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1744// CHECK-NEXT: store double [[TMP2]], ptr [[D1_ASCAST]], align 81745// CHECK-NEXT: ret void1746// DEFAULT-LABEL: define dso_local void @test_scalbn_var3(1747// DEFAULT-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1748// DEFAULT-NEXT: [[ENTRY:.*:]]1749// DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1750// DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1751// DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1752// DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1753// DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1754// DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1755// DEFAULT-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81756// DEFAULT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41757// DEFAULT-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81758// DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41759// DEFAULT-NEXT: [[TMP2:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1760// DEFAULT-NEXT: store double [[TMP2]], ptr [[D1_ASCAST]], align 81761// DEFAULT-NEXT: ret void1762//1763// IGNORE-LABEL: define dso_local void @test_scalbn_var3(1764// IGNORE-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1765// IGNORE-NEXT: [[ENTRY:.*:]]1766// IGNORE-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1767// IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1768// IGNORE-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1769// IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1770// IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1771// IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1772// IGNORE-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81773// IGNORE-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41774// IGNORE-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81775// IGNORE-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41776// IGNORE-NEXT: [[TMP2:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1777// IGNORE-NEXT: store double [[TMP2]], ptr [[D1_ASCAST]], align 81778// IGNORE-NEXT: ret void1779//1780// STRICT-LABEL: define dso_local void @test_scalbn_var3(1781// STRICT-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1782// STRICT-NEXT: [[ENTRY:.*:]]1783// STRICT-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1784// STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1785// STRICT-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1786// STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1787// STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1788// STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1789// STRICT-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81790// STRICT-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41791// STRICT-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81792// STRICT-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41793// STRICT-NEXT: [[TMP2:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1794// STRICT-NEXT: store double [[TMP2]], ptr [[D1_ASCAST]], align 81795// STRICT-NEXT: ret void1796//1797// MAYTRAP-LABEL: define dso_local void @test_scalbn_var3(1798// MAYTRAP-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1799// MAYTRAP-NEXT: [[ENTRY:.*:]]1800// MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1801// MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1802// MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1803// MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1804// MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1805// MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1806// MAYTRAP-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81807// MAYTRAP-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41808// MAYTRAP-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81809// MAYTRAP-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41810// MAYTRAP-NEXT: [[TMP2:%.*]] = call double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1811// MAYTRAP-NEXT: store double [[TMP2]], ptr [[D1_ASCAST]], align 81812// MAYTRAP-NEXT: ret void1813//1814// ERRNO-LABEL: define dso_local void @test_scalbn_var3(1815// ERRNO-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1816// ERRNO-NEXT: [[ENTRY:.*:]]1817// ERRNO-NEXT: [[A_ADDR:%.*]] = alloca double, align 8, addrspace(5)1818// ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 4, addrspace(5)1819// ERRNO-NEXT: [[D1:%.*]] = alloca double, align 8, addrspace(5)1820// ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr1821// ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr1822// ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D1]] to ptr1823// ERRNO-NEXT: store double [[A]], ptr [[A_ADDR_ASCAST]], align 81824// ERRNO-NEXT: store i32 [[B]], ptr [[B_ADDR_ASCAST]], align 41825// ERRNO-NEXT: [[TMP0:%.*]] = load double, ptr [[A_ADDR_ASCAST]], align 81826// ERRNO-NEXT: [[TMP1:%.*]] = load i32, ptr [[B_ADDR_ASCAST]], align 41827// ERRNO-NEXT: [[CALL:%.*]] = call double @scalbn(double noundef [[TMP0]], i32 noundef [[TMP1]]) #[[ATTR2]]1828// ERRNO-NEXT: store double [[CALL]], ptr [[D1_ASCAST]], align 81829// ERRNO-NEXT: ret void1830//1831// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_scalbn_var3(1832// AMDGCNSPIRV-DEFAULT-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1833// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]1834// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR:%.*]] = alloca double, align 81835// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41836// AMDGCNSPIRV-DEFAULT-NEXT: [[D1:%.*]] = alloca double, align 81837// AMDGCNSPIRV-DEFAULT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1838// AMDGCNSPIRV-DEFAULT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1839// AMDGCNSPIRV-DEFAULT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1840// AMDGCNSPIRV-DEFAULT-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81841// AMDGCNSPIRV-DEFAULT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41842// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81843// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41844// AMDGCNSPIRV-DEFAULT-NEXT: [[TMP2:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1845// AMDGCNSPIRV-DEFAULT-NEXT: store double [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 81846// AMDGCNSPIRV-DEFAULT-NEXT: ret void1847//1848// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_scalbn_var3(1849// AMDGCNSPIRV-IGNORE-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1850// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]1851// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR:%.*]] = alloca double, align 81852// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41853// AMDGCNSPIRV-IGNORE-NEXT: [[D1:%.*]] = alloca double, align 81854// AMDGCNSPIRV-IGNORE-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1855// AMDGCNSPIRV-IGNORE-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1856// AMDGCNSPIRV-IGNORE-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1857// AMDGCNSPIRV-IGNORE-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81858// AMDGCNSPIRV-IGNORE-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41859// AMDGCNSPIRV-IGNORE-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81860// AMDGCNSPIRV-IGNORE-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41861// AMDGCNSPIRV-IGNORE-NEXT: [[TMP2:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1862// AMDGCNSPIRV-IGNORE-NEXT: store double [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 81863// AMDGCNSPIRV-IGNORE-NEXT: ret void1864//1865// AMDGCNSPIRV-STRICT-LABEL: define spir_func void @test_scalbn_var3(1866// AMDGCNSPIRV-STRICT-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1867// AMDGCNSPIRV-STRICT-NEXT: [[ENTRY:.*:]]1868// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR:%.*]] = alloca double, align 81869// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41870// AMDGCNSPIRV-STRICT-NEXT: [[D1:%.*]] = alloca double, align 81871// AMDGCNSPIRV-STRICT-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1872// AMDGCNSPIRV-STRICT-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1873// AMDGCNSPIRV-STRICT-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1874// AMDGCNSPIRV-STRICT-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81875// AMDGCNSPIRV-STRICT-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41876// AMDGCNSPIRV-STRICT-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81877// AMDGCNSPIRV-STRICT-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41878// AMDGCNSPIRV-STRICT-NEXT: [[TMP2:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1879// AMDGCNSPIRV-STRICT-NEXT: store double [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 81880// AMDGCNSPIRV-STRICT-NEXT: ret void1881//1882// AMDGCNSPIRV-MAYTRAP-LABEL: define spir_func void @test_scalbn_var3(1883// AMDGCNSPIRV-MAYTRAP-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1884// AMDGCNSPIRV-MAYTRAP-NEXT: [[ENTRY:.*:]]1885// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR:%.*]] = alloca double, align 81886// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41887// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1:%.*]] = alloca double, align 81888// AMDGCNSPIRV-MAYTRAP-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1889// AMDGCNSPIRV-MAYTRAP-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1890// AMDGCNSPIRV-MAYTRAP-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1891// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81892// AMDGCNSPIRV-MAYTRAP-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41893// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81894// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41895// AMDGCNSPIRV-MAYTRAP-NEXT: [[TMP2:%.*]] = call addrspace(4) double @llvm.ldexp.f64.i32(double [[TMP0]], i32 [[TMP1]])1896// AMDGCNSPIRV-MAYTRAP-NEXT: store double [[TMP2]], ptr addrspace(4) [[D1_ASCAST]], align 81897// AMDGCNSPIRV-MAYTRAP-NEXT: ret void1898//1899// AMDGCNSPIRV-ERRNO-LABEL: define spir_func void @test_scalbn_var3(1900// AMDGCNSPIRV-ERRNO-SAME: double noundef [[A:%.*]], i32 noundef [[B:%.*]]) addrspace(4) #[[ATTR0]] {1901// AMDGCNSPIRV-ERRNO-NEXT: [[ENTRY:.*:]]1902// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR:%.*]] = alloca double, align 81903// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41904// AMDGCNSPIRV-ERRNO-NEXT: [[D1:%.*]] = alloca double, align 81905// AMDGCNSPIRV-ERRNO-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr [[A_ADDR]] to ptr addrspace(4)1906// AMDGCNSPIRV-ERRNO-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr [[B_ADDR]] to ptr addrspace(4)1907// AMDGCNSPIRV-ERRNO-NEXT: [[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to ptr addrspace(4)1908// AMDGCNSPIRV-ERRNO-NEXT: store double [[A]], ptr addrspace(4) [[A_ADDR_ASCAST]], align 81909// AMDGCNSPIRV-ERRNO-NEXT: store i32 [[B]], ptr addrspace(4) [[B_ADDR_ASCAST]], align 41910// AMDGCNSPIRV-ERRNO-NEXT: [[TMP0:%.*]] = load double, ptr addrspace(4) [[A_ADDR_ASCAST]], align 81911// AMDGCNSPIRV-ERRNO-NEXT: [[TMP1:%.*]] = load i32, ptr addrspace(4) [[B_ADDR_ASCAST]], align 41912// AMDGCNSPIRV-ERRNO-NEXT: [[CALL:%.*]] = call spir_func addrspace(4) double @scalbn(double noundef [[TMP0]], i32 noundef [[TMP1]]) #[[ATTR2]]1913// AMDGCNSPIRV-ERRNO-NEXT: store double [[CALL]], ptr addrspace(4) [[D1_ASCAST]], align 81914// AMDGCNSPIRV-ERRNO-NEXT: ret void1915//1916void test_scalbn_var3(double a, int b) {1917 double D1 = __builtin_scalbn(a, b);1918}1919