[AArch64] Add missing bf16 load insert pattern
authorDavid Green <david.green@arm.com>
Fri, 3 Mar 2023 22:00:41 +0000 (22:00 +0000)
committerDavid Green <david.green@arm.com>
Fri, 3 Mar 2023 22:00:41 +0000 (22:00 +0000)
We have LDRHui load patterns but would fail to select from unscaled offsets.
This adds the missing pattern.

llvm/lib/Target/AArch64/AArch64InstrInfo.td
llvm/test/CodeGen/AArch64/bf16.ll

index c91e7b7..2ab27f5 100644 (file)
@@ -3154,6 +3154,10 @@ defm LDURBB
              [(set GPR32:$Rt,
                     (zextloadi8 (am_unscaled16 GPR64sp:$Rn, simm9:$offset)))]>;
 
+// bf16 load pattern
+def : Pat <(bf16 (load (am_unscaled16 GPR64sp:$Rn, simm9:$offset))),
+           (LDURHi GPR64sp:$Rn, simm9:$offset)>;
+
 // Match all load 64 bits width whose type is compatible with FPR64
 let Predicates = [IsLE] in {
   def : Pat<(v2f32 (load (am_unscaled64 GPR64sp:$Rn, simm9:$offset))),
index ad05f07..14ce317 100644 (file)
@@ -11,6 +11,24 @@ define bfloat @test_load(ptr %p) nounwind {
   ret bfloat %tmp1
 }
 
+define bfloat @test_load_offset1(ptr %p) nounwind {
+; CHECK-LABEL: test_load_offset1:
+; CHECK-NEXT: ldur h0, [x0, #1]
+; CHECK-NEXT: ret
+  %g = getelementptr inbounds i8, ptr %p, i64 1
+  %tmp1 = load bfloat, ptr %g, align 2
+  ret bfloat %tmp1
+}
+
+define bfloat @test_load_offset2(ptr %p) nounwind {
+; CHECK-LABEL: test_load_offset2:
+; CHECK-NEXT: ldr h0, [x0, #2]
+; CHECK-NEXT: ret
+  %g = getelementptr inbounds i8, ptr %p, i64 2
+  %tmp1 = load bfloat, ptr %g, align 2
+  ret bfloat %tmp1
+}
+
 define <4 x bfloat> @test_vec_load(ptr %p) nounwind {
 ; CHECK-LABEL: test_vec_load:
 ; CHECK-NEXT: ldr d0, [x0]