The existing code tries to handle an undef operand while transforming an add to an LEA, but it's incomplete because we will crash on the i16 test with the debug output shown below. It's better to just give up instead. Really, GlobalIsel should have folded these before we could get into trouble. # Machine code for function add_undef_i16: NoPHIs, TracksLiveness, Legalized, RegBankSelected, Selected bb.0 (%ir-block.0): liveins: $edi %1:gr32 = COPY killed $edi %0:gr16 = COPY %1.sub_16bit:gr32 %5:gr64_nosp = IMPLICIT_DEF %5.sub_16bit:gr64_nosp = COPY %0:gr16 %6:gr64_nosp = IMPLICIT_DEF %6.sub_16bit:gr64_nosp = COPY %2:gr16 %4:gr32 = LEA64_32r killed %5:gr64_nosp, 1, killed %6:gr64_nosp, 0, $noreg %3:gr16 = COPY killed %4.sub_16bit:gr32 $ax = COPY killed %3:gr16 RET 0, implicit killed $ax # End machine code for function add_undef_i16. *** Bad machine code: Reading virtual register without a def *** - function: add_undef_i16 - basic block: %bb.0 (0x7fe6cd83d940) - instruction: %6.sub_16bit:gr64_nosp = COPY %2:gr16 - operand 1: %2:gr16 LLVM ERROR: Found 1 machine code errors. Differential Revision: https://reviews.llvm.org/D54710 llvm-svn: 348722
68 lines
1.5 KiB
LLVM
68 lines
1.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=x86_64-linux-gnu -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL
|
|
|
|
define i8 @test() {
|
|
; ALL-LABEL: test:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: retq
|
|
ret i8 undef
|
|
}
|
|
|
|
define i8 @add_undef_i8(i8 %a) {
|
|
; ALL-LABEL: add_undef_i8:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: movl %edi, %eax
|
|
; ALL-NEXT: addb %al, %al
|
|
; ALL-NEXT: # kill: def $al killed $al killed $eax
|
|
; ALL-NEXT: retq
|
|
%r = add i8 %a, undef
|
|
ret i8 %r
|
|
}
|
|
|
|
define i16 @add_undef_i16(i16 %a) {
|
|
; ALL-LABEL: add_undef_i16:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: movl %edi, %eax
|
|
; ALL-NEXT: addw %ax, %ax
|
|
; ALL-NEXT: # kill: def $ax killed $ax killed $eax
|
|
; ALL-NEXT: retq
|
|
%r = add i16 %a, undef
|
|
ret i16 %r
|
|
}
|
|
|
|
define i16 @add_undef_i16_commute(i16 %a) {
|
|
; ALL-LABEL: add_undef_i16_commute:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: addw %di, %ax
|
|
; ALL-NEXT: retq
|
|
%r = add i16 undef, %a
|
|
ret i16 %r
|
|
}
|
|
|
|
define i32 @add_undef_i32(i32 %a) {
|
|
; ALL-LABEL: add_undef_i32:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: movl %edi, %eax
|
|
; ALL-NEXT: addl %eax, %eax
|
|
; ALL-NEXT: retq
|
|
%r = add i32 %a, undef
|
|
ret i32 %r
|
|
}
|
|
|
|
define float @test3() {
|
|
; ALL-LABEL: test3:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: retq
|
|
ret float undef
|
|
}
|
|
|
|
define float @test4(float %a) {
|
|
; ALL-LABEL: test4:
|
|
; ALL: # %bb.0:
|
|
; ALL-NEXT: addss %xmm0, %xmm0
|
|
; ALL-NEXT: retq
|
|
%r = fadd float %a, undef
|
|
ret float %r
|
|
}
|
|
|