-
Notifications
You must be signed in to change notification settings - Fork 12k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DAGCombiner] Add test exposing bug in DAG combine.
Adds a test in X86, exposing a bug in DAG combine eliminating stores that are the same value but no the same address space. Differential Revision: https://reviews.llvm.org/D102243
- Loading branch information
Hendrik Greving
committed
May 12, 2021
1 parent
3fa6510
commit 4b00ffa
Showing
1 changed file
with
87 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s | ||
|
||
; Checks that the stores aren't eliminated by the DAG combiner, because the address | ||
; spaces are different. In X86, we're checking this for the non-zero address space :fs. | ||
; The test's 'same' and 'diff' notation depicts whether the pointer value is the same | ||
; or different. | ||
|
||
; FIXME: DAG combine incorrectly eliminates store if pointer is of same value. | ||
|
||
define i32 @copy_fs_same() { | ||
; CHECK-LABEL: copy_fs_same: | ||
; CHECK: # %bb.0: # %entry | ||
; CHECK-NEXT: movl 1, %eax | ||
; CHECK-NEXT: retl | ||
entry: | ||
%0 = load i32, i32* inttoptr (i64 1 to i32*), align 4 | ||
store i32 %0, i32 addrspace(257)* inttoptr (i64 1 to i32 addrspace(257)*), align 4 | ||
ret i32 %0 | ||
} | ||
|
||
define i32 @copy_fs_diff() { | ||
; CHECK-LABEL: copy_fs_diff: | ||
; CHECK: # %bb.0: # %entry | ||
; CHECK-NEXT: movl 1, %eax | ||
; CHECK-NEXT: movl %eax, %fs:2 | ||
; CHECK-NEXT: retl | ||
entry: | ||
%0 = load i32, i32* inttoptr (i64 1 to i32*), align 4 | ||
store i32 %0, i32 addrspace(257)* inttoptr (i64 2 to i32 addrspace(257)*), align 4 | ||
ret i32 %0 | ||
} | ||
|
||
define void @output_fs_same(i32 %v) { | ||
; CHECK-LABEL: output_fs_same: | ||
; CHECK: # %bb.0: # %entry | ||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax | ||
; CHECK-NEXT: movl %eax, 1 | ||
; CHECK-NEXT: retl | ||
entry: | ||
store i32 %v, i32* inttoptr (i64 1 to i32*), align 4 | ||
store i32 %v, i32 addrspace(257)* inttoptr (i64 1 to i32 addrspace(257)*), align 4 | ||
ret void | ||
} | ||
|
||
define void @output_fs_diff(i32 %v) { | ||
; CHECK-LABEL: output_fs_diff: | ||
; CHECK: # %bb.0: # %entry | ||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax | ||
; CHECK-NEXT: movl %eax, 1 | ||
; CHECK-NEXT: movl %eax, %fs:2 | ||
; CHECK-NEXT: retl | ||
entry: | ||
store i32 %v, i32* inttoptr (i64 1 to i32*), align 4 | ||
store i32 %v, i32 addrspace(257)* inttoptr (i64 2 to i32 addrspace(257)*), align 4 | ||
ret void | ||
} | ||
|
||
define void @output_indexed_fs_same(i32 %v, i32* %b) { | ||
; CHECK-LABEL: output_indexed_fs_same: | ||
; CHECK: # %bb.0: | ||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax | ||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx | ||
; CHECK-NEXT: movl %eax, 168(%ecx) | ||
; CHECK-NEXT: retl | ||
%p = getelementptr i32, i32* %b, i64 42 | ||
%pa = addrspacecast i32* %p to i32 addrspace(257)* | ||
store i32 %v, i32* %p, align 4 | ||
store i32 %v, i32 addrspace(257)* %pa, align 4 | ||
ret void | ||
} | ||
|
||
define void @output_indexed_fs_diff(i32 %v, i32* %b) { | ||
; CHECK-LABEL: output_indexed_fs_diff: | ||
; CHECK: # %bb.0: | ||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax | ||
; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx | ||
; CHECK-NEXT: movl %eax, 168(%ecx) | ||
; CHECK-NEXT: movl %eax, %fs:184(%ecx) | ||
; CHECK-NEXT: retl | ||
%p = getelementptr i32, i32* %b, i64 42 | ||
%pa = addrspacecast i32* %p to i32 addrspace(257)* | ||
%pad = getelementptr i32, i32 addrspace(257)* %pa, i64 4 | ||
store i32 %v, i32* %p, align 4 | ||
store i32 %v, i32 addrspace(257)* %pad, align 4 | ||
ret void | ||
} |