From cd7d7ac0fd8786b3e79d39433b3b0d7cec59bd3d Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 12 Dec 2018 20:50:24 +0000 Subject: [PATCH] [X86] Move stack folding test for MULX to a MIR test. Add a MULX32 case as well A future patch may stop using MULX by default so use MIR to ensure we're always testing MULX. Add the 32-bit case that we couldn't do in the 64-bit mode IR test due to it being promoted to a 64-bit mul. llvm-svn: 348972 --- llvm/test/CodeGen/X86/stack-folding-bmi2.ll | 14 ---- llvm/test/CodeGen/X86/stack-folding-bmi2.mir | 103 +++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 llvm/test/CodeGen/X86/stack-folding-bmi2.mir diff --git a/llvm/test/CodeGen/X86/stack-folding-bmi2.ll b/llvm/test/CodeGen/X86/stack-folding-bmi2.ll index b70f7c6..0d0be6c 100644 --- a/llvm/test/CodeGen/X86/stack-folding-bmi2.ll +++ b/llvm/test/CodeGen/X86/stack-folding-bmi2.ll @@ -26,20 +26,6 @@ define i64 @stack_fold_bzhi_u64(i64 %a0, i64 %a1) { } declare i64 @llvm.x86.bmi.bzhi.64(i64, i64) -define i64 @stack_fold_mulx_u64(i64 %a0, i64 %a1, i64 *%a2) { - ;CHECK-LABEL: stack_fold_mulx_u64 - ;CHECK: mulxq {{-?[0-9]*}}(%rsp), %rax, %rcx {{.*#+}} 8-byte Folded Reload - %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"() - %2 = zext i64 %a0 to i128 - %3 = zext i64 %a1 to i128 - %4 = mul i128 %2, %3 - %5 = lshr i128 %4, 64 - %6 = trunc i128 %4 to i64 - %7 = trunc i128 %5 to i64 - store i64 %7, i64 *%a2 - ret i64 %6 -} - define i32 @stack_fold_pdep_u32(i32 %a0, i32 %a1) { ;CHECK-LABEL: stack_fold_pdep_u32 ;CHECK: pdepl {{-?[0-9]*}}(%rsp), %eax, %eax {{.*#+}} 4-byte Folded Reload diff --git a/llvm/test/CodeGen/X86/stack-folding-bmi2.mir b/llvm/test/CodeGen/X86/stack-folding-bmi2.mir new file mode 100644 index 0000000..ab97872 --- /dev/null +++ b/llvm/test/CodeGen/X86/stack-folding-bmi2.mir @@ -0,0 +1,103 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -o - -mtriple=x86_64-- -run-pass=greedy %s | FileCheck %s +# Tests for stack folding MULX. Doing this as a MIR test to ensure MULX is used and not legacy MUL. +--- | + ; Function Attrs: nounwind + define i32 @stack_fold_mulx_u32(i32 %a0, i32 %a1) #0 { + %1 = tail call i32 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"() + %2 = zext i32 %a0 to i128 + %3 = zext i32 %a1 to i128 + %4 = mul i128 %2, %3 + %5 = lshr i128 %4, 32 + %6 = trunc i128 %5 to i32 + ret i32 %6 + } + + ; Function Attrs: nounwind + define i64 @stack_fold_mulx_u64(i64 %a0, i64 %a1) #0 { + %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"() + %2 = zext i64 %a0 to i128 + %3 = zext i64 %a1 to i128 + %4 = mul i128 %2, %3 + %5 = lshr i128 %4, 64 + %6 = trunc i128 %5 to i64 + ret i64 %6 + } + + ; Function Attrs: nounwind + declare void @llvm.stackprotector(i8*, i8**) #1 + + attributes #0 = { nounwind "target-features"="+bmi2" } + attributes #1 = { nounwind } + +... +--- +name: stack_fold_mulx_u32 +alignment: 4 +tracksRegLiveness: true +registers: + - { id: 0, class: gr32 } + - { id: 1, class: gr32 } + - { id: 2, class: fr64 } + - { id: 3, class: gr32 } + - { id: 4, class: gr32 } +liveins: + - { reg: '$edi', virtual-reg: '%0' } + - { reg: '$esi', virtual-reg: '%1' } +body: | + bb.0 (%ir-block.0): + liveins: $edi, $esi + + ; CHECK-LABEL: name: stack_fold_mulx_u32 + ; CHECK: liveins: $edi, $esi + ; CHECK: MOV32mr %stack.0, 1, $noreg, 0, $noreg, $esi :: (store 4 into %stack.0) + ; CHECK: MOV32mr %stack.1, 1, $noreg, 0, $noreg, $edi :: (store 4 into %stack.1) + ; CHECK: INLINEASM &nop, 1, 4063242, def dead %2, 12, implicit-def dead early-clobber $rax, 12, implicit-def dead early-clobber $rbx, 12, implicit-def dead early-clobber $rcx, 12, implicit-def dead early-clobber $rdx, 12, implicit-def dead early-clobber $rsi, 12, implicit-def dead early-clobber $rdi, 12, implicit-def dead early-clobber $rbp, 12, implicit-def dead early-clobber $r8, 12, implicit-def dead early-clobber $r9, 12, implicit-def dead early-clobber $r10, 12, implicit-def dead early-clobber $r11, 12, implicit-def dead early-clobber $r12, 12, implicit-def dead early-clobber $r13, 12, implicit-def dead early-clobber $r14, 12, implicit-def dead early-clobber $r15 + ; CHECK: $edx = MOV32rm %stack.1, 1, $noreg, 0, $noreg :: (load 4 from %stack.1) + ; CHECK: %3:gr32, dead %4:gr32 = MULX32rm %stack.0, 1, $noreg, 0, $noreg, implicit $edx :: (load 4 from %stack.0) + ; CHECK: $eax = COPY %3 + ; CHECK: RET 0, $eax + %1:gr32 = COPY $esi + %0:gr32 = COPY $edi + INLINEASM &nop, 1, 4063242, def dead %2, 12, implicit-def dead early-clobber $rax, 12, implicit-def dead early-clobber $rbx, 12, implicit-def dead early-clobber $rcx, 12, implicit-def dead early-clobber $rdx, 12, implicit-def dead early-clobber $rsi, 12, implicit-def dead early-clobber $rdi, 12, implicit-def dead early-clobber $rbp, 12, implicit-def dead early-clobber $r8, 12, implicit-def dead early-clobber $r9, 12, implicit-def dead early-clobber $r10, 12, implicit-def dead early-clobber $r11, 12, implicit-def dead early-clobber $r12, 12, implicit-def dead early-clobber $r13, 12, implicit-def dead early-clobber $r14, 12, implicit-def dead early-clobber $r15 + $edx = COPY %0 + %3:gr32, dead %4:gr32 = MULX32rr %1, implicit killed $edx + $eax = COPY %3 + RET 0, killed $eax + +... +--- +name: stack_fold_mulx_u64 +alignment: 4 +tracksRegLiveness: true +registers: + - { id: 0, class: gr64 } + - { id: 1, class: gr64 } + - { id: 2, class: fr64 } + - { id: 3, class: gr64 } + - { id: 4, class: gr64 } +liveins: + - { reg: '$rdi', virtual-reg: '%0' } + - { reg: '$rsi', virtual-reg: '%1' } +body: | + bb.0 (%ir-block.0): + liveins: $rdi, $rsi + + ; CHECK-LABEL: name: stack_fold_mulx_u64 + ; CHECK: liveins: $rdi, $rsi + ; CHECK: MOV64mr %stack.0, 1, $noreg, 0, $noreg, $rsi :: (store 8 into %stack.0) + ; CHECK: MOV64mr %stack.1, 1, $noreg, 0, $noreg, $rdi :: (store 8 into %stack.1) + ; CHECK: INLINEASM &nop, 1, 4063242, def dead %2, 12, implicit-def dead early-clobber $rax, 12, implicit-def dead early-clobber $rbx, 12, implicit-def dead early-clobber $rcx, 12, implicit-def dead early-clobber $rdx, 12, implicit-def dead early-clobber $rsi, 12, implicit-def dead early-clobber $rdi, 12, implicit-def dead early-clobber $rbp, 12, implicit-def dead early-clobber $r8, 12, implicit-def dead early-clobber $r9, 12, implicit-def dead early-clobber $r10, 12, implicit-def dead early-clobber $r11, 12, implicit-def dead early-clobber $r12, 12, implicit-def dead early-clobber $r13, 12, implicit-def dead early-clobber $r14, 12, implicit-def dead early-clobber $r15 + ; CHECK: $rdx = MOV64rm %stack.1, 1, $noreg, 0, $noreg :: (load 8 from %stack.1) + ; CHECK: %3:gr64, dead %4:gr64 = MULX64rm %stack.0, 1, $noreg, 0, $noreg, implicit $rdx :: (load 8 from %stack.0) + ; CHECK: $rax = COPY %3 + ; CHECK: RET 0, $rax + %1:gr64 = COPY $rsi + %0:gr64 = COPY $rdi + INLINEASM &nop, 1, 4063242, def dead %2, 12, implicit-def dead early-clobber $rax, 12, implicit-def dead early-clobber $rbx, 12, implicit-def dead early-clobber $rcx, 12, implicit-def dead early-clobber $rdx, 12, implicit-def dead early-clobber $rsi, 12, implicit-def dead early-clobber $rdi, 12, implicit-def dead early-clobber $rbp, 12, implicit-def dead early-clobber $r8, 12, implicit-def dead early-clobber $r9, 12, implicit-def dead early-clobber $r10, 12, implicit-def dead early-clobber $r11, 12, implicit-def dead early-clobber $r12, 12, implicit-def dead early-clobber $r13, 12, implicit-def dead early-clobber $r14, 12, implicit-def dead early-clobber $r15 + $rdx = COPY %0 + %3:gr64, dead %4:gr64 = MULX64rr %1, implicit killed $rdx + $rax = COPY %3 + RET 0, killed $rax + +... -- 2.7.4