For most targets, the register class comes from the type so this makes no difference. For AMDGPU, the selected register class depends on the divergence of the value. For a constant phi input, this will always be false. The heuristic for whether to treat the value as a scalar or vector constant based on the uses would then incorrectly think this is a scalar use, when really the phi is a copy from S to V. This avoids an intermediate s_mov_b32 plus a copy in some cases. These would often, but not always, fold out in mi passes. This only adjusts the constant input case. It may make sense to do this for the non-constant case as well.
25 lines
833 B
LLVM
25 lines
833 B
LLVM
; RUN: llc -mtriple=amdgcn -stop-after=amdgpu-isel -verify-machineinstrs -o - %s | FileCheck %s
|
|
; RUN: llc -mtriple=amdgcn -stop-after=amdgpu-isel -enable-new-pm -o - %s | FileCheck %s
|
|
|
|
; CHECK-LABEL: vcopy_i1_undef
|
|
; CHECK: [[IMPDEF0:%[0-9]+]]:vreg_1 = IMPLICIT_DEF
|
|
; CHECK-NOT: COPY
|
|
; CHECK: [[IMPDEF1:%[0-9]+]]:vreg_1 = IMPLICIT_DEF
|
|
; CHECK-NOT: COPY [[IMPDEF0]]
|
|
; CHECK-NOT: COPY [[IMPDEF1]]
|
|
; CHECK: .false:
|
|
define <2 x float> @vcopy_i1_undef(ptr addrspace(1) %p, i1 %c0) {
|
|
entry:
|
|
br i1 %c0, label %exit, label %false
|
|
|
|
false:
|
|
%x = load <2 x float>, ptr addrspace(1) %p
|
|
%cmp = fcmp one <2 x float> %x, zeroinitializer
|
|
br label %exit
|
|
|
|
exit:
|
|
%c = phi <2 x i1> [ undef, %entry ], [ %cmp, %false ]
|
|
%ret = select <2 x i1> %c, <2 x float> <float 2.0, float 2.0>, <2 x float> <float 4.0, float 4.0>
|
|
ret <2 x float> %ret
|
|
}
|