Guozhi Wei f1d8345a2a [TwoAddressInstructionPass] Create register mapping for registers with multiple uses in the current MBB
Currently we create register mappings for registers used only once in current
MBB. For registers with multiple uses, when all the uses are in the current MBB,
we can also create mappings for them similarly according to the last use.
For example

    %reg101 = ...
            = ... reg101
    %reg103 = ADD %reg101, %reg102

We can create mapping between %reg101 and %reg103.

Differential Revision: https://reviews.llvm.org/D113193
2021-11-29 19:01:59 -08:00

79 lines
2.1 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+cmov | FileCheck %s
define i32 @test1(i32 %X) {
; CHECK-LABEL: test1:
; CHECK: # %bb.0:
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
; CHECK-NEXT: movl $-2139062143, %edx # imm = 0x80808081
; CHECK-NEXT: movl %ecx, %eax
; CHECK-NEXT: imull %edx
; CHECK-NEXT: leal (%edx,%ecx), %eax
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: shrl $31, %edx
; CHECK-NEXT: sarl $7, %eax
; CHECK-NEXT: addl %edx, %eax
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: shll $8, %edx
; CHECK-NEXT: subl %edx, %eax
; CHECK-NEXT: addl %ecx, %eax
; CHECK-NEXT: retl
%tmp1 = srem i32 %X, 255
ret i32 %tmp1
}
define i32 @test2(i32 %X) {
; CHECK-LABEL: test2:
; CHECK: # %bb.0:
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
; CHECK-NEXT: leal 255(%eax), %ecx
; CHECK-NEXT: testl %eax, %eax
; CHECK-NEXT: cmovnsl %eax, %ecx
; CHECK-NEXT: andl $-256, %ecx
; CHECK-NEXT: subl %ecx, %eax
; CHECK-NEXT: retl
%tmp1 = srem i32 %X, 256
ret i32 %tmp1
}
define i32 @test3(i32 %X) {
; CHECK-LABEL: test3:
; CHECK: # %bb.0:
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
; CHECK-NEXT: movl $-2139062143, %edx # imm = 0x80808081
; CHECK-NEXT: movl %ecx, %eax
; CHECK-NEXT: mull %edx
; CHECK-NEXT: shrl $7, %edx
; CHECK-NEXT: movl %edx, %eax
; CHECK-NEXT: shll $8, %eax
; CHECK-NEXT: subl %eax, %edx
; CHECK-NEXT: addl %edx, %ecx
; CHECK-NEXT: movl %ecx, %eax
; CHECK-NEXT: retl
%tmp1 = urem i32 %X, 255
ret i32 %tmp1
}
define i32 @test4(i32 %X) {
; CHECK-LABEL: test4:
; CHECK: # %bb.0:
; CHECK-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; CHECK-NEXT: retl
%tmp1 = urem i32 %X, 256
ret i32 %tmp1
}
define i32 @test5(i32 %X) nounwind readnone {
; CHECK-LABEL: test5:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl $41, %eax
; CHECK-NEXT: xorl %edx, %edx
; CHECK-NEXT: idivl {{[0-9]+}}(%esp)
; CHECK-NEXT: movl %edx, %eax
; CHECK-NEXT: retl
entry:
%0 = srem i32 41, %X
ret i32 %0
}