diff options
author | Ewan Crawford <ewan@codeplay.com> | 2018-10-08 08:40:45 +0000 |
---|---|---|
committer | Ewan Crawford <ewan@codeplay.com> | 2018-10-08 08:40:45 +0000 |
commit | fa120cbdbc66935dbe41e4fcc76030d50a2692d4 (patch) | |
tree | 5bbd37832c13ff4aaca324a2b8424d3adfec1174 /llvm/lib/Target | |
parent | f27c67af12143fe914ef96f0fb4c6790c7c033c4 (diff) | |
download | bcm5719-llvm-fa120cbdbc66935dbe41e4fcc76030d50a2692d4.tar.gz bcm5719-llvm-fa120cbdbc66935dbe41e4fcc76030d50a2692d4.zip |
[InstCombine] Fix incongruous GEP type addrspace
Currently running the @insertelem_after_gep function below through the InstCombine pass with opt produces invalid IR.
Input:
```
define void @insertelem_after_gep(<16 x i32>* %t0) {
%t1 = bitcast <16 x i32>* %t0 to [16 x i32]*
%t2 = addrspacecast [16 x i32]* %t1 to [16 x i32] addrspace(3)*
%t3 = getelementptr inbounds [16 x i32], [16 x i32] addrspace(3)* %t2, i64 0, i64 0
%t4 = insertelement <16 x i32 addrspace(3)*> undef, i32 addrspace(3)* %t3, i32 0
call void @extern_vec_pointers_func(<16 x i32 addrspace(3)*> %t4)
ret void
}
```
Output:
```
define void @insertelem_after_gep(<16 x i32>* %t0) {
%t3 = getelementptr inbounds <16 x i32>, <16 x i32>* %t0, i64 0, i64 0
%t4 = insertelement <16 x i32 addrspace(3)*> undef, i32 addrspace(3)* %t3, i32 0
call void @my_extern_func(<16 x i32 addrspace(3)*> %t4)
ret void
}
```
Which although causes no complaints when produced, isn't valid IR as the insertelement use of the %t3 GEP expects an address space.
```
opt: /tmp/bad.ll:52:73: error: '%t3' defined with type 'i32*' but expected 'i32 addrspace(3)*'
%t4 = insertelement <16 x i32 addrspace(3)*> undef, i32 addrspace(3)* %t3, i32 0
```
I've fixed this by adding an addrspacecast after the GEP in the InstCombine pass, and including a check for this type mismatch to the verifier.
Reviewers: spatel, lebedev.ri
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D52294
llvm-svn: 343956
Diffstat (limited to 'llvm/lib/Target')
0 files changed, 0 insertions, 0 deletions