forked from OSchip/llvm-project
[Tests] Update to newer ISA
There are some issues w/missed opts on older platforms, but that's not the purpose of this test. Using a newer API points out that some TODOs are already handled, and allows addition of tests to exercise other issues (future patch.) llvm-svn: 356473
This commit is contained in:
parent
4f680db257
commit
376c87fcd4
|
@ -1,6 +1,6 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -O0 < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=sse2 | FileCheck --check-prefix=CHECK-O0 %s
|
||||
; RUN: llc -O3 < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mattr=sse2 | FileCheck --check-prefix=CHECK-O3 %s
|
||||
; RUN: llc -O0 < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mcpu=skylake | FileCheck --check-prefix=CHECK-O0 %s
|
||||
; RUN: llc -O3 < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mcpu=skylake | FileCheck --check-prefix=CHECK-O3 %s
|
||||
|
||||
define i8 @load_i8(i8* %ptr) {
|
||||
; CHECK-O0-LABEL: load_i8:
|
||||
|
@ -276,18 +276,16 @@ define void @widen_broadcast_unaligned(i32* %p0, i32 %v) {
|
|||
define void @vec_store(i32* %p0, <2 x i32> %vec) {
|
||||
; CHECK-O0-LABEL: vec_store:
|
||||
; CHECK-O0: # %bb.0:
|
||||
; CHECK-O0-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
|
||||
; CHECK-O0-NEXT: movd %xmm0, %ecx
|
||||
; CHECK-O0-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: vpextrd $2, %xmm0, %ecx
|
||||
; CHECK-O0-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O0-NEXT: movl %ecx, 4(%rdi)
|
||||
; CHECK-O0-NEXT: retq
|
||||
;
|
||||
; CHECK-O3-LABEL: vec_store:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
|
||||
; CHECK-O3-NEXT: movd %xmm0, %ecx
|
||||
; CHECK-O3-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: vpextrd $2, %xmm0, %ecx
|
||||
; CHECK-O3-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O3-NEXT: movl %ecx, 4(%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
|
@ -303,18 +301,16 @@ define void @vec_store(i32* %p0, <2 x i32> %vec) {
|
|||
define void @vec_store_unaligned(i32* %p0, <2 x i32> %vec) {
|
||||
; CHECK-O0-LABEL: vec_store_unaligned:
|
||||
; CHECK-O0: # %bb.0:
|
||||
; CHECK-O0-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
|
||||
; CHECK-O0-NEXT: movd %xmm0, %ecx
|
||||
; CHECK-O0-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: vpextrd $2, %xmm0, %ecx
|
||||
; CHECK-O0-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O0-NEXT: movl %ecx, 4(%rdi)
|
||||
; CHECK-O0-NEXT: retq
|
||||
;
|
||||
; CHECK-O3-LABEL: vec_store_unaligned:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
|
||||
; CHECK-O3-NEXT: movd %xmm0, %ecx
|
||||
; CHECK-O3-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: vpextrd $2, %xmm0, %ecx
|
||||
; CHECK-O3-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O3-NEXT: movl %ecx, 4(%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
|
@ -333,14 +329,14 @@ define void @vec_store_unaligned(i32* %p0, <2 x i32> %vec) {
|
|||
define void @widen_broadcast2(i32* %p0, <2 x i32> %vec) {
|
||||
; CHECK-O0-LABEL: widen_broadcast2:
|
||||
; CHECK-O0: # %bb.0:
|
||||
; CHECK-O0-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O0-NEXT: movl %eax, 4(%rdi)
|
||||
; CHECK-O0-NEXT: retq
|
||||
;
|
||||
; CHECK-O3-LABEL: widen_broadcast2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O3-NEXT: movl %eax, 4(%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
|
@ -355,14 +351,14 @@ define void @widen_broadcast2(i32* %p0, <2 x i32> %vec) {
|
|||
define void @widen_broadcast2_unaligned(i32* %p0, <2 x i32> %vec) {
|
||||
; CHECK-O0-LABEL: widen_broadcast2_unaligned:
|
||||
; CHECK-O0: # %bb.0:
|
||||
; CHECK-O0-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O0-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O0-NEXT: movl %eax, 4(%rdi)
|
||||
; CHECK-O0-NEXT: retq
|
||||
;
|
||||
; CHECK-O3-LABEL: widen_broadcast2_unaligned:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: vmovd %xmm0, %eax
|
||||
; CHECK-O3-NEXT: movl %eax, (%rdi)
|
||||
; CHECK-O3-NEXT: movl %eax, 4(%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
|
@ -622,8 +618,19 @@ define i64 @load_fold_sdiv2(i64* %p, i64 %v2) {
|
|||
; CHECK-O3-LABEL: load_fold_sdiv2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB31_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: cqto
|
||||
; CHECK-O3-NEXT: idivq %rsi
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB31_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p unordered, align 8
|
||||
%ret = sdiv i64 %v, %v2
|
||||
|
@ -641,8 +648,20 @@ define i64 @load_fold_sdiv3(i64* %p1, i64* %p2) {
|
|||
; CHECK-O3-LABEL: load_fold_sdiv3:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rcx
|
||||
; CHECK-O3-NEXT: movq %rax, %rdx
|
||||
; CHECK-O3-NEXT: orq %rcx, %rdx
|
||||
; CHECK-O3-NEXT: shrq $32, %rdx
|
||||
; CHECK-O3-NEXT: je .LBB32_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: cqto
|
||||
; CHECK-O3-NEXT: idivq (%rsi)
|
||||
; CHECK-O3-NEXT: idivq %rcx
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB32_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %ecx
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p1 unordered, align 8
|
||||
%v2 = load atomic i64, i64* %p2 unordered, align 8
|
||||
|
@ -686,8 +705,19 @@ define i64 @load_fold_udiv2(i64* %p, i64 %v2) {
|
|||
; CHECK-O3-LABEL: load_fold_udiv2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB34_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divq %rsi
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB34_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p unordered, align 8
|
||||
%ret = udiv i64 %v, %v2
|
||||
|
@ -706,8 +736,20 @@ define i64 @load_fold_udiv3(i64* %p1, i64* %p2) {
|
|||
; CHECK-O3-LABEL: load_fold_udiv3:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rcx
|
||||
; CHECK-O3-NEXT: movq %rax, %rdx
|
||||
; CHECK-O3-NEXT: orq %rcx, %rdx
|
||||
; CHECK-O3-NEXT: shrq $32, %rdx
|
||||
; CHECK-O3-NEXT: je .LBB35_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divq (%rsi)
|
||||
; CHECK-O3-NEXT: divq %rcx
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB35_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %ecx
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p1 unordered, align 8
|
||||
%v2 = load atomic i64, i64* %p2 unordered, align 8
|
||||
|
@ -760,9 +802,20 @@ define i64 @load_fold_srem2(i64* %p, i64 %v2) {
|
|||
; CHECK-O3-LABEL: load_fold_srem2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB37_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: cqto
|
||||
; CHECK-O3-NEXT: idivq %rsi
|
||||
; CHECK-O3-NEXT: movq %rdx, %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB37_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: movl %edx, %eax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p unordered, align 8
|
||||
%ret = srem i64 %v, %v2
|
||||
|
@ -781,9 +834,21 @@ define i64 @load_fold_srem3(i64* %p1, i64* %p2) {
|
|||
; CHECK-O3-LABEL: load_fold_srem3:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rcx
|
||||
; CHECK-O3-NEXT: movq %rax, %rdx
|
||||
; CHECK-O3-NEXT: orq %rcx, %rdx
|
||||
; CHECK-O3-NEXT: shrq $32, %rdx
|
||||
; CHECK-O3-NEXT: je .LBB38_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: cqto
|
||||
; CHECK-O3-NEXT: idivq (%rsi)
|
||||
; CHECK-O3-NEXT: idivq %rcx
|
||||
; CHECK-O3-NEXT: movq %rdx, %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB38_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %ecx
|
||||
; CHECK-O3-NEXT: movl %edx, %eax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p1 unordered, align 8
|
||||
%v2 = load atomic i64, i64* %p2 unordered, align 8
|
||||
|
@ -834,9 +899,20 @@ define i64 @load_fold_urem2(i64* %p, i64 %v2) {
|
|||
; CHECK-O3-LABEL: load_fold_urem2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB40_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divq %rsi
|
||||
; CHECK-O3-NEXT: movq %rdx, %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB40_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: movl %edx, %eax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p unordered, align 8
|
||||
%ret = urem i64 %v, %v2
|
||||
|
@ -856,9 +932,21 @@ define i64 @load_fold_urem3(i64* %p1, i64* %p2) {
|
|||
; CHECK-O3-LABEL: load_fold_urem3:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rcx
|
||||
; CHECK-O3-NEXT: movq %rax, %rdx
|
||||
; CHECK-O3-NEXT: orq %rcx, %rdx
|
||||
; CHECK-O3-NEXT: shrq $32, %rdx
|
||||
; CHECK-O3-NEXT: je .LBB41_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divq (%rsi)
|
||||
; CHECK-O3-NEXT: divq %rcx
|
||||
; CHECK-O3-NEXT: movq %rdx, %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB41_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %ecx
|
||||
; CHECK-O3-NEXT: movl %edx, %eax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p1 unordered, align 8
|
||||
%v2 = load atomic i64, i64* %p2 unordered, align 8
|
||||
|
@ -885,7 +973,6 @@ define i64 @load_fold_shl1(i64* %p) {
|
|||
ret i64 %ret
|
||||
}
|
||||
|
||||
; Legal to fold (TODO)
|
||||
define i64 @load_fold_shl2(i64* %p, i64 %v2) {
|
||||
; CHECK-O0-LABEL: load_fold_shl2:
|
||||
; CHECK-O0: # %bb.0:
|
||||
|
@ -898,17 +985,13 @@ define i64 @load_fold_shl2(i64* %p, i64 %v2) {
|
|||
;
|
||||
; CHECK-O3-LABEL: load_fold_shl2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: shlq %cl, %rax
|
||||
; CHECK-O3-NEXT: shlxq %rsi, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p unordered, align 8
|
||||
%ret = shl i64 %v, %v2
|
||||
ret i64 %ret
|
||||
}
|
||||
|
||||
; Legal to fold (TODO)
|
||||
define i64 @load_fold_shl3(i64* %p1, i64* %p2) {
|
||||
; CHECK-O0-LABEL: load_fold_shl3:
|
||||
; CHECK-O0: # %bb.0:
|
||||
|
@ -921,10 +1004,8 @@ define i64 @load_fold_shl3(i64* %p1, i64* %p2) {
|
|||
;
|
||||
; CHECK-O3-LABEL: load_fold_shl3:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rcx
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: shlq %cl, %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rax
|
||||
; CHECK-O3-NEXT: shlxq %rax, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p1 unordered, align 8
|
||||
%v2 = load atomic i64, i64* %p2 unordered, align 8
|
||||
|
@ -951,7 +1032,6 @@ define i64 @load_fold_lshr1(i64* %p) {
|
|||
ret i64 %ret
|
||||
}
|
||||
|
||||
; Legal to fold (TODO)
|
||||
define i64 @load_fold_lshr2(i64* %p, i64 %v2) {
|
||||
; CHECK-O0-LABEL: load_fold_lshr2:
|
||||
; CHECK-O0: # %bb.0:
|
||||
|
@ -964,17 +1044,13 @@ define i64 @load_fold_lshr2(i64* %p, i64 %v2) {
|
|||
;
|
||||
; CHECK-O3-LABEL: load_fold_lshr2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: shrq %cl, %rax
|
||||
; CHECK-O3-NEXT: shrxq %rsi, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p unordered, align 8
|
||||
%ret = lshr i64 %v, %v2
|
||||
ret i64 %ret
|
||||
}
|
||||
|
||||
; Legal to fold (TODO)
|
||||
define i64 @load_fold_lshr3(i64* %p1, i64* %p2) {
|
||||
; CHECK-O0-LABEL: load_fold_lshr3:
|
||||
; CHECK-O0: # %bb.0:
|
||||
|
@ -987,10 +1063,8 @@ define i64 @load_fold_lshr3(i64* %p1, i64* %p2) {
|
|||
;
|
||||
; CHECK-O3-LABEL: load_fold_lshr3:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rcx
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: shrq %cl, %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rax
|
||||
; CHECK-O3-NEXT: shrxq %rax, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p1 unordered, align 8
|
||||
%v2 = load atomic i64, i64* %p2 unordered, align 8
|
||||
|
@ -1017,7 +1091,6 @@ define i64 @load_fold_ashr1(i64* %p) {
|
|||
ret i64 %ret
|
||||
}
|
||||
|
||||
; Legal to fold (TODO)
|
||||
define i64 @load_fold_ashr2(i64* %p, i64 %v2) {
|
||||
; CHECK-O0-LABEL: load_fold_ashr2:
|
||||
; CHECK-O0: # %bb.0:
|
||||
|
@ -1030,17 +1103,13 @@ define i64 @load_fold_ashr2(i64* %p, i64 %v2) {
|
|||
;
|
||||
; CHECK-O3-LABEL: load_fold_ashr2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: sarq %cl, %rax
|
||||
; CHECK-O3-NEXT: sarxq %rsi, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p unordered, align 8
|
||||
%ret = ashr i64 %v, %v2
|
||||
ret i64 %ret
|
||||
}
|
||||
|
||||
; Legal to fold (TODO)
|
||||
define i64 @load_fold_ashr3(i64* %p1, i64* %p2) {
|
||||
; CHECK-O0-LABEL: load_fold_ashr3:
|
||||
; CHECK-O0: # %bb.0:
|
||||
|
@ -1053,10 +1122,8 @@ define i64 @load_fold_ashr3(i64* %p1, i64* %p2) {
|
|||
;
|
||||
; CHECK-O3-LABEL: load_fold_ashr3:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rcx
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: sarq %cl, %rax
|
||||
; CHECK-O3-NEXT: movq (%rsi), %rax
|
||||
; CHECK-O3-NEXT: sarxq %rax, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: retq
|
||||
%v = load atomic i64, i64* %p1 unordered, align 8
|
||||
%v2 = load atomic i64, i64* %p2 unordered, align 8
|
||||
|
@ -1467,9 +1534,21 @@ define void @rmw_fold_sdiv2(i64* %p, i64 %v) {
|
|||
; CHECK-O3-LABEL: rmw_fold_sdiv2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB70_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: cqto
|
||||
; CHECK-O3-NEXT: idivq %rsi
|
||||
; CHECK-O3-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB70_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
|
||||
; CHECK-O3-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
%prev = load atomic i64, i64* %p unordered, align 8
|
||||
%val = sdiv i64 %prev, %v
|
||||
|
@ -1517,9 +1596,21 @@ define void @rmw_fold_udiv2(i64* %p, i64 %v) {
|
|||
; CHECK-O3-LABEL: rmw_fold_udiv2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB72_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divq %rsi
|
||||
; CHECK-O3-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB72_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
|
||||
; CHECK-O3-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
%prev = load atomic i64, i64* %p unordered, align 8
|
||||
%val = udiv i64 %prev, %v
|
||||
|
@ -1583,9 +1674,21 @@ define void @rmw_fold_srem2(i64* %p, i64 %v) {
|
|||
; CHECK-O3-LABEL: rmw_fold_srem2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB74_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: cqto
|
||||
; CHECK-O3-NEXT: idivq %rsi
|
||||
; CHECK-O3-NEXT: movq %rdx, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB74_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: # kill: def $edx killed $edx def $rdx
|
||||
; CHECK-O3-NEXT: movq %rdx, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
%prev = load atomic i64, i64* %p unordered, align 8
|
||||
%val = srem i64 %prev, %v
|
||||
|
@ -1642,9 +1745,21 @@ define void @rmw_fold_urem2(i64* %p, i64 %v) {
|
|||
; CHECK-O3-LABEL: rmw_fold_urem2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, %rcx
|
||||
; CHECK-O3-NEXT: orq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: shrq $32, %rcx
|
||||
; CHECK-O3-NEXT: je .LBB76_1
|
||||
; CHECK-O3-NEXT: # %bb.2:
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divq %rsi
|
||||
; CHECK-O3-NEXT: movq %rdx, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
; CHECK-O3-NEXT: .LBB76_1:
|
||||
; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
|
||||
; CHECK-O3-NEXT: xorl %edx, %edx
|
||||
; CHECK-O3-NEXT: divl %esi
|
||||
; CHECK-O3-NEXT: # kill: def $edx killed $edx def $rdx
|
||||
; CHECK-O3-NEXT: movq %rdx, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
%prev = load atomic i64, i64* %p unordered, align 8
|
||||
%val = urem i64 %prev, %v
|
||||
|
@ -1680,16 +1795,15 @@ define void @rmw_fold_shl2(i64* %p, i64 %v) {
|
|||
; CHECK-O0: # %bb.0:
|
||||
; CHECK-O0-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O0-NEXT: movb %sil, %cl
|
||||
; CHECK-O0-NEXT: shlq %cl, %rax
|
||||
; CHECK-O0-NEXT: # implicit-def: $rsi
|
||||
; CHECK-O0-NEXT: movb %cl, %sil
|
||||
; CHECK-O0-NEXT: shlxq %rsi, %rax, %rax
|
||||
; CHECK-O0-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O0-NEXT: retq
|
||||
;
|
||||
; CHECK-O3-LABEL: rmw_fold_shl2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: shlq %cl, %rax
|
||||
; CHECK-O3-NEXT: shlxq %rsi, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
%prev = load atomic i64, i64* %p unordered, align 8
|
||||
|
@ -1726,16 +1840,15 @@ define void @rmw_fold_lshr2(i64* %p, i64 %v) {
|
|||
; CHECK-O0: # %bb.0:
|
||||
; CHECK-O0-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O0-NEXT: movb %sil, %cl
|
||||
; CHECK-O0-NEXT: shrq %cl, %rax
|
||||
; CHECK-O0-NEXT: # implicit-def: $rsi
|
||||
; CHECK-O0-NEXT: movb %cl, %sil
|
||||
; CHECK-O0-NEXT: shrxq %rsi, %rax, %rax
|
||||
; CHECK-O0-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O0-NEXT: retq
|
||||
;
|
||||
; CHECK-O3-LABEL: rmw_fold_lshr2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: shrq %cl, %rax
|
||||
; CHECK-O3-NEXT: shrxq %rsi, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
%prev = load atomic i64, i64* %p unordered, align 8
|
||||
|
@ -1772,16 +1885,15 @@ define void @rmw_fold_ashr2(i64* %p, i64 %v) {
|
|||
; CHECK-O0: # %bb.0:
|
||||
; CHECK-O0-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O0-NEXT: movb %sil, %cl
|
||||
; CHECK-O0-NEXT: sarq %cl, %rax
|
||||
; CHECK-O0-NEXT: # implicit-def: $rsi
|
||||
; CHECK-O0-NEXT: movb %cl, %sil
|
||||
; CHECK-O0-NEXT: sarxq %rsi, %rax, %rax
|
||||
; CHECK-O0-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O0-NEXT: retq
|
||||
;
|
||||
; CHECK-O3-LABEL: rmw_fold_ashr2:
|
||||
; CHECK-O3: # %bb.0:
|
||||
; CHECK-O3-NEXT: movq %rsi, %rcx
|
||||
; CHECK-O3-NEXT: movq (%rdi), %rax
|
||||
; CHECK-O3-NEXT: # kill: def $cl killed $cl killed $rcx
|
||||
; CHECK-O3-NEXT: sarq %cl, %rax
|
||||
; CHECK-O3-NEXT: sarxq %rsi, (%rdi), %rax
|
||||
; CHECK-O3-NEXT: movq %rax, (%rdi)
|
||||
; CHECK-O3-NEXT: retq
|
||||
%prev = load atomic i64, i64* %p unordered, align 8
|
||||
|
|
Loading…
Reference in New Issue