When folding exp2(itofp(x)) to ldexp(1, x), don't require an ldexp libcall to emit the intrinsic. The intrinsic needs to be handled regardless of whether the system has a libcall, and we have an inline implementation of ldexp already. This fixes the instance in the exp2->ldexp fold. Another instance exists for the pow(2) -> ldexp case The LTO test change isn't ideal, since it's just moving the problem to another instance where we're relying on implied libm behavior for an intrinsic transform. Use exp10 since that's a harder case to solve in the libcall house of cards we have.
31 lines
1.0 KiB
LLVM
31 lines
1.0 KiB
LLVM
; Test to ensure that the LTO pipelines add pass to build the TargetLibraryInfo
|
|
; using the specified target triple.
|
|
|
|
; Check with regular LTO
|
|
; RUN: llvm-as < %s >%t1
|
|
; RUN: llvm-lto -exported-symbol=main -o %t2 %t1
|
|
; RUN: llvm-nm %t2 | FileCheck %s
|
|
; Check with ThinLTO. Use llvm-lto2 since this adds earlier passes requiring
|
|
; the TargetLibraryInfo with ThinLTO (WholeProgramDevirt).
|
|
; RUN: opt -module-summary -o %t1 %s
|
|
; RUN: llvm-lto2 run -r %t1,main,plx -o %t2 %t1
|
|
; RUN: llvm-nm %t2.1 | FileCheck %s
|
|
|
|
; We check that LTO will be aware of target triple and prevent pow to exp10
|
|
; transformation on Windows.
|
|
; CHECK: U powf
|
|
|
|
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-pc-windows-msvc19.11.0"
|
|
|
|
declare float @llvm.pow.f32(float, float)
|
|
|
|
define dso_local i32 @main(i32 %argc, ptr nocapture readnone %argv) local_unnamed_addr {
|
|
entry:
|
|
%conv = sitofp i32 %argc to float
|
|
%exp2 = tail call float @llvm.pow.f32(float 10.0, float %conv)
|
|
%conv1 = fptosi float %exp2 to i32
|
|
ret i32 %conv1
|
|
}
|
|
|