mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[InstCombine] drop poison flags in SimplifyVectorDemandedElts
We established the (unfortunately complicated) rules for UB/poison propagation with vector ops in: D48893 D48987 D49047 It's clear from the affected tests that we are potentially creating poison where none existed before the transforms. For add/sub/mul, the answer is simple: just drop the flags because the extra undef vector lanes are generally more valuable for analysis and codegen. llvm-svn: 343819
This commit is contained in:
parent
c3846919b0
commit
091a0f0213
@ -1592,8 +1592,11 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,
|
||||
simplifyAndSetOp(I, 0, DemandedElts, UndefElts);
|
||||
simplifyAndSetOp(I, 1, DemandedElts, UndefElts2);
|
||||
|
||||
// TODO: If this is a potentially poison-producing instruction, we need
|
||||
// to drop the wrapping/exact flags?
|
||||
// Any change to an instruction with potential poison must clear those flags
|
||||
// because we can not guarantee those constraints now. Other analysis may
|
||||
// determine that it is safe to re-apply the flags.
|
||||
if (MadeChange)
|
||||
BO->dropPoisonGeneratingFlags();
|
||||
|
||||
// Output elements are undefined if both are undefined. Consider things
|
||||
// like undef & 0. The result is known zero, not undef.
|
||||
|
@ -165,7 +165,7 @@ define <2 x i64> @test_demanded_elts_pmuludq_128(<4 x i32> %a0, <4 x i32> %a1) {
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i32> [[TMP2]] to <2 x i64>
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = and <2 x i64> [[TMP3]], <i64 4294967295, i64 undef>
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = and <2 x i64> [[TMP4]], <i64 4294967295, i64 undef>
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = mul nuw <2 x i64> [[TMP5]], [[TMP6]]
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = mul <2 x i64> [[TMP5]], [[TMP6]]
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <2 x i64> [[TMP7]], <2 x i64> undef, <2 x i32> zeroinitializer
|
||||
; CHECK-NEXT: ret <2 x i64> [[TMP8]]
|
||||
;
|
||||
|
@ -1413,7 +1413,7 @@ define <4 x i8> @or_add_not_enough_masking(<4 x i8> %v) {
|
||||
; CHECK-LABEL: @or_add_not_enough_masking(
|
||||
; CHECK-NEXT: [[V0:%.*]] = lshr <4 x i8> [[V:%.*]], <i8 1, i8 1, i8 1, i8 1>
|
||||
; CHECK-NEXT: [[T1:%.*]] = or <4 x i8> [[V0]], <i8 undef, i8 undef, i8 -64, i8 -64>
|
||||
; CHECK-NEXT: [[T2:%.*]] = add nuw nsw <4 x i8> [[V0]], <i8 1, i8 2, i8 undef, i8 undef>
|
||||
; CHECK-NEXT: [[T2:%.*]] = add <4 x i8> [[V0]], <i8 1, i8 2, i8 undef, i8 undef>
|
||||
; CHECK-NEXT: [[T3:%.*]] = shufflevector <4 x i8> [[T1]], <4 x i8> [[T2]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>
|
||||
; CHECK-NEXT: ret <4 x i8> [[T3]]
|
||||
;
|
||||
|
@ -202,7 +202,7 @@ define <4 x float> @inselt_shuf_no_demand_bogus_insert_index_in_chain(float %a1,
|
||||
|
||||
define <3 x i8> @shuf_add(<3 x i8> %x) {
|
||||
; CHECK-LABEL: @shuf_add(
|
||||
; CHECK-NEXT: [[BO:%.*]] = add nsw <3 x i8> [[X:%.*]], <i8 undef, i8 2, i8 3>
|
||||
; CHECK-NEXT: [[BO:%.*]] = add <3 x i8> [[X:%.*]], <i8 undef, i8 2, i8 3>
|
||||
; CHECK-NEXT: [[R:%.*]] = shufflevector <3 x i8> [[BO]], <3 x i8> undef, <3 x i32> <i32 1, i32 undef, i32 2>
|
||||
; CHECK-NEXT: ret <3 x i8> [[R]]
|
||||
;
|
||||
@ -213,7 +213,7 @@ define <3 x i8> @shuf_add(<3 x i8> %x) {
|
||||
|
||||
define <3 x i8> @shuf_sub(<3 x i8> %x) {
|
||||
; CHECK-LABEL: @shuf_sub(
|
||||
; CHECK-NEXT: [[BO:%.*]] = sub nuw <3 x i8> <i8 1, i8 undef, i8 3>, [[X:%.*]]
|
||||
; CHECK-NEXT: [[BO:%.*]] = sub <3 x i8> <i8 1, i8 undef, i8 3>, [[X:%.*]]
|
||||
; CHECK-NEXT: ret <3 x i8> [[BO]]
|
||||
;
|
||||
%bo = sub nuw <3 x i8> <i8 1, i8 2, i8 3>, %x
|
||||
@ -223,7 +223,7 @@ define <3 x i8> @shuf_sub(<3 x i8> %x) {
|
||||
|
||||
define <3 x i8> @shuf_mul(<3 x i8> %x) {
|
||||
; CHECK-LABEL: @shuf_mul(
|
||||
; CHECK-NEXT: [[BO:%.*]] = mul nsw <3 x i8> [[X:%.*]], <i8 1, i8 undef, i8 3>
|
||||
; CHECK-NEXT: [[BO:%.*]] = mul <3 x i8> [[X:%.*]], <i8 1, i8 undef, i8 3>
|
||||
; CHECK-NEXT: [[R:%.*]] = shufflevector <3 x i8> [[BO]], <3 x i8> undef, <3 x i32> <i32 0, i32 2, i32 0>
|
||||
; CHECK-NEXT: ret <3 x i8> [[R]]
|
||||
;
|
||||
|
Loading…
x
Reference in New Issue
Block a user