brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · 0fdba21 Raw
104 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -o - -mtriple=x86_64-- -run-pass=greedy %s | FileCheck %s3# Tests for stack folding MULX. Doing this as a MIR test to ensure MULX is used and not legacy MUL.4--- |5  ; Function Attrs: nounwind6  define i32 @stack_fold_mulx_u32(i32 %a0, i32 %a1) #0 {7    tail call void asm sideeffect "nop", "~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()8    %1 = zext i32 %a0 to i1289    %2 = zext i32 %a1 to i12810    %3 = mul i128 %1, %211    %4 = lshr i128 %3, 3212    %5 = trunc i128 %4 to i3213    ret i32 %514  }15 16  ; Function Attrs: nounwind17  define i64 @stack_fold_mulx_u64(i64 %a0, i64 %a1) #0 {18    tail call void asm sideeffect "nop", "~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()19    %1 = zext i64 %a0 to i12820    %2 = zext i64 %a1 to i12821    %3 = mul i128 %1, %222    %4 = lshr i128 %3, 6423    %5 = trunc i128 %4 to i6424    ret i64 %525  }26 27  ; Function Attrs: nounwind28  declare void @llvm.stackprotector(ptr, ptr) #129 30  attributes #0 = { nounwind "target-features"="+bmi2" }31  attributes #1 = { nounwind }32 33...34---35name:            stack_fold_mulx_u3236alignment:       1637tracksRegLiveness: true38registers:39  - { id: 0, class: gr32 }40  - { id: 1, class: gr32 }41  - { id: 2, class: fr64 }42  - { id: 3, class: gr32 }43  - { id: 4, class: gr32 }44liveins:45  - { reg: '$edi', virtual-reg: '%0' }46  - { reg: '$esi', virtual-reg: '%1' }47body:             |48  bb.0 (%ir-block.0):49    liveins: $edi, $esi50 51    ; CHECK-LABEL: name: stack_fold_mulx_u3252    ; CHECK: liveins: $edi, $esi53    ; CHECK: MOV32mr %stack.0, 1, $noreg, 0, $noreg, $esi :: (store (s32) into %stack.0)54    ; CHECK: MOV32mr %stack.1, 1, $noreg, 0, $noreg, $edi :: (store (s32) into %stack.1)55    ; CHECK: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead early-clobber $rax, 12 /* clobber */, implicit-def dead early-clobber $rbx, 12 /* clobber */, implicit-def dead early-clobber $rcx, 12 /* clobber */, implicit-def dead early-clobber $rdx, 12 /* clobber */, implicit-def dead early-clobber $rsi, 12 /* clobber */, implicit-def dead early-clobber $rdi, 12 /* clobber */, implicit-def dead early-clobber $rbp, 12 /* clobber */, implicit-def dead early-clobber $r8, 12 /* clobber */, implicit-def dead early-clobber $r9, 12 /* clobber */, implicit-def dead early-clobber $r10, 12 /* clobber */, implicit-def dead early-clobber $r11, 12 /* clobber */, implicit-def dead early-clobber $r12, 12 /* clobber */, implicit-def dead early-clobber $r13, 12 /* clobber */, implicit-def dead early-clobber $r14, 12 /* clobber */, implicit-def dead early-clobber $r1556    ; CHECK: $edx = MOV32rm %stack.1, 1, $noreg, 0, $noreg :: (load (s32) from %stack.1)57    ; CHECK: %3:gr32, dead %4:gr32 = MULX32rm %stack.0, 1, $noreg, 0, $noreg, implicit $edx :: (load (s32) from %stack.0)58    ; CHECK: $eax = COPY %359    ; CHECK: RET 0, $eax60    %1:gr32 = COPY $esi61    %0:gr32 = COPY $edi62    INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead early-clobber $rax, 12 /* clobber */, implicit-def dead early-clobber $rbx, 12 /* clobber */, implicit-def dead early-clobber $rcx, 12 /* clobber */, implicit-def dead early-clobber $rdx, 12 /* clobber */, implicit-def dead early-clobber $rsi, 12 /* clobber */, implicit-def dead early-clobber $rdi, 12 /* clobber */, implicit-def dead early-clobber $rbp, 12 /* clobber */, implicit-def dead early-clobber $r8, 12 /* clobber */, implicit-def dead early-clobber $r9, 12 /* clobber */, implicit-def dead early-clobber $r10, 12 /* clobber */, implicit-def dead early-clobber $r11, 12 /* clobber */, implicit-def dead early-clobber $r12, 12 /* clobber */, implicit-def dead early-clobber $r13, 12 /* clobber */, implicit-def dead early-clobber $r14, 12 /* clobber */, implicit-def dead early-clobber $r1563    $edx = COPY %064    %3:gr32, dead %4:gr32 = MULX32rr %1, implicit killed $edx65    $eax = COPY %366    RET 0, killed $eax67 68...69---70name:            stack_fold_mulx_u6471alignment:       1672tracksRegLiveness: true73registers:74  - { id: 0, class: gr64 }75  - { id: 1, class: gr64 }76  - { id: 2, class: fr64 }77  - { id: 3, class: gr64 }78  - { id: 4, class: gr64 }79liveins:80  - { reg: '$rdi', virtual-reg: '%0' }81  - { reg: '$rsi', virtual-reg: '%1' }82body:             |83  bb.0 (%ir-block.0):84    liveins: $rdi, $rsi85 86    ; CHECK-LABEL: name: stack_fold_mulx_u6487    ; CHECK: liveins: $rdi, $rsi88    ; CHECK: MOV64mr %stack.0, 1, $noreg, 0, $noreg, $rsi :: (store (s64) into %stack.0)89    ; CHECK: MOV64mr %stack.1, 1, $noreg, 0, $noreg, $rdi :: (store (s64) into %stack.1)90    ; CHECK: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead early-clobber $rax, 12 /* clobber */, implicit-def dead early-clobber $rbx, 12 /* clobber */, implicit-def dead early-clobber $rcx, 12 /* clobber */, implicit-def dead early-clobber $rdx, 12 /* clobber */, implicit-def dead early-clobber $rsi, 12 /* clobber */, implicit-def dead early-clobber $rdi, 12 /* clobber */, implicit-def dead early-clobber $rbp, 12 /* clobber */, implicit-def dead early-clobber $r8, 12 /* clobber */, implicit-def dead early-clobber $r9, 12 /* clobber */, implicit-def dead early-clobber $r10, 12 /* clobber */, implicit-def dead early-clobber $r11, 12 /* clobber */, implicit-def dead early-clobber $r12, 12 /* clobber */, implicit-def dead early-clobber $r13, 12 /* clobber */, implicit-def dead early-clobber $r14, 12 /* clobber */, implicit-def dead early-clobber $r1591    ; CHECK: $rdx = MOV64rm %stack.1, 1, $noreg, 0, $noreg :: (load (s64) from %stack.1)92    ; CHECK: %3:gr64, dead %4:gr64 = MULX64rm %stack.0, 1, $noreg, 0, $noreg, implicit $rdx :: (load (s64) from %stack.0)93    ; CHECK: $rax = COPY %394    ; CHECK: RET 0, $rax95    %1:gr64 = COPY $rsi96    %0:gr64 = COPY $rdi97    INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead early-clobber $rax, 12 /* clobber */, implicit-def dead early-clobber $rbx, 12 /* clobber */, implicit-def dead early-clobber $rcx, 12 /* clobber */, implicit-def dead early-clobber $rdx, 12 /* clobber */, implicit-def dead early-clobber $rsi, 12 /* clobber */, implicit-def dead early-clobber $rdi, 12 /* clobber */, implicit-def dead early-clobber $rbp, 12 /* clobber */, implicit-def dead early-clobber $r8, 12 /* clobber */, implicit-def dead early-clobber $r9, 12 /* clobber */, implicit-def dead early-clobber $r10, 12 /* clobber */, implicit-def dead early-clobber $r11, 12 /* clobber */, implicit-def dead early-clobber $r12, 12 /* clobber */, implicit-def dead early-clobber $r13, 12 /* clobber */, implicit-def dead early-clobber $r14, 12 /* clobber */, implicit-def dead early-clobber $r1598    $rdx = COPY %099    %3:gr64, dead %4:gr64 = MULX64rr %1, implicit killed $rdx100    $rax = COPY %3101    RET 0, killed $rax102 103...104