Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions llvm/lib/Target/Hexagon/HexagonPatterns.td
Original file line number Diff line number Diff line change
Expand Up @@ -3434,6 +3434,19 @@ let AddedComplexity = 100 in {
(C2_not (S4_stored_locked I32:$Rs, I64:$Rt))>;
}

multiclass FloatClass<SDPatternOperator IntOp, InstHexagon MI,
PatFrag RegPred> {
let AddedComplexity = 100 in {
def: Pat<(i1 (seteq (IntOp RegPred:$Rs, u5_0ImmPred_timm:$u5), 0)),
(C2_not (MI RegPred:$Rs, u5_0ImmPred_timm:$u5))>;
def: Pat<(i1 (setne (IntOp RegPred:$Rs, u5_0ImmPred_timm:$u5), 0)),
(MI RegPred:$Rs, u5_0ImmPred_timm:$u5)>;
Copy link

Copilot AI Oct 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent indentation between lines 3441 and 3443. Line 3441 uses 14 spaces while line 3443 uses 13 spaces. Both should use the same indentation to align with the opening parenthesis of the pattern's first argument, consistent with the style used in lines 3428 and 3430 above.

Suggested change
(MI RegPred:$Rs, u5_0ImmPred_timm:$u5)>;
(MI RegPred:$Rs, u5_0ImmPred_timm:$u5)>;

Copilot uses AI. Check for mistakes.
}
}

defm : FloatClass<int_hexagon_F2_sfclass, F2_sfclass, F32>;
defm : FloatClass<int_hexagon_F2_dfclass, F2_dfclass, F64>;

def: Pat<(int_hexagon_instrprof_custom (HexagonAtPcrel tglobaladdr:$addr), u32_0ImmPred:$I),
(PS_call_instrprof_custom tglobaladdr:$addr, imm:$I)>;

Expand Down
86 changes: 86 additions & 0 deletions llvm/test/CodeGen/Hexagon/isel-fclass.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
; Tests lowering of sfclass/dfclass compares.
; Sub-optimal code
; {
; p0 = sfclass(r0,#16)
; r0 = sfadd(r0,r0)
; }
; {
; r2 = p0
; }
; {
; if (p0.new) r0 = ##1065353216
; p0 = cmp.eq(r2,#0)
; jumpr r31
; }
; With the patterns added, we should be generating
; {
; p0 = sfclass(r0,#16)
; r0 = sfadd(r0,r0)
; }
; {
; if (!p0) r0 = ##1065353216
; jumpr r31
; }

; RUN: llc -march=hexagon -stop-after=hexagon-isel %s -o - | FileCheck %s

; CHECK: bb.0.entry1
; CHECK: F2_sfclass
; CHECK-NOT: C2_cmp
; CHECK: C2_not
; CHECK: F2_sfadd
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define float @test1(float noundef %x) {
entry1:
%0 = tail call i32 @llvm.hexagon.F2.sfclass(float %x, i32 16)
%tobool.not = icmp eq i32 %0, 0
%add = fadd float %x, %x
%spec.select = select i1 %tobool.not, float 1.000000e+00, float %add
ret float %spec.select
}

; CHECK: bb.0.entry2
; CHECK: F2_sfclass
; CHECK-NOT: C2_cmp
; CHECK: F2_sfadd
define float @test2(float noundef %x) {
entry2:
%0 = tail call i32 @llvm.hexagon.F2.sfclass(float %x, i32 16)
%tobool.not = icmp eq i32 %0, 0
%add = fadd float %x, %x
%spec.select = select i1 %tobool.not, float %add, float 1.000000e+00
ret float %spec.select
}

; CHECK: bb.0.entry3
; CHECK: F2_dfclass
; CHECK-NOT: C2_cmp
; CHECK: C2_not
; CHECK: F2_dfadd
define double @test3(double noundef %x) {
entry3:
%0 = tail call i32 @llvm.hexagon.F2.dfclass(double %x, i32 16)
%tobool.not = icmp eq i32 %0, 0
%add = fadd double %x, %x
%spec.select = select i1 %tobool.not, double 1.000000e+00, double %add
ret double %spec.select
}

; CHECK: bb.0.entry4
; CHECK: F2_dfclass
; CHECK-NOT: C2_cmp
; CHECK: F2_dfadd
define double @test4(double noundef %x) {
entry4:
%0 = tail call i32 @llvm.hexagon.F2.dfclass(double %x, i32 16)
%tobool.not = icmp eq i32 %0, 0
%add = fadd double %x, %x
%spec.select = select i1 %tobool.not, double %add, double 1.000000e+00
ret double %spec.select
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none)
declare i32 @llvm.hexagon.F2.dfclass(double, i32 immarg)

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(none)
declare i32 @llvm.hexagon.F2.sfclass(float, i32 immarg)