When we simplify at least one operand in the Attributor simplification we can use the InstSimplify to work on the simplified operands. This allows us to avoid duplication of the logic. Depends on D106189 Differential Revision: https://reviews.llvm.org/D106190
51 lines
1.5 KiB
LLVM
51 lines
1.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
|
|
; Check that when argument promotion changes a function in some parent node of
|
|
; the call graph, any analyses that happened to be cached for that function are
|
|
; actually invalidated. We are using `demanded-bits` here because when printed
|
|
; it will end up caching a value for every instruction, making it easy to
|
|
; detect the instruction-level changes that will fail here. With improper
|
|
; invalidation this will crash in the second printer as it tries to reuse
|
|
; now-invalid demanded bits.
|
|
;
|
|
; RUN: opt < %s -passes='function(print<demanded-bits>),attributor,function(print<demanded-bits>)' -S | FileCheck %s
|
|
|
|
@G = constant i32 0
|
|
|
|
;.
|
|
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = constant i32 0
|
|
;.
|
|
define internal i32 @a(i32* %x) {
|
|
entry:
|
|
%v = load i32, i32* %x
|
|
ret i32 %v
|
|
}
|
|
|
|
define i32 @b() {
|
|
; CHECK: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
; CHECK-LABEL: define {{[^@]+}}@b
|
|
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: ret i32 0
|
|
;
|
|
entry:
|
|
%v = call i32 @a(i32* @G)
|
|
ret i32 %v
|
|
}
|
|
|
|
define i32 @c() {
|
|
; CHECK: Function Attrs: nofree nosync nounwind readnone willreturn
|
|
; CHECK-LABEL: define {{[^@]+}}@c
|
|
; CHECK-SAME: () #[[ATTR0]] {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: ret i32 0
|
|
;
|
|
entry:
|
|
%v1 = call i32 @a(i32* @G)
|
|
%v2 = call i32 @b()
|
|
%result = add i32 %v1, %v2
|
|
ret i32 %result
|
|
}
|
|
;.
|
|
; CHECK: attributes #[[ATTR0]] = { nofree nosync nounwind readnone willreturn }
|
|
;.
|