Files
clang-p2996/llvm/test/CodeGen/X86/GlobalISel/undef.ll
Sanjay Patel 19bc850220 [x86] don't try to convert add with undef operands to LEA
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
2018-12-09 14:40:37 +00:00

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
}