Skip to content

Commit

Permalink
fix(transform): fix fcmp folding
Browse files Browse the repository at this point in the history
  • Loading branch information
dtcxzyw committed Aug 21, 2023
1 parent 648819e commit c7b254e
Show file tree
Hide file tree
Showing 19 changed files with 1,927 additions and 539 deletions.
59 changes: 58 additions & 1 deletion cmmc/Target/RISCV/RISCV.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1787,14 +1787,71 @@ InstSelection:
Lhs: $X
Rhs: $Y
Rhs: $Z
$Predicate: isAggressiveOptEnabled()
$Predicate: isAggressiveOptEnabled() && ctx.hasOneUse($MulDst)
Replace:
FMADD_S:
Rd: $Dst
Rs1: $X
Rs2: $Y
Rs3: $Z

- Pattern:
InstFSub:
Dst: $Dst
Lhs:
InstFMul:
Dst: $MulDst
Lhs: $X
Rhs: $Y
Rhs: $Z
$Predicate: isAggressiveOptEnabled() && ctx.hasOneUse($MulDst)
Replace:
FMSUB_S:
Rd: $Dst
Rs1: $X
Rs2: $Y
Rs3: $Z

- Pattern:
InstFAdd:
Dst: $Dst
Lhs:
InstFNeg:
Dst: $NegDst
Src:
InstFMul:
Dst: $MulDst
Lhs: $X
Rhs: $Y
Rhs: $Z
$Predicate: isAggressiveOptEnabled() && ctx.hasOneUse($MulDst) && ctx.hasOneUse($NegDst)
Replace:
FNMSUB_S:
Rd: $Dst
Rs1: $X
Rs2: $Y
Rs3: $Z

- Pattern:
InstFSub:
Dst: $Dst
Lhs:
InstFNeg:
Dst: $NegDst
Src:
InstFMul:
Dst: $MulDst
Lhs: $X
Rhs: $Y
Rhs: $Z
$Predicate: isAggressiveOptEnabled() && ctx.hasOneUse($MulDst) && ctx.hasOneUse($NegDst)
Replace:
FNMADD_S:
Rd: $Dst
Rs1: $X
Rs2: $Y
Rs3: $Z

- Pattern:
$Template:
Dst: $Dst
Expand Down
12 changes: 7 additions & 5 deletions cmmc/Transforms/Combine/ArithmeticReduce.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1327,28 +1327,30 @@ class ArithmeticReduce final : public TransformPass<Function> {
return val;
}

// TODO: handle nan
// x <= f1 || x >= f2
if(or_(fcmp(cmp1, any(v1), fp_(f1)), fcmp(cmp2, exactly(v1), fp_(f2)))(matchCtx)) {
if(cmp1 > cmp2) {
std::swap(cmp1, cmp2);
std::swap(f1, f2);
}
auto isNotNan = [&](Value* v) {
return builder.makeOp<CompareInst>(InstructionID::FCmp, CompareOp::FCmpOrderedEqual, v, v);
};
if(cmp1 == CompareOp::FCmpOrderedLessEqual && cmp2 == CompareOp::FCmpOrderedGreaterEqual) {
if(f1 >= f2)
return builder.getTrue();
return isNotNan(v1);
}
if(cmp1 == CompareOp::FCmpOrderedLessEqual && cmp2 == CompareOp::FCmpOrderedGreaterThan) {
if(f1 >= f2)
return builder.getTrue();
return isNotNan(v1);
}
if(cmp1 == CompareOp::FCmpOrderedLessThan && cmp2 == CompareOp::FCmpOrderedGreaterEqual) {
if(f1 >= f2)
return builder.getTrue();
return isNotNan(v1);
}
if(cmp1 == CompareOp::FCmpOrderedLessThan && cmp2 == CompareOp::FCmpOrderedGreaterThan) {
if(f1 > f2)
return builder.getTrue();
return isNotNan(v1);
// TODO: f1 == f2 -> x une f1
}
}
Expand Down
20 changes: 20 additions & 0 deletions tests/Regression/CodeGen/fma.arm.s

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

26 changes: 26 additions & 0 deletions tests/Regression/CodeGen/fma.mips.s

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions tests/Regression/CodeGen/fma.riscv.s

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions tests/Regression/CodeGen/fma.sy
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,12 @@ float fmadd1(float x, float y, float z) {
float fmadd2(float x, float y, float z) {
return z + x * y;
}
float fmsub(float x, float y, float z) {
return x * y - z;
}
float fnmadd(float x, float y, float z) {
return - (x * y) - z;
}
float fnmsub(float x, float y, float z) {
return - (x * y) + z;
}
2 changes: 1 addition & 1 deletion tests/SysY2022/performance/large_loop_array_1.out
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
0x1.45378p+50
0
0
Loading

0 comments on commit c7b254e

Please sign in to comment.