forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARM64: handle v1i1 types arising from setcc properly.
There were several overlapping problems here, and this solution is closely inspired by the one adopted in AArch64 in r201381. Firstly, scalarisation of v1i1 setcc operations simply fails if the input types are legal. This is fixed in LegalizeVectorTypes.cpp this time, and allows AArch64 code to be simplified slightly. Second, vselect with such a setcc feeding into it ends up in ScalarizeVectorOperand, where it's not handled. I experimented with an implementation, but found that whatever DAG came out was rather horrific. I think Hao's DAG combine approach is a good one for quality, though there are edge cases it won't catch (to be fixed separately). Should fix PR19335. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205625 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
1 parent
148692b
commit 4a4d62b
Showing
4 changed files
with
114 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
; RUN: llc %s -o - -verify-machineinstrs -mtriple=arm64-none-linux-gnu | FileCheck %s | ||
|
||
; This is the analogue of AArch64's file of the same name. It's mostly testing | ||
; some form of correct lowering occurs, the tests are a little artificial but I | ||
; strongly suspect there's room for improved CodeGen (FIXME). | ||
|
||
define i64 @test_sext_extr_cmp_0(<1 x i64> %v1, <1 x i64> %v2) { | ||
; CHECK-LABEL: test_sext_extr_cmp_0: | ||
; CHECK: cmp {{x[0-9]+}}, {{x[0-9]+}} | ||
; CHECK: csinc | ||
%1 = icmp sge <1 x i64> %v1, %v2 | ||
%2 = extractelement <1 x i1> %1, i32 0 | ||
%vget_lane = sext i1 %2 to i64 | ||
ret i64 %vget_lane | ||
} | ||
|
||
define i64 @test_sext_extr_cmp_1(<1 x double> %v1, <1 x double> %v2) { | ||
; CHECK-LABEL: test_sext_extr_cmp_1: | ||
; CHECK: fcmp {{d[0-9]+}}, {{d[0-9]+}} | ||
%1 = fcmp oeq <1 x double> %v1, %v2 | ||
%2 = extractelement <1 x i1> %1, i32 0 | ||
%vget_lane = sext i1 %2 to i64 | ||
ret i64 %vget_lane | ||
} | ||
|
||
define <1 x i64> @test_select_v1i1_0(<1 x i64> %v1, <1 x i64> %v2, <1 x i64> %v3) { | ||
; CHECK-LABEL: test_select_v1i1_0: | ||
; CHECK: cmeq d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} | ||
; CHECK: bic v{{[0-9]+}}.8b, v{{[0-9]+}}.8b, v{{[0-9]+}}.8b | ||
%1 = icmp eq <1 x i64> %v1, %v2 | ||
%res = select <1 x i1> %1, <1 x i64> zeroinitializer, <1 x i64> %v3 | ||
ret <1 x i64> %res | ||
} | ||
|
||
define <1 x i64> @test_select_v1i1_1(<1 x double> %v1, <1 x double> %v2, <1 x i64> %v3) { | ||
; CHECK-LABEL: test_select_v1i1_1: | ||
; CHECK: fcmeq d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} | ||
; CHECK: bic v{{[0-9]+}}.8b, v{{[0-9]+}}.8b, v{{[0-9]+}}.8b | ||
%1 = fcmp oeq <1 x double> %v1, %v2 | ||
%res = select <1 x i1> %1, <1 x i64> zeroinitializer, <1 x i64> %v3 | ||
ret <1 x i64> %res | ||
} | ||
|
||
define <1 x double> @test_select_v1i1_2(<1 x i64> %v1, <1 x i64> %v2, <1 x double> %v3) { | ||
; CHECK-LABEL: test_select_v1i1_2: | ||
; CHECK: cmeq d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}} | ||
; CHECK: bic v{{[0-9]+}}.8b, v{{[0-9]+}}.8b, v{{[0-9]+}}.8b | ||
%1 = icmp eq <1 x i64> %v1, %v2 | ||
%res = select <1 x i1> %1, <1 x double> zeroinitializer, <1 x double> %v3 | ||
ret <1 x double> %res | ||
} | ||
|
||
define i32 @test_br_extr_cmp(<1 x i64> %v1, <1 x i64> %v2) { | ||
; CHECK-LABEL: test_br_extr_cmp: | ||
; CHECK: cmp x{{[0-9]+}}, x{{[0-9]+}} | ||
%1 = icmp eq <1 x i64> %v1, %v2 | ||
%2 = extractelement <1 x i1> %1, i32 0 | ||
br i1 %2, label %if.end, label %if.then | ||
|
||
if.then: | ||
ret i32 0; | ||
|
||
if.end: | ||
ret i32 1; | ||
} |