mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-07 19:47:53 +00:00
b3121b5992
This patch fixes the issue noticed in D54532. The problem is that cst_pred_ty-based matchers like m_Zero() currently do not match scalar undefs (as expected), but *do* match vector undefs. This may lead to optimization inconsistencies in rare cases. There is only one existing test for which output changes, reverting the change from D53205. The reason here is that vector fsub undef, %x is no longer matched as an m_FNeg(). While I think that the new output is technically worse than the previous one, it is consistent with scalar, and I don't think it's really important either way (generally that undef should have been folded away prior to reassociation.) I've also added another test case for this issue based on InstructionSimplify. It took some effort to find that one, as in most cases undef folds are either checked first -- and in the cases where they aren't it usually happens to not make a difference in the end. This is the only case I was able to come up with. Prior to this patch the test case simplified to undef in the scalar case, but zeroinitializer in the vector case. Patch by: @nikic (Nikita Popov) Differential Revision: https://reviews.llvm.org/D54631 llvm-svn: 347318
26 lines
699 B
LLVM
26 lines
699 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -instsimplify -S | FileCheck %s
|
|
|
|
; This tests checks optimization consistency for scalar and vector code.
|
|
; If m_Zero() is able to match a vector undef, but not a scalar undef,
|
|
; the two cases will simplify differently.
|
|
|
|
define i32 @test_scalar(i32 %a, i1 %b) {
|
|
; CHECK-LABEL: @test_scalar(
|
|
; CHECK-NEXT: ret i32 undef
|
|
;
|
|
%c = sext i1 %b to i32
|
|
%d = ashr i32 undef, %c
|
|
ret i32 %d
|
|
}
|
|
|
|
define <2 x i32> @test_vector(<2 x i32> %a, <2 x i1> %b) {
|
|
; CHECK-LABEL: @test_vector(
|
|
; CHECK-NEXT: ret <2 x i32> undef
|
|
;
|
|
%c = sext <2 x i1> %b to <2 x i32>
|
|
%d = ashr <2 x i32> undef, %c
|
|
ret <2 x i32> %d
|
|
}
|
|
|