Skip to content

Commit 7463608

Browse files
committed
[InstCombine] Add support for cast instructions in getFreelyInvertedImpl
1 parent 1301481 commit 7463608

File tree

2 files changed

+28
-23
lines changed

2 files changed

+28
-23
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,6 +2387,20 @@ Value *InstCombiner::getFreelyInvertedImpl(Value *V, bool WillInvertAllUses,
23872387
return NonNull;
23882388
}
23892389

2390+
if (match(V, m_SExtLike(m_Value(A)))) {
2391+
if (auto *AV = getFreelyInvertedImpl(A, A->hasOneUse(), Builder,
2392+
DoesConsume, Depth))
2393+
return Builder ? Builder->CreateSExt(AV, V->getType()) : NonNull;
2394+
return nullptr;
2395+
}
2396+
2397+
if (match(V, m_Trunc(m_Value(A)))) {
2398+
if (auto *AV = getFreelyInvertedImpl(A, A->hasOneUse(), Builder,
2399+
DoesConsume, Depth))
2400+
return Builder ? Builder->CreateTrunc(AV, V->getType()) : NonNull;
2401+
return nullptr;
2402+
}
2403+
23902404
return nullptr;
23912405
}
23922406

llvm/test/Transforms/InstCombine/not.ll

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -772,10 +772,9 @@ entry:
772772

773773
define i32 @test_sext(i32 %a, i32 %b){
774774
; CHECK-LABEL: @test_sext(
775-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[A:%.*]], 0
776-
; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[CMP]] to i32
777-
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SEXT]], [[B:%.*]]
778-
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[ADD]], -1
775+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[A:%.*]], 0
776+
; CHECK-NEXT: [[TMP2:%.*]] = sext i1 [[TMP1]] to i32
777+
; CHECK-NEXT: [[NOT:%.*]] = sub i32 [[TMP2]], [[B:%.*]]
779778
; CHECK-NEXT: ret i32 [[NOT]]
780779
;
781780
%cmp = icmp eq i32 %a, 0
@@ -787,10 +786,9 @@ define i32 @test_sext(i32 %a, i32 %b){
787786

788787
define <2 x i32> @test_sext_vec(<2 x i32> %a, <2 x i32> %b){
789788
; CHECK-LABEL: @test_sext_vec(
790-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq <2 x i32> [[A:%.*]], zeroinitializer
791-
; CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[CMP]] to <2 x i32>
792-
; CHECK-NEXT: [[ADD:%.*]] = add <2 x i32> [[SEXT]], [[B:%.*]]
793-
; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i32> [[ADD]], <i32 -1, i32 -1>
789+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i32> [[A:%.*]], zeroinitializer
790+
; CHECK-NEXT: [[TMP2:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i32>
791+
; CHECK-NEXT: [[NOT:%.*]] = sub <2 x i32> [[TMP2]], [[B:%.*]]
794792
; CHECK-NEXT: ret <2 x i32> [[NOT]]
795793
;
796794
%cmp = icmp eq <2 x i32> %a, zeroinitializer
@@ -802,11 +800,10 @@ define <2 x i32> @test_sext_vec(<2 x i32> %a, <2 x i32> %b){
802800

803801
define i64 @test_zext_nneg(i32 %c1, i64 %c2, i64 %c3){
804802
; CHECK-LABEL: @test_zext_nneg(
805-
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[C1:%.*]], -1
806-
; CHECK-NEXT: [[CONV:%.*]] = zext nneg i32 [[NOT]] to i64
807-
; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[C2:%.*]], -5
808-
; CHECK-NEXT: [[ADD2:%.*]] = add i64 [[CONV]], [[C3:%.*]]
809-
; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[ADD1]], [[ADD2]]
803+
; CHECK-NEXT: [[DOTNEG:%.*]] = add i64 [[C2:%.*]], -4
804+
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[C1:%.*]] to i64
805+
; CHECK-NEXT: [[TMP2:%.*]] = sub i64 [[TMP1]], [[C3:%.*]]
806+
; CHECK-NEXT: [[SUB:%.*]] = add i64 [[DOTNEG]], [[TMP2]]
810807
; CHECK-NEXT: ret i64 [[SUB]]
811808
;
812809
%not = xor i32 %c1, -1
@@ -819,11 +816,8 @@ define i64 @test_zext_nneg(i32 %c1, i64 %c2, i64 %c3){
819816

820817
define i8 @test_trunc(i8 %a){
821818
; CHECK-LABEL: @test_trunc(
822-
; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[A:%.*]] to i32
823-
; CHECK-NEXT: [[SUB:%.*]] = add nsw i32 [[ZEXT]], -1
824-
; CHECK-NEXT: [[SHR:%.*]] = ashr i32 [[SUB]], 31
825-
; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[SHR]] to i8
826-
; CHECK-NEXT: [[NOT:%.*]] = xor i8 [[CONV]], -1
819+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i8 [[A:%.*]], 0
820+
; CHECK-NEXT: [[NOT:%.*]] = sext i1 [[TMP1]] to i8
827821
; CHECK-NEXT: ret i8 [[NOT]]
828822
;
829823
%zext = zext i8 %a to i32
@@ -836,11 +830,8 @@ define i8 @test_trunc(i8 %a){
836830

837831
define <2 x i8> @test_trunc_vec(<2 x i8> %a){
838832
; CHECK-LABEL: @test_trunc_vec(
839-
; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i8> [[A:%.*]] to <2 x i32>
840-
; CHECK-NEXT: [[SUB:%.*]] = add nsw <2 x i32> [[ZEXT]], <i32 -1, i32 -1>
841-
; CHECK-NEXT: [[SHR:%.*]] = ashr <2 x i32> [[SUB]], <i32 31, i32 31>
842-
; CHECK-NEXT: [[CONV:%.*]] = trunc <2 x i32> [[SHR]] to <2 x i8>
843-
; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i8> [[CONV]], <i8 -1, i8 -1>
833+
; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i8> [[A:%.*]], zeroinitializer
834+
; CHECK-NEXT: [[NOT:%.*]] = sext <2 x i1> [[TMP1]] to <2 x i8>
844835
; CHECK-NEXT: ret <2 x i8> [[NOT]]
845836
;
846837
%zext = zext <2 x i8> %a to <2 x i32>

0 commit comments

Comments
 (0)