mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
Pull fptrunc's upwards through selects when one of the select's selectands was a constant. This has a number of benefits, including producing small immediates (easier to materialize, smaller constant pools) as well as being more likely to allow the fptrunc to fuse with a preceding instruction (truncating selects are unusual).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191929 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1229,6 +1229,19 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// (fptrunc (select cond, R1, Cst)) -->
|
||||||
|
// (select cond, (fptrunc R1), (fptrunc Cst))
|
||||||
|
SelectInst *SI = dyn_cast<SelectInst>(CI.getOperand(0));
|
||||||
|
if (SI &&
|
||||||
|
(isa<ConstantFP>(SI->getOperand(1)) ||
|
||||||
|
isa<ConstantFP>(SI->getOperand(2)))) {
|
||||||
|
Value *LHSTrunc = Builder->CreateFPTrunc(SI->getOperand(1),
|
||||||
|
CI.getType());
|
||||||
|
Value *RHSTrunc = Builder->CreateFPTrunc(SI->getOperand(2),
|
||||||
|
CI.getType());
|
||||||
|
return SelectInst::Create(SI->getOperand(0), LHSTrunc, RHSTrunc);
|
||||||
|
}
|
||||||
|
|
||||||
IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI.getOperand(0));
|
IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI.getOperand(0));
|
||||||
if (II) {
|
if (II) {
|
||||||
switch (II->getIntrinsicID()) {
|
switch (II->getIntrinsicID()) {
|
||||||
|
@ -31,4 +31,16 @@ define half @test4(float %a) {
|
|||||||
ret half %c
|
ret half %c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; CHECK: test5
|
||||||
|
define half @test5(float %a, float %b, float %c) {
|
||||||
|
; CHECK: fcmp ogt
|
||||||
|
; CHECK: fptrunc
|
||||||
|
; CHECK: select
|
||||||
|
; CHECK: half 0xH3C00
|
||||||
|
%d = fcmp ogt float %a, %b
|
||||||
|
%e = select i1 %d, float %c, float 1.0
|
||||||
|
%f = fptrunc float %e to half
|
||||||
|
ret half %f
|
||||||
|
}
|
||||||
|
|
||||||
declare float @llvm.fabs.f32(float) nounwind readonly
|
declare float @llvm.fabs.f32(float) nounwind readonly
|
||||||
|
Reference in New Issue
Block a user