[AArch64] Removed unused i8 type from FPR8 register class.
authorAna Pazos <apazos@codeaurora.org>
Fri, 24 Jan 2014 22:36:53 +0000 (22:36 +0000)
committerAna Pazos <apazos@codeaurora.org>
Fri, 24 Jan 2014 22:36:53 +0000 (22:36 +0000)
The i8 type is not registered with any register class.
This causes a segmentation fault in MachineLICM::getRegisterClassIDAndCost.

The code selects the first type associated with register class FPR8,
which happens to be i8.
It uses this type (i8) to get the representative class pointer, which is 0.
It then uses this pointer to access a field, resulting in segmentation fault.

Since i8 type is not being used for printing any neon instruction
we can safely remove it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200046 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64RegisterInfo.td
test/CodeGen/AArch64/concatvector-v8i8-bug.ll [new file with mode: 0644]

index cfc0c953bd22312dd1d6e3a69b30bd37e543bbfe..9de7abdf5ff04132a1490b74f8eb491e1d7aa3ca 100644 (file)
@@ -146,7 +146,7 @@ foreach Index = 0-31 in {
 }
 
 
-def FPR8 : RegisterClass<"AArch64", [i8, v1i8], 8,
+def FPR8 : RegisterClass<"AArch64", [v1i8], 8,
                           (sequence "B%u", 0, 31)> {
 }
 
diff --git a/test/CodeGen/AArch64/concatvector-v8i8-bug.ll b/test/CodeGen/AArch64/concatvector-v8i8-bug.ll
new file mode 100644 (file)
index 0000000..f8854c3
--- /dev/null
@@ -0,0 +1,47 @@
+; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon
+; Bug: i8 type in FRP8 register but not registering with register class causes segmentation fault.
+; Fix: Removed i8 type from FPR8 register class.
+
+define void @test_concatvector_v8i8() {
+entry.split:
+  br i1 undef, label %if.then, label %if.end
+
+if.then:                                          ; preds = %entry.split
+  unreachable
+
+if.end:                                           ; preds = %entry.split
+  br i1 undef, label %if.then9, label %if.end18
+
+if.then9:                                         ; preds = %if.end
+  unreachable
+
+if.end18:                                         ; preds = %if.end
+  br label %for.body
+
+for.body:                                         ; preds = %for.inc, %if.end18
+  br i1 false, label %if.then30, label %for.inc
+
+if.then30:                                        ; preds = %for.body
+  unreachable
+
+for.inc:                                          ; preds = %for.body
+  br i1 undef, label %for.end, label %for.body
+
+for.end:                                          ; preds = %for.inc
+  br label %for.body77
+
+for.body77:                                       ; preds = %for.body77, %for.end
+  br i1 undef, label %for.end106, label %for.body77
+
+for.end106:                                       ; preds = %for.body77
+  br i1 undef, label %for.body130.us.us, label %stmt.for.body130.us.us
+
+stmt.for.body130.us.us:                     ; preds = %stmt.for.body130.us.us, %for.end106
+  %_p_splat.us = shufflevector <1 x i8> zeroinitializer, <1 x i8> undef, <8 x i32> zeroinitializer
+  store <8 x i8> %_p_splat.us, <8 x i8>* undef, align 1
+  br label %stmt.for.body130.us.us
+
+for.body130.us.us:                                ; preds = %for.body130.us.us, %for.end106
+  br label %for.body130.us.us
+}
+