@@ -3963,10 +3963,9 @@ define <8 x i1> @bitreverse_vec_ne(<8 x i16> %x, <8 x i16> %y) {
3963
3963
define i1 @knownbits1 (i8 %a , i8 %b ) {
3964
3964
; CHECK-LABEL: @knownbits1(
3965
3965
; CHECK-NEXT: [[A1:%.*]] = and i8 [[A:%.*]], 1
3966
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint i8 [[A1]], 4
3967
3966
; CHECK-NEXT: [[B1:%.*]] = and i8 [[B:%.*]], 2
3968
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint i8 [[B1]], 5
3969
- ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[A2 ]], [[B2 ]]
3967
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint i8 [[B1]], 1
3968
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[A1 ]], [[TMP1 ]]
3970
3969
; CHECK-NEXT: ret i1 [[C]]
3971
3970
;
3972
3971
%a1 = and i8 %a , 5
@@ -3980,10 +3979,9 @@ define i1 @knownbits1(i8 %a, i8 %b) {
3980
3979
define i1 @knownbits2 (i8 %a , i8 %b ) {
3981
3980
; CHECK-LABEL: @knownbits2(
3982
3981
; CHECK-NEXT: [[A1:%.*]] = and i8 [[A:%.*]], 1
3983
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint i8 [[A1]], 4
3984
3982
; CHECK-NEXT: [[B1:%.*]] = and i8 [[B:%.*]], 2
3985
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint i8 [[B1]], 5
3986
- ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[A2 ]], [[B2 ]]
3983
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint i8 [[B1]], 1
3984
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[A1 ]], [[TMP1 ]]
3987
3985
; CHECK-NEXT: ret i1 [[C]]
3988
3986
;
3989
3987
%a1 = and i8 %a , 5
@@ -3997,10 +3995,9 @@ define i1 @knownbits2(i8 %a, i8 %b) {
3997
3995
define i1 @knownbits3 (i8 %a , i8 %b ) {
3998
3996
; CHECK-LABEL: @knownbits3(
3999
3997
; CHECK-NEXT: [[A1:%.*]] = and i8 [[A:%.*]], 1
4000
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint i8 [[A1]], 4
4001
3998
; CHECK-NEXT: [[B1:%.*]] = and i8 [[B:%.*]], 2
4002
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint i8 [[B1]], 5
4003
- ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[B2 ]], [[A2 ]]
3999
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint i8 [[B1]], 1
4000
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[TMP1 ]], [[A1 ]]
4004
4001
; CHECK-NEXT: ret i1 [[C]]
4005
4002
;
4006
4003
%a1 = and i8 %a , 5
@@ -4014,10 +4011,9 @@ define i1 @knownbits3(i8 %a, i8 %b) {
4014
4011
define <2 x i1 > @knownbits4 (<2 x i8 > %a , <2 x i8 > %b ) {
4015
4012
; CHECK-LABEL: @knownbits4(
4016
4013
; CHECK-NEXT: [[A1:%.*]] = and <2 x i8> [[A:%.*]], <i8 1, i8 1>
4017
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint <2 x i8> [[A1]], <i8 4, i8 4>
4018
4014
; CHECK-NEXT: [[B1:%.*]] = and <2 x i8> [[B:%.*]], <i8 2, i8 2>
4019
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint <2 x i8> [[B1]], <i8 5 , i8 5 >
4020
- ; CHECK-NEXT: [[C:%.*]] = icmp ne <2 x i8> [[B2 ]], [[A2 ]]
4015
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint <2 x i8> [[B1]], <i8 1 , i8 1 >
4016
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne <2 x i8> [[TMP1 ]], [[A1 ]]
4021
4017
; CHECK-NEXT: ret <2 x i1> [[C]]
4022
4018
;
4023
4019
%a1 = and <2 x i8 > %a , <i8 5 , i8 5 >
@@ -4033,10 +4029,9 @@ define <2 x i1> @knownbits4(<2 x i8> %a, <2 x i8> %b) {
4033
4029
define i1 @knownbits5 (i8 %a , i8 %b ) {
4034
4030
; CHECK-LABEL: @knownbits5(
4035
4031
; CHECK-NEXT: [[A1:%.*]] = and i8 [[A:%.*]], -127
4036
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint i8 [[A1]], 4
4037
4032
; CHECK-NEXT: [[B1:%.*]] = and i8 [[B:%.*]], 2
4038
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint i8 [[B1]], 5
4039
- ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[A2 ]], [[B2 ]]
4033
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint i8 [[B1]], 1
4034
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[A1 ]], [[TMP1 ]]
4040
4035
; CHECK-NEXT: ret i1 [[C]]
4041
4036
;
4042
4037
%a1 = and i8 %a , 133
@@ -4050,10 +4045,9 @@ define i1 @knownbits5(i8 %a, i8 %b) {
4050
4045
define i1 @knownbits6 (i8 %a , i8 %b ) {
4051
4046
; CHECK-LABEL: @knownbits6(
4052
4047
; CHECK-NEXT: [[A1:%.*]] = and i8 [[A:%.*]], -127
4053
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint i8 [[A1]], 4
4054
4048
; CHECK-NEXT: [[B1:%.*]] = and i8 [[B:%.*]], 2
4055
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint i8 [[B1]], 5
4056
- ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[A2 ]], [[B2 ]]
4049
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint i8 [[B1]], 1
4050
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[A1 ]], [[TMP1 ]]
4057
4051
; CHECK-NEXT: ret i1 [[C]]
4058
4052
;
4059
4053
%a1 = and i8 %a , 133
@@ -4067,10 +4061,9 @@ define i1 @knownbits6(i8 %a, i8 %b) {
4067
4061
define <2 x i1 > @knownbits7 (<2 x i8 > %a , <2 x i8 > %b ) {
4068
4062
; CHECK-LABEL: @knownbits7(
4069
4063
; CHECK-NEXT: [[A1:%.*]] = and <2 x i8> [[A:%.*]], <i8 -127, i8 -127>
4070
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint <2 x i8> [[A1]], <i8 4, i8 4>
4071
4064
; CHECK-NEXT: [[B1:%.*]] = and <2 x i8> [[B:%.*]], <i8 2, i8 2>
4072
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint <2 x i8> [[B1]], <i8 5 , i8 5 >
4073
- ; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i8> [[B2 ]], [[A2 ]]
4065
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint <2 x i8> [[B1]], <i8 1 , i8 1 >
4066
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq <2 x i8> [[TMP1 ]], [[A1 ]]
4074
4067
; CHECK-NEXT: ret <2 x i1> [[C]]
4075
4068
;
4076
4069
%a1 = and <2 x i8 > %a , <i8 133 , i8 133 >
@@ -4084,10 +4077,9 @@ define <2 x i1> @knownbits7(<2 x i8> %a, <2 x i8> %b) {
4084
4077
define i1 @knownbits8 (i8 %a , i8 %b ) {
4085
4078
; CHECK-LABEL: @knownbits8(
4086
4079
; CHECK-NEXT: [[A1:%.*]] = and i8 [[A:%.*]], -127
4087
- ; CHECK-NEXT: [[A2:%.*]] = or disjoint i8 [[A1]], 4
4088
4080
; CHECK-NEXT: [[B1:%.*]] = and i8 [[B:%.*]], 2
4089
- ; CHECK-NEXT: [[B2 :%.*]] = or disjoint i8 [[B1]], 5
4090
- ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[B2 ]], [[A2 ]]
4081
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or disjoint i8 [[B1]], 1
4082
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[TMP1 ]], [[A1 ]]
4091
4083
; CHECK-NEXT: ret i1 [[C]]
4092
4084
;
4093
4085
%a1 = and i8 %a , 133
@@ -5013,3 +5005,136 @@ define i1 @or_positive_sgt_zero_multi_use(i8 %a) {
5013
5005
%cmp = icmp sgt i8 %b , 0
5014
5006
ret i1 %cmp
5015
5007
}
5008
+
5009
+
5010
+ define i1 @disjoint_or_sgt_1 (i8 %a , i8 %b ) {
5011
+ ; CHECK-LABEL: @disjoint_or_sgt_1(
5012
+ ; CHECK-NEXT: [[B1:%.*]] = add nsw i8 [[B:%.*]], 2
5013
+ ; CHECK-NEXT: [[ICMP_:%.*]] = icmp sle i8 [[B1]], [[A:%.*]]
5014
+ ; CHECK-NEXT: ret i1 [[ICMP_]]
5015
+ ;
5016
+ %a1 = or disjoint i8 %a , 1
5017
+ %b1 = add nsw i8 %b , 2
5018
+ %icmp_ = icmp sgt i8 %a1 , %b1
5019
+ ret i1 %icmp_
5020
+ }
5021
+
5022
+ define i1 @disjoint_or_sgt_2 (i8 %a , i8 %b ) {
5023
+ ; CHECK-LABEL: @disjoint_or_sgt_2(
5024
+ ; CHECK-NEXT: [[A1:%.*]] = or disjoint i8 [[A:%.*]], 2
5025
+ ; CHECK-NEXT: [[B1:%.*]] = add i8 [[B:%.*]], 1
5026
+ ; CHECK-NEXT: [[ICMP_:%.*]] = icmp sgt i8 [[A1]], [[B1]]
5027
+ ; CHECK-NEXT: ret i1 [[ICMP_]]
5028
+ ;
5029
+ %a1 = or disjoint i8 %a , 2
5030
+ %b1 = add i8 %b , 1
5031
+ %icmp_ = icmp sgt i8 %a1 , %b1
5032
+ ret i1 %icmp_
5033
+ }
5034
+
5035
+ define i1 @disjoint_or_sgt_3 (i8 %a , i8 %b ) {
5036
+ ; CHECK-LABEL: @disjoint_or_sgt_3(
5037
+ ; CHECK-NEXT: [[A1:%.*]] = or disjoint i8 [[A:%.*]], 2
5038
+ ; CHECK-NEXT: [[B1:%.*]] = add nuw i8 [[B:%.*]], 1
5039
+ ; CHECK-NEXT: [[ICMP_:%.*]] = icmp sgt i8 [[A1]], [[B1]]
5040
+ ; CHECK-NEXT: ret i1 [[ICMP_]]
5041
+ ;
5042
+ %a1 = or disjoint i8 %a , 2
5043
+ %b1 = add nuw i8 %b , 1
5044
+ %icmp_ = icmp sgt i8 %a1 , %b1
5045
+ ret i1 %icmp_
5046
+ }
5047
+
5048
+ define i1 @disjoint_or_ugt_1 (i8 %a , i8 %b ) {
5049
+ ; CHECK-LABEL: @disjoint_or_ugt_1(
5050
+ ; CHECK-NEXT: [[B1:%.*]] = add nsw i8 [[B:%.*]], 2
5051
+ ; CHECK-NEXT: [[ICMP_:%.*]] = icmp ule i8 [[B1]], [[A:%.*]]
5052
+ ; CHECK-NEXT: ret i1 [[ICMP_]]
5053
+ ;
5054
+ %a1 = or disjoint i8 %a , 1
5055
+ %b1 = add nsw i8 %b , 2
5056
+ %icmp_ = icmp ugt i8 %a1 , %b1
5057
+ ret i1 %icmp_
5058
+ }
5059
+
5060
+ define i1 @disjoint_or_ugt_2 (i8 %a , i8 %b ) {
5061
+ ; CHECK-LABEL: @disjoint_or_ugt_2(
5062
+ ; CHECK-NEXT: [[A1:%.*]] = or disjoint i8 [[A:%.*]], 2
5063
+ ; CHECK-NEXT: [[B1:%.*]] = add i8 [[B:%.*]], 1
5064
+ ; CHECK-NEXT: [[ICMP_:%.*]] = icmp ugt i8 [[A1]], [[B1]]
5065
+ ; CHECK-NEXT: ret i1 [[ICMP_]]
5066
+ ;
5067
+ %a1 = or disjoint i8 %a , 2
5068
+ %b1 = add i8 %b , 1
5069
+ %icmp_ = icmp ugt i8 %a1 , %b1
5070
+ ret i1 %icmp_
5071
+ }
5072
+
5073
+ define i1 @disjoint_or_ugt_3 (i8 %a , i8 %b ) {
5074
+ ; CHECK-LABEL: @disjoint_or_ugt_3(
5075
+ ; CHECK-NEXT: [[A1:%.*]] = or disjoint i8 [[A:%.*]], 2
5076
+ ; CHECK-NEXT: [[B1:%.*]] = add nuw i8 [[B:%.*]], 1
5077
+ ; CHECK-NEXT: [[ICMP_:%.*]] = icmp ugt i8 [[A1]], [[B1]]
5078
+ ; CHECK-NEXT: ret i1 [[ICMP_]]
5079
+ ;
5080
+ %a1 = or disjoint i8 %a , 2
5081
+ %b1 = add nuw i8 %b , 1
5082
+ %icmp_ = icmp ugt i8 %a1 , %b1
5083
+ ret i1 %icmp_
5084
+ }
5085
+
5086
+ define i1 @deduce_nuw_flag_1 (i8 %a , i8 %b ) {
5087
+ ; CHECK-LABEL: @deduce_nuw_flag_1(
5088
+ ; CHECK-NEXT: entry:
5089
+ ; CHECK-NEXT: [[TMP0:%.*]] = add nuw i8 [[B:%.*]], 1
5090
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP0]], [[A:%.*]]
5091
+ ; CHECK-NEXT: ret i1 [[CMP]]
5092
+ ;
5093
+ entry:
5094
+ %add1 = add nuw i8 %b , 2
5095
+ %add2 = add i8 %a , 1
5096
+ %cmp = icmp eq i8 %add1 , %add2
5097
+ ret i1 %cmp
5098
+ }
5099
+
5100
+ define i1 @deduce_nuw_flag_2 (i8 %a , i8 %b ) {
5101
+ ; CHECK-LABEL: @deduce_nuw_flag_2(
5102
+ ; CHECK-NEXT: entry:
5103
+ ; CHECK-NEXT: [[TMP0:%.*]] = add nuw i8 [[B:%.*]], 1
5104
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP0]], [[A:%.*]]
5105
+ ; CHECK-NEXT: ret i1 [[CMP]]
5106
+ ;
5107
+ entry:
5108
+ %add1 = add nuw i8 %b , 2
5109
+ %add2 = add i8 %a , 1
5110
+ %cmp = icmp eq i8 %add2 , %add1
5111
+ ret i1 %cmp
5112
+ }
5113
+
5114
+ define i1 @dont_deduce_nuw_flag_1 (i8 %a , i8 %b ) {
5115
+ ; CHECK-LABEL: @dont_deduce_nuw_flag_1(
5116
+ ; CHECK-NEXT: entry:
5117
+ ; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[B:%.*]], -1
5118
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP0]], [[A:%.*]]
5119
+ ; CHECK-NEXT: ret i1 [[CMP]]
5120
+ ;
5121
+ entry:
5122
+ %add1 = add nuw i8 %b , -2
5123
+ %add2 = add i8 %a , -1
5124
+ %cmp = icmp eq i8 %add1 , %add2
5125
+ ret i1 %cmp
5126
+ }
5127
+
5128
+ define i1 @dont_deduce_nuw_flag_2 (i8 %a , i8 %b ) {
5129
+ ; CHECK-LABEL: @dont_deduce_nuw_flag_2(
5130
+ ; CHECK-NEXT: entry:
5131
+ ; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[B:%.*]], -1
5132
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP0]], [[A:%.*]]
5133
+ ; CHECK-NEXT: ret i1 [[CMP]]
5134
+ ;
5135
+ entry:
5136
+ %add1 = add nuw i8 %b , -2
5137
+ %add2 = add i8 %a , -1
5138
+ %cmp = icmp eq i8 %add2 , %add1
5139
+ ret i1 %cmp
5140
+ }
0 commit comments