mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
8956cdfa58
Currently ArgPromotion removes dead GEPs as part of the legality check in isSafeToPromoteArgument. If no promotion happens, this means the pass claims no modifications happened, even though GEPs were removed. This patch fixes the issue by delaying removal of dead GEPs until doPromotion: isSafeToPromoteArgument can simply skips dead GEPs and the code in doPromotion dealing with GEPs is updated to account for dead GEPs. Once we committed to promotion, it should be safe to remove dead GEPs. Alternatively isSafeToPromoteArgument could return an additional boolean to indicate whether it made changes, but this is quite cumbersome and there should be no real benefit of weeding out some dead GEPs here if we do not perform promotion. I added a test for the case where dead GEPs need to be removed when promotion happens in 578c5a0c6e71. Fixes PR47477. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D93991
31 lines
1.1 KiB
LLVM
31 lines
1.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -argpromotion -S %s | FileCheck %s
|
|
|
|
@glob = external global i32*
|
|
|
|
; No arguments in @callee can be promoted, but it contains a dead GEP. Make
|
|
; sure it is not removed, as we do not perform any promotion.
|
|
define i32 @caller(i32* %ptr) {
|
|
; CHECK-LABEL: @caller(
|
|
; CHECK-NEXT: call void @callee(i32* [[PTR:%.*]], i32* [[PTR]], i32* [[PTR]])
|
|
; CHECK-NEXT: ret i32 0
|
|
;
|
|
call void @callee(i32* %ptr, i32* %ptr, i32* %ptr)
|
|
ret i32 0
|
|
}
|
|
|
|
define internal void @callee(i32* %arg, i32* %arg1, i32* %arg2) {
|
|
; CHECK-LABEL: define internal void @callee(
|
|
; CHECK-NEXT: call void @external_fn(i32* [[ARG:%.*]], i32* [[ARG1:%.*]])
|
|
; CHECK-NEXT: [[DEAD_GEP:%.*]] = getelementptr inbounds i32, i32* [[ARG1]], i32 17
|
|
; CHECK-NEXT: store i32* [[ARG2:%.*]], i32** @glob, align 8
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @external_fn(i32* %arg, i32* %arg1)
|
|
%dead.gep = getelementptr inbounds i32, i32* %arg1, i32 17
|
|
store i32* %arg2, i32** @glob, align 8
|
|
ret void
|
|
}
|
|
|
|
declare void @external_fn(i32*, i32*)
|