Files
clang-p2996/llvm/test/CodeGen/AArch64/GlobalISel/select-phi.mir
Matt Arsenault 02769f2b3f AArch64/GlobalISel: Stop using legal s1 values
As far as I can tell treating s1 values as legal makes no sense. There
are no allocatable 1-bit registers. SelectionDAG legalizes the usual
set of boolean operations to 32-bits, and this should do the
same. This avoids some special case handling in the selector of s1
values, and some extra code to look through truncates.

This makes some code worse at -O0, since nothing cleans up the and 1
the artifact combiner inserts. We could probably add some
non-essential combines or teach the artifact combiner to elide
intermediates betweeen boolean uses and defs.
2022-07-08 11:55:08 -04:00

123 lines
3.2 KiB
YAML

# RUN: llc -mtriple=aarch64-unknown-unknown -o - -verify-machineinstrs -run-pass=instruction-select -global-isel-abort=1 %s | FileCheck %s
--- |
; ModuleID = '/tmp/test.ll'
source_filename = "/tmp/test.ll"
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-unknown"
define i32 @test_phi(i32 %argc) {
entry:
%cmp = icmp ugt i32 %argc, 0
br i1 %cmp, label %case1, label %case2
case1: ; preds = %entry
%tmp1 = add i32 %argc, 1
br label %return
case2: ; preds = %entry
%tmp2 = add i32 %argc, 2
br label %return
return: ; preds = %case2, %case1
%res = phi i32 [ %tmp1, %case1 ], [ %tmp2, %case2 ]
ret i32 %res
}
define i64* @test_phi_ptr(i64* %a, i64* %b, i1 %cond) {
entry:
ret i64* null
}
...
---
name: test_phi
alignment: 4
exposesReturnsTwice: false
legalized: true
regBankSelected: true
selected: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr, preferred-register: '' }
- { id: 1, class: gpr, preferred-register: '' }
- { id: 2, class: gpr, preferred-register: '' }
- { id: 3, class: gpr, preferred-register: '' }
- { id: 4, class: gpr, preferred-register: '' }
- { id: 5, class: gpr, preferred-register: '' }
- { id: 6, class: gpr, preferred-register: '' }
- { id: 7, class: gpr, preferred-register: '' }
- { id: 8, class: gpr, preferred-register: '' }
liveins:
body: |
bb.1.entry:
successors: %bb.2.case1(0x40000000), %bb.3.case2(0x40000000)
liveins: $w0
; CHECK-LABEL: name: test_phi
; CHECK: [[RES:%.*]]:gpr32 = PHI
%0(s32) = COPY $w0
%1(s32) = G_CONSTANT i32 0
%3(s32) = G_CONSTANT i32 1
%5(s32) = G_CONSTANT i32 2
%8(s32) = G_ICMP intpred(ugt), %0(s32), %1
G_BRCOND %8, %bb.2.case1
G_BR %bb.3.case2
bb.2.case1:
successors: %bb.4.return(0x80000000)
%4(s32) = G_ADD %0, %3
G_BR %bb.4.return
bb.3.case2:
successors: %bb.4.return(0x80000000)
%6(s32) = G_ADD %0, %5
bb.4.return:
%7(s32) = G_PHI %4(s32), %bb.2.case1, %6(s32), %bb.3.case2
$w0 = COPY %7(s32)
RET_ReallyLR implicit $w0
...
---
name: test_phi_ptr
alignment: 4
exposesReturnsTwice: false
legalized: true
regBankSelected: true
selected: false
tracksRegLiveness: true
registers:
- { id: 0, class: gpr, preferred-register: '' }
- { id: 1, class: gpr, preferred-register: '' }
- { id: 2, class: gpr, preferred-register: '' }
- { id: 3, class: gpr, preferred-register: '' }
- { id: 4, class: _, preferred-register: '' }
- { id: 5, class: _, preferred-register: '' }
liveins:
body: |
bb.0:
successors: %bb.1, %bb.2
liveins: $w2, $x0, $x1
; CHECK-LABEL: name: test_phi_ptr
%0(p0) = COPY $x0
%1(p0) = COPY $x1
%2:gpr(s32) = COPY $w2
G_BRCOND %2, %bb.1
G_BR %bb.2
bb.1:
successors: %bb.2
bb.2:
; CHECK: %{{[0-9]+}}:gpr64 = PHI %{{[0-9]+}}, %bb.0, %{{[0-9]+}}, %bb.1
%3(p0) = G_PHI %0(p0), %bb.0, %1(p0), %bb.1
$x0 = COPY %3(p0)
RET_ReallyLR implicit $x0
...