[PATCH] D124228: [NFC][NewGVN][LoadCoercion] Add new tests for future commit
Jay Foad via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 15 04:25:30 PDT 2022
foad added a comment.
In D124228#3583946 <https://reviews.llvm.org/D124228#3583946>, @kmitropoulou wrote:
> In D124228#3577317 <https://reviews.llvm.org/D124228#3577317>, @foad wrote:
>
>> LGTM. Could also use a common "GVN" prefix if you want (and if there are any tests at all where old and new gvn produce the same result).
>
> I am not sure what you mean. The old and new GVN might not have exactly the same output for load coercion e.g. in https://reviews.llvm.org/D124230 - test5, test 6 and test8 .
I mean if you write the RUN lines like this then update_test_checks is clever enough to use the GVN prefix if both passes produce identical results for a particular function, or separate OLDGVN and NEWGVN and prefixes if they produce different results:
; RUN: opt -S -gvn < %s | FileCheck %s -check-prefixes=GVN,OLDGVN
; RUN: opt -S -newgvn < %s | FileCheck %s -check-prefixes=GVN,NEWGVN
For example, at the moment I get different results on test1:
define i8 @test1(i32* %P1) {
; OLDGVN-LABEL: @test1(
; OLDGVN-NEXT: [[V1:%.*]] = load i32, i32* [[P1:%.*]], align 4
; OLDGVN-NEXT: [[P2:%.*]] = bitcast i32* [[P1]] to i8*
; OLDGVN-NEXT: [[TMP1:%.*]] = trunc i32 [[V1]] to i8
; OLDGVN-NEXT: [[V4:%.*]] = add i8 [[TMP1]], [[TMP1]]
; OLDGVN-NEXT: ret i8 [[V4]]
;
; NEWGVN-LABEL: @test1(
; NEWGVN-NEXT: [[V1:%.*]] = load i32, i32* [[P1:%.*]], align 4
; NEWGVN-NEXT: [[P2:%.*]] = bitcast i32* [[P1]] to i8*
; NEWGVN-NEXT: [[V2:%.*]] = load i8, i8* [[P2]], align 1
; NEWGVN-NEXT: [[V3:%.*]] = trunc i32 [[V1]] to i8
; NEWGVN-NEXT: [[V4:%.*]] = add i8 [[V2]], [[V3]]
; NEWGVN-NEXT: ret i8 [[V4]]
;
%V1 = load i32, i32* %P1
%P2 = bitcast i32* %P1 to i8*
%V2 = load i8, i8* %P2
%V3 = trunc i32 %V1 to i8
%V4 = add i8 %V2, %V3
ret i8 %V4
}
but identical results on test4:
define <{<2 x i32>, i32}> @test4(i8* %P) {
; GVN-LABEL: @test4(
; GVN-NEXT: Entry:
; GVN-NEXT: [[P2:%.*]] = bitcast i8* [[P:%.*]] to i32*
; GVN-NEXT: [[V2:%.*]] = load i32, i32* [[P2]], align 4
; GVN-NEXT: [[P1:%.*]] = bitcast i8* [[P]] to <2 x i32>*
; GVN-NEXT: [[V1:%.*]] = load <2 x i32>, <2 x i32>* [[P1]], align 8
; GVN-NEXT: [[I1:%.*]] = insertvalue <{ <2 x i32>, i32 }> poison, <2 x i32> [[V1]], 0
; GVN-NEXT: [[I2:%.*]] = insertvalue <{ <2 x i32>, i32 }> [[I1]], i32 [[V2]], 1
; GVN-NEXT: ret <{ <2 x i32>, i32 }> [[I2]]
;
Entry:
%P2 = bitcast i8* %P to i32*
%V2 = load i32, i32* %P2
%P1 = bitcast i8* %P to <2 x i32>*
%V1 = load <2 x i32>, <2 x i32>* %P1
%I1 = insertvalue <{<2 x i32>, i32}> poison, <2 x i32> %V1, 0
%I2 = insertvalue <{<2 x i32>, i32}> %I1, i32 %V2, 1
ret <{<2 x i32>, i32}> %I2
}
I think this is nice because it is really easy to see where the remaining differences are.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124228/new/
https://reviews.llvm.org/D124228
More information about the llvm-commits
mailing list