From 6bd44f2375ea7bcd643378be895df50763e9f3c1 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Fri, 17 Feb 2017 23:00:21 +0000 Subject: [PATCH] [X86] Add MOVBE targets to load combine tests Test folded endian swap tests with MOVBE instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295508 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/CodeGen/X86/load-combine.ll | 266 +++++++++++++++++++------------ 1 file changed, 165 insertions(+), 101 deletions(-) diff --git a/test/CodeGen/X86/load-combine.ll b/test/CodeGen/X86/load-combine.ll index 0a943bf73b2..e737a51cf40 100644 --- a/test/CodeGen/X86/load-combine.ll +++ b/test/CodeGen/X86/load-combine.ll @@ -1,6 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s -; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=CHECK64 +; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=CHECK --check-prefix=BSWAP +; RUN: llc < %s -mtriple=i686-unknown -mattr=+movbe | FileCheck %s --check-prefix=CHECK --check-prefix=MOVBE +; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=CHECK64 --check-prefix=BSWAP64 +; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+movbe | FileCheck %s --check-prefix=CHECK64 --check-prefix=MOVBE64 ; i8* p; ; (i32) p[0] | ((i32) p[1] << 8) | ((i32) p[2] << 16) | ((i32) p[3] << 24) @@ -15,7 +17,6 @@ define i32 @load_i32_by_i8(i32* %arg) { ; CHECK64: # BB#0: ; CHECK64-NEXT: movl (%rdi), %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp1 = load i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i32 @@ -40,19 +41,29 @@ define i32 @load_i32_by_i8(i32* %arg) { ; i8* p; ; ((i32) p[0] << 24) | ((i32) p[1] << 16) | ((i32) p[2] << 8) | (i32) p[3] define i32 @load_i32_by_i8_bswap(i32* %arg) { -; CHECK-LABEL: load_i32_by_i8_bswap: -; CHECK: # BB#0: -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax -; CHECK-NEXT: movl (%eax), %eax -; CHECK-NEXT: bswapl %eax -; CHECK-NEXT: retl +; BSWAP-LABEL: load_i32_by_i8_bswap: +; BSWAP: # BB#0: +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %eax +; BSWAP-NEXT: movl (%eax), %eax +; BSWAP-NEXT: bswapl %eax +; BSWAP-NEXT: retl ; -; CHECK64-LABEL: load_i32_by_i8_bswap: -; CHECK64: # BB#0: -; CHECK64-NEXT: movl (%rdi), %eax -; CHECK64-NEXT: bswapl %eax -; CHECK64-NEXT: retq - +; MOVBE-LABEL: load_i32_by_i8_bswap: +; MOVBE: # BB#0: +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax +; MOVBE-NEXT: movbel (%eax), %eax +; MOVBE-NEXT: retl +; +; BSWAP64-LABEL: load_i32_by_i8_bswap: +; BSWAP64: # BB#0: +; BSWAP64-NEXT: movl (%rdi), %eax +; BSWAP64-NEXT: bswapl %eax +; BSWAP64-NEXT: retq +; +; MOVBE64-LABEL: load_i32_by_i8_bswap: +; MOVBE64: # BB#0: +; MOVBE64-NEXT: movbel (%rdi), %eax +; MOVBE64-NEXT: retq %tmp = bitcast i32* %arg to i8* %tmp1 = load i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i32 @@ -87,7 +98,6 @@ define i32 @load_i32_by_i16(i32* %arg) { ; CHECK64: # BB#0: ; CHECK64-NEXT: movl (%rdi), %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i16* %tmp1 = load i16, i16* %tmp, align 1 %tmp2 = zext i16 %tmp1 to i32 @@ -113,7 +123,6 @@ define i32 @load_i32_by_i16_i8(i32* %arg) { ; CHECK64: # BB#0: ; CHECK64-NEXT: movl (%rdi), %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i16* %tmp1 = bitcast i32* %arg to i8* %tmp2 = load i16, i16* %tmp, align 1 @@ -145,7 +154,6 @@ define i32 @load_i32_by_i16_by_i8(i32* %arg) { ; CHECK64: # BB#0: ; CHECK64-NEXT: movl (%rdi), %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp1 = load i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i16 @@ -172,19 +180,29 @@ define i32 @load_i32_by_i16_by_i8(i32* %arg) { ; i8* p; ; ((i32) (((i16) p[0] << 8) | (i16) p[1]) << 16) | (i32) (((i16) p[3] << 8) | (i16) p[4]) define i32 @load_i32_by_i16_by_i8_bswap(i32* %arg) { -; CHECK-LABEL: load_i32_by_i16_by_i8_bswap: -; CHECK: # BB#0: -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax -; CHECK-NEXT: movl (%eax), %eax -; CHECK-NEXT: bswapl %eax -; CHECK-NEXT: retl +; BSWAP-LABEL: load_i32_by_i16_by_i8_bswap: +; BSWAP: # BB#0: +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %eax +; BSWAP-NEXT: movl (%eax), %eax +; BSWAP-NEXT: bswapl %eax +; BSWAP-NEXT: retl ; -; CHECK64-LABEL: load_i32_by_i16_by_i8_bswap: -; CHECK64: # BB#0: -; CHECK64-NEXT: movl (%rdi), %eax -; CHECK64-NEXT: bswapl %eax -; CHECK64-NEXT: retq - +; MOVBE-LABEL: load_i32_by_i16_by_i8_bswap: +; MOVBE: # BB#0: +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax +; MOVBE-NEXT: movbel (%eax), %eax +; MOVBE-NEXT: retl +; +; BSWAP64-LABEL: load_i32_by_i16_by_i8_bswap: +; BSWAP64: # BB#0: +; BSWAP64-NEXT: movl (%rdi), %eax +; BSWAP64-NEXT: bswapl %eax +; BSWAP64-NEXT: retq +; +; MOVBE64-LABEL: load_i32_by_i16_by_i8_bswap: +; MOVBE64: # BB#0: +; MOVBE64-NEXT: movbel (%rdi), %eax +; MOVBE64-NEXT: retq %tmp = bitcast i32* %arg to i8* %tmp1 = load i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i16 @@ -222,7 +240,6 @@ define i64 @load_i64_by_i8(i64* %arg) { ; CHECK64: # BB#0: ; CHECK64-NEXT: movq (%rdi), %rax ; CHECK64-NEXT: retq - %tmp = bitcast i64* %arg to i8* %tmp1 = load i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i64 @@ -267,21 +284,32 @@ define i64 @load_i64_by_i8(i64* %arg) { ; i8* p; ; ((i64) p[0] << 56) | ((i64) p[1] << 48) | ((i64) p[2] << 40) | ((i64) p[3] << 32) | ((i64) p[4] << 24) | ((i64) p[5] << 16) | ((i64) p[6] << 8) | (i64) p[7] define i64 @load_i64_by_i8_bswap(i64* %arg) { -; CHECK-LABEL: load_i64_by_i8_bswap: -; CHECK: # BB#0: -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax -; CHECK-NEXT: movl (%eax), %edx -; CHECK-NEXT: movl 4(%eax), %eax -; CHECK-NEXT: bswapl %eax -; CHECK-NEXT: bswapl %edx -; CHECK-NEXT: retl +; BSWAP-LABEL: load_i64_by_i8_bswap: +; BSWAP: # BB#0: +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %eax +; BSWAP-NEXT: movl (%eax), %edx +; BSWAP-NEXT: movl 4(%eax), %eax +; BSWAP-NEXT: bswapl %eax +; BSWAP-NEXT: bswapl %edx +; BSWAP-NEXT: retl ; -; CHECK64-LABEL: load_i64_by_i8_bswap: -; CHECK64: # BB#0: -; CHECK64-NEXT: movq (%rdi), %rax -; CHECK64-NEXT: bswapq %rax -; CHECK64-NEXT: retq - +; MOVBE-LABEL: load_i64_by_i8_bswap: +; MOVBE: # BB#0: +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx +; MOVBE-NEXT: movbel 4(%ecx), %eax +; MOVBE-NEXT: movbel (%ecx), %edx +; MOVBE-NEXT: retl +; +; BSWAP64-LABEL: load_i64_by_i8_bswap: +; BSWAP64: # BB#0: +; BSWAP64-NEXT: movq (%rdi), %rax +; BSWAP64-NEXT: bswapq %rax +; BSWAP64-NEXT: retq +; +; MOVBE64-LABEL: load_i64_by_i8_bswap: +; MOVBE64: # BB#0: +; MOVBE64-NEXT: movbeq (%rdi), %rax +; MOVBE64-NEXT: retq %tmp = bitcast i64* %arg to i8* %tmp1 = load i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i64 @@ -367,7 +395,6 @@ define i32 @load_i32_by_i8_bswap_uses(i32* %arg) { ; CHECK64-NEXT: orl %esi, %eax ; CHECK64-NEXT: orl %ecx, %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp1 = load i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i32 @@ -424,7 +451,6 @@ define i32 @load_i32_by_i8_bswap_volatile(i32* %arg) { ; CHECK64-NEXT: movzbl 3(%rdi), %eax ; CHECK64-NEXT: orl %edx, %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp1 = load volatile i8, i8* %tmp, align 1 %tmp2 = zext i8 %tmp1 to i32 @@ -490,7 +516,6 @@ define i32 @load_i32_by_i8_bswap_store_in_between(i32* %arg, i32* %arg1) { ; CHECK64-NEXT: movzbl 3(%rdi), %eax ; CHECK64-NEXT: orl %edx, %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp2 = load i8, i8* %tmp, align 1 %tmp3 = zext i8 %tmp2 to i32 @@ -547,7 +572,6 @@ define i32 @load_i32_by_i8_bswap_unrelated_load(i32* %arg, i32* %arg1) { ; CHECK64-NEXT: movzbl 3(%rdi), %eax ; CHECK64-NEXT: orl %edx, %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp2 = bitcast i32* %arg1 to i8* %tmp3 = load i8, i8* %tmp, align 1 @@ -584,7 +608,6 @@ define i32 @load_i32_by_i8_nonzero_offset(i32* %arg) { ; CHECK64: # BB#0: ; CHECK64-NEXT: movl 1(%rdi), %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp1 = getelementptr inbounds i8, i8* %tmp, i32 1 %tmp2 = load i8, i8* %tmp1, align 1 @@ -620,7 +643,6 @@ define i32 @load_i32_by_i8_neg_offset(i32* %arg) { ; CHECK64: # BB#0: ; CHECK64-NEXT: movl -4(%rdi), %eax ; CHECK64-NEXT: retq - %tmp = bitcast i32* %arg to i8* %tmp1 = getelementptr inbounds i8, i8* %tmp, i32 -4 %tmp2 = load i8, i8* %tmp1, align 1 @@ -646,19 +668,29 @@ define i32 @load_i32_by_i8_neg_offset(i32* %arg) { ; i8* p; ; (i32) p[4] | ((i32) p[3] << 8) | ((i32) p[2] << 16) | ((i32) p[1] << 24) define i32 @load_i32_by_i8_nonzero_offset_bswap(i32* %arg) { -; CHECK-LABEL: load_i32_by_i8_nonzero_offset_bswap: -; CHECK: # BB#0: -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax -; CHECK-NEXT: movl 1(%eax), %eax -; CHECK-NEXT: bswapl %eax -; CHECK-NEXT: retl +; BSWAP-LABEL: load_i32_by_i8_nonzero_offset_bswap: +; BSWAP: # BB#0: +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %eax +; BSWAP-NEXT: movl 1(%eax), %eax +; BSWAP-NEXT: bswapl %eax +; BSWAP-NEXT: retl ; -; CHECK64-LABEL: load_i32_by_i8_nonzero_offset_bswap: -; CHECK64: # BB#0: -; CHECK64-NEXT: movl 1(%rdi), %eax -; CHECK64-NEXT: bswapl %eax -; CHECK64-NEXT: retq - +; MOVBE-LABEL: load_i32_by_i8_nonzero_offset_bswap: +; MOVBE: # BB#0: +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax +; MOVBE-NEXT: movbel 1(%eax), %eax +; MOVBE-NEXT: retl +; +; BSWAP64-LABEL: load_i32_by_i8_nonzero_offset_bswap: +; BSWAP64: # BB#0: +; BSWAP64-NEXT: movl 1(%rdi), %eax +; BSWAP64-NEXT: bswapl %eax +; BSWAP64-NEXT: retq +; +; MOVBE64-LABEL: load_i32_by_i8_nonzero_offset_bswap: +; MOVBE64: # BB#0: +; MOVBE64-NEXT: movbel 1(%rdi), %eax +; MOVBE64-NEXT: retq %tmp = bitcast i32* %arg to i8* %tmp1 = getelementptr inbounds i8, i8* %tmp, i32 4 %tmp2 = load i8, i8* %tmp1, align 1 @@ -684,19 +716,29 @@ define i32 @load_i32_by_i8_nonzero_offset_bswap(i32* %arg) { ; i8* p; ; (i32) p[-1] | ((i32) p[-2] << 8) | ((i32) p[-3] << 16) | ((i32) p[-4] << 24) define i32 @load_i32_by_i8_neg_offset_bswap(i32* %arg) { -; CHECK-LABEL: load_i32_by_i8_neg_offset_bswap: -; CHECK: # BB#0: -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax -; CHECK-NEXT: movl -4(%eax), %eax -; CHECK-NEXT: bswapl %eax -; CHECK-NEXT: retl +; BSWAP-LABEL: load_i32_by_i8_neg_offset_bswap: +; BSWAP: # BB#0: +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %eax +; BSWAP-NEXT: movl -4(%eax), %eax +; BSWAP-NEXT: bswapl %eax +; BSWAP-NEXT: retl ; -; CHECK64-LABEL: load_i32_by_i8_neg_offset_bswap: -; CHECK64: # BB#0: -; CHECK64-NEXT: movl -4(%rdi), %eax -; CHECK64-NEXT: bswapl %eax -; CHECK64-NEXT: retq - +; MOVBE-LABEL: load_i32_by_i8_neg_offset_bswap: +; MOVBE: # BB#0: +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax +; MOVBE-NEXT: movbel -4(%eax), %eax +; MOVBE-NEXT: retl +; +; BSWAP64-LABEL: load_i32_by_i8_neg_offset_bswap: +; BSWAP64: # BB#0: +; BSWAP64-NEXT: movl -4(%rdi), %eax +; BSWAP64-NEXT: bswapl %eax +; BSWAP64-NEXT: retq +; +; MOVBE64-LABEL: load_i32_by_i8_neg_offset_bswap: +; MOVBE64: # BB#0: +; MOVBE64-NEXT: movbel -4(%rdi), %eax +; MOVBE64-NEXT: retq %tmp = bitcast i32* %arg to i8* %tmp1 = getelementptr inbounds i8, i8* %tmp, i32 -1 %tmp2 = load i8, i8* %tmp1, align 1 @@ -722,20 +764,33 @@ define i32 @load_i32_by_i8_neg_offset_bswap(i32* %arg) { ; i8* p; i32 i; ; ((i32) p[i] << 24) | ((i32) p[i + 1] << 16) | ((i32) p[i + 2] << 8) | (i32) p[i + 3] define i32 @load_i32_by_i8_bswap_base_index_offset(i32* %arg, i32 %arg1) { -; CHECK-LABEL: load_i32_by_i8_bswap_base_index_offset: -; CHECK: # BB#0: -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx -; CHECK-NEXT: movl (%ecx,%eax), %eax -; CHECK-NEXT: bswapl %eax -; CHECK-NEXT: retl +; BSWAP-LABEL: load_i32_by_i8_bswap_base_index_offset: +; BSWAP: # BB#0: +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %eax +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %ecx +; BSWAP-NEXT: movl (%ecx,%eax), %eax +; BSWAP-NEXT: bswapl %eax +; BSWAP-NEXT: retl ; -; CHECK64-LABEL: load_i32_by_i8_bswap_base_index_offset: -; CHECK64: # BB#0: -; CHECK64-NEXT: movslq %esi, %rax -; CHECK64-NEXT: movl (%rdi,%rax), %eax -; CHECK64-NEXT: bswapl %eax -; CHECK64-NEXT: retq +; MOVBE-LABEL: load_i32_by_i8_bswap_base_index_offset: +; MOVBE: # BB#0: +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %ecx +; MOVBE-NEXT: movbel (%ecx,%eax), %eax +; MOVBE-NEXT: retl +; +; BSWAP64-LABEL: load_i32_by_i8_bswap_base_index_offset: +; BSWAP64: # BB#0: +; BSWAP64-NEXT: movslq %esi, %rax +; BSWAP64-NEXT: movl (%rdi,%rax), %eax +; BSWAP64-NEXT: bswapl %eax +; BSWAP64-NEXT: retq +; +; MOVBE64-LABEL: load_i32_by_i8_bswap_base_index_offset: +; MOVBE64: # BB#0: +; MOVBE64-NEXT: movslq %esi, %rax +; MOVBE64-NEXT: movbel (%rdi,%rax), %eax +; MOVBE64-NEXT: retq %tmp = bitcast i32* %arg to i8* %tmp2 = getelementptr inbounds i8, i8* %tmp, i32 %arg1 %tmp3 = load i8, i8* %tmp2, align 1 @@ -794,20 +849,29 @@ declare i16 @llvm.bswap.i16(i16) ; i16* p; ; (i32) bswap(p[1]) | (i32) bswap(p[0] << 16) define i32 @load_i32_by_bswap_i16(i32* %arg) { -; CHECK-LABEL: load_i32_by_bswap_i16: -; CHECK: # BB#0: -; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax -; CHECK-NEXT: movl (%eax), %eax -; CHECK-NEXT: bswapl %eax -; CHECK-NEXT: retl +; BSWAP-LABEL: load_i32_by_bswap_i16: +; BSWAP: # BB#0: +; BSWAP-NEXT: movl {{[0-9]+}}(%esp), %eax +; BSWAP-NEXT: movl (%eax), %eax +; BSWAP-NEXT: bswapl %eax +; BSWAP-NEXT: retl ; -; CHECK64-LABEL: load_i32_by_bswap_i16: -; CHECK64: # BB#0: -; CHECK64-NEXT: movl (%rdi), %eax -; CHECK64-NEXT: bswapl %eax -; CHECK64-NEXT: retq - - +; MOVBE-LABEL: load_i32_by_bswap_i16: +; MOVBE: # BB#0: +; MOVBE-NEXT: movl {{[0-9]+}}(%esp), %eax +; MOVBE-NEXT: movbel (%eax), %eax +; MOVBE-NEXT: retl +; +; BSWAP64-LABEL: load_i32_by_bswap_i16: +; BSWAP64: # BB#0: +; BSWAP64-NEXT: movl (%rdi), %eax +; BSWAP64-NEXT: bswapl %eax +; BSWAP64-NEXT: retq +; +; MOVBE64-LABEL: load_i32_by_bswap_i16: +; MOVBE64: # BB#0: +; MOVBE64-NEXT: movbel (%rdi), %eax +; MOVBE64-NEXT: retq %tmp = bitcast i32* %arg to i16* %tmp1 = load i16, i16* %tmp, align 4 %tmp11 = call i16 @llvm.bswap.i16(i16 %tmp1) -- 2.50.1