[llvm] r200119 - Improve pattern match from v1i8 to v1i32 for AArch64 Neon.

Jiangning Liu jiangning.liu at arm.com
Sat Jan 25 20:55:53 PST 2014


Author: jiangning
Date: Sat Jan 25 22:55:53 2014
New Revision: 200119

URL: http://llvm.org/viewvc/llvm-project?rev=200119&view=rev
Log:
Improve pattern match from v1i8 to v1i32 for AArch64 Neon.

Modified:
    llvm/trunk/lib/Target/AArch64/AArch64InstrNEON.td
    llvm/trunk/test/CodeGen/AArch64/neon-scalar-ext.ll

Modified: llvm/trunk/lib/Target/AArch64/AArch64InstrNEON.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrNEON.td?rev=200119&r1=200118&r2=200119&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64InstrNEON.td (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64InstrNEON.td Sat Jan 25 22:55:53 2014
@@ -6233,23 +6233,21 @@ multiclass NeonI_ext<string prefix, SDNo
               (v8i16 (!cast<Instruction>(prefix # "_8B")
                 (v8i8 (SUBREG_TO_REG (i64 0), $Rn, sub_8)), 0)),
               sub_16)>;
-  
-  // v1i8 -> v1i32
-  def : Pat<(v1i32 (ExtOp (v1i8 FPR8:$Rn))),
-            (EXTRACT_SUBREG
-              (v4i32 (!cast<Instruction>(prefix # "_4H")
-                (v4i16 (SUBREG_TO_REG (i64 0),
-                  (v1i16 (EXTRACT_SUBREG 
-                    (v8i16 (!cast<Instruction>(prefix # "_8B")
-                      (v8i8 (SUBREG_TO_REG (i64 0), $Rn, sub_8)), 0)),
-                    sub_16)),
-                  sub_16)), 0)),
-              sub_32)>;
 }
 
 defm NeonI_zext : NeonI_ext<"USHLLvvi", zext>;
 defm NeonI_sext : NeonI_ext<"SSHLLvvi", sext>;
 
+// zext v1i8 -> v1i32
+def : Pat<(v1i32 (zext (v1i8 FPR8:$Rn))),
+          (v1i32 (EXTRACT_SUBREG
+            (v1i64 (SUBREG_TO_REG (i64 0),
+              (v1i8 (DUPbv_B
+                (v16i8 (SUBREG_TO_REG (i64 0), $Rn, sub_8)),
+                0)),
+              sub_8)),
+            sub_32))>;
+
 // zext v1i8 -> v1i64
 def : Pat<(v1i64 (zext (v1i8 FPR8:$Rn))),
           (v1i64 (SUBREG_TO_REG (i64 0),
@@ -6266,6 +6264,18 @@ def : Pat<(v1i64 (zext (v1i16 FPR16:$Rn)
               0)),
             sub_16))>;
 
+// sext v1i8 -> v1i32
+def : Pat<(v1i32 (sext (v1i8 FPR8:$Rn))),
+          (EXTRACT_SUBREG
+            (v4i32 (SSHLLvvi_4H
+              (v4i16 (SUBREG_TO_REG (i64 0),
+                (v1i16 (EXTRACT_SUBREG 
+                  (v8i16 (SSHLLvvi_8B
+                    (v8i8 (SUBREG_TO_REG (i64 0), $Rn, sub_8)), 0)),
+                  sub_16)),
+                sub_16)), 0)),
+            sub_32)>;
+              
 // sext v1i8 -> v1i64
 def : Pat<(v1i64 (sext (v1i8 FPR8:$Rn))),
           (EXTRACT_SUBREG 

Modified: llvm/trunk/test/CodeGen/AArch64/neon-scalar-ext.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/neon-scalar-ext.ll?rev=200119&r1=200118&r2=200119&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/neon-scalar-ext.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/neon-scalar-ext.ll Sat Jan 25 22:55:53 2014
@@ -29,8 +29,7 @@ define <1 x i16> @test_zext_v1i8_v1i16(<
 
 define <1 x i32> @test_zext_v1i8_v1i32(<8 x i8> %v) nounwind readnone {
 ; CHECK-LABEL: test_zext_v1i8_v1i32:
-; CHECK: ushll	v0.8h, v0.8b, #0
-; CHECK: ushll	v0.4s, v0.4h, #0
+; CHECK: dup     b0, v0.b[0]
   %1 = extractelement <8 x i8> %v, i32 0
   %2 = insertelement <1 x i8> undef, i8 %1, i32 0
   %3 = zext <1 x i8> %2 to <1 x i32>





More information about the llvm-commits mailing list