[llvm] r295508 - [X86] Add MOVBE targets to load combine tests

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 17 15:00:21 PST 2017


Author: rksimon
Date: Fri Feb 17 17:00:21 2017
New Revision: 295508

URL: http://llvm.org/viewvc/llvm-project?rev=295508&view=rev
Log:
[X86] Add MOVBE targets to load combine tests

Test folded endian swap tests with MOVBE instructions.

Modified:
    llvm/trunk/test/CodeGen/X86/load-combine.ll

Modified: llvm/trunk/test/CodeGen/X86/load-combine.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/load-combine.ll?rev=295508&r1=295507&r2=295508&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/load-combine.ll (original)
+++ llvm/trunk/test/CodeGen/X86/load-combine.ll Fri Feb 17 17:00:21 2017
@@ -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
-;
-; CHECK64-LABEL: load_i32_by_i8_bswap:
-; CHECK64:       # BB#0:
-; CHECK64-NEXT:    movl (%rdi), %eax
-; CHECK64-NEXT:    bswapl %eax
-; CHECK64-NEXT:    retq
-
+; 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
+;
+; 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* %
 ; 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* %
 ; 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
-;
-; CHECK64-LABEL: load_i32_by_i16_by_i8_bswap:
-; CHECK64:       # BB#0:
-; CHECK64-NEXT:    movl (%rdi), %eax
-; CHECK64-NEXT:    bswapl %eax
-; CHECK64-NEXT:    retq
-
+; 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
+;
+; 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
-;
-; CHECK64-LABEL: load_i64_by_i8_bswap:
-; CHECK64:       # BB#0:
-; CHECK64-NEXT:    movq (%rdi), %rax
-; CHECK64-NEXT:    bswapq %rax
-; CHECK64-NEXT:    retq
-
+; 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
+;
+; 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(i3
 ; 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_volatil
 ; 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_i
 ; 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_unrelat
 ; 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_offse
 ; 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(i3
 ; 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(i3
 ; 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
-;
-; 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
-
+; 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
+;
+; 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_offse
 ; 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
-;
-; 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
-
+; 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
+;
+; 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_bs
 ; 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
-;
-; 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
+; 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
+;
+; 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
-;
-; CHECK64-LABEL: load_i32_by_bswap_i16:
-; CHECK64:       # BB#0:
-; CHECK64-NEXT:    movl (%rdi), %eax
-; CHECK64-NEXT:    bswapl %eax
-; CHECK64-NEXT:    retq
-
-
+; 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
+;
+; 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)




More information about the llvm-commits mailing list