blob: 86d24a62f3bfdadcedfd97616c8efccd20fc25e0 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=x86_64-- -fast-isel -fast-isel-abort=1 -stop-after=finalize-isel < %s | FileCheck %s
; The implicit $eflags def is unused.
define i32 @add(i32 %a, i32 %b) {
; CHECK-LABEL: name: add
; CHECK: bb.0 (%ir-block.0):
; CHECK-NEXT: liveins: $edi, $esi
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esi
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY [[COPY1]]
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr32 = COPY [[COPY]]
; CHECK-NEXT: [[ADD32rr:%[0-9]+]]:gr32 = ADD32rr [[COPY2]], [[COPY3]], implicit-def dead $eflags
; CHECK-NEXT: $eax = COPY [[ADD32rr]]
; CHECK-NEXT: RET64 implicit $eax
%r = add i32 %a, %b
ret i32 %r
}
; The implicit $eflags def is read by the SETcc.
define i32 @uaddo(i32 %a, i32 %b) {
; CHECK-LABEL: name: uaddo
; CHECK: bb.0 (%ir-block.0):
; CHECK-NEXT: liveins: $edi, $esi
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esi
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY [[COPY1]]
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr32 = COPY [[COPY]]
; CHECK-NEXT: [[ADD32rr:%[0-9]+]]:gr32 = ADD32rr [[COPY2]], [[COPY3]], implicit-def $eflags
; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
; CHECK-NEXT: [[AND8ri:%[0-9]+]]:gr8 = AND8ri [[SETCCr]], 1, implicit-def dead $eflags
; CHECK-NEXT: [[MOVZX32rr8_:%[0-9]+]]:gr32 = MOVZX32rr8 [[AND8ri]]
; CHECK-NEXT: $eax = COPY [[MOVZX32rr8_]]
; CHECK-NEXT: RET64 implicit $eax
%t = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a, i32 %b)
%o = extractvalue { i32, i1 } %t, 1
%z = zext i1 %o to i32
ret i32 %z
}
; $edx is unused, but the implicit $eflags def is read by the SETcc.
define i32 @umulo(i32 %a, i32 %b) {
; CHECK-LABEL: name: umulo
; CHECK: bb.0 (%ir-block.0):
; CHECK-NEXT: liveins: $edi, $esi
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esi
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY [[COPY1]]
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr32 = COPY [[COPY]]
; CHECK-NEXT: $eax = COPY [[COPY2]]
; CHECK-NEXT: MUL32r [[COPY3]], implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr32 = COPY $eax
; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
; CHECK-NEXT: [[AND8ri:%[0-9]+]]:gr8 = AND8ri [[SETCCr]], 1, implicit-def dead $eflags
; CHECK-NEXT: [[MOVZX32rr8_:%[0-9]+]]:gr32 = MOVZX32rr8 [[AND8ri]]
; CHECK-NEXT: $eax = COPY [[MOVZX32rr8_]]
; CHECK-NEXT: RET64 implicit $eax
%t = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %a, i32 %b)
%o = extractvalue { i32, i1 } %t, 1
%z = zext i1 %o to i32
ret i32 %z
}