@@ -4113,9 +4113,10 @@ define i1 @signbit_true_logic_uses_commute(i64 %x) {
4113
4113
4114
4114
define i1 @zext_bool_and_eq0 (i1 %x , i8 %y ) {
4115
4115
; CHECK-LABEL: @zext_bool_and_eq0(
4116
- ; CHECK-NEXT: [[ZX:%.*]] = zext i1 [[X:%.*]] to i8
4117
- ; CHECK-NEXT: [[A:%.*]] = and i8 [[ZX]], [[Y:%.*]]
4118
- ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[A]], 0
4116
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[Y:%.*]], 1
4117
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 0
4118
+ ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[X:%.*]]
4119
+ ; CHECK-NEXT: [[R:%.*]] = xor i1 [[TMP3]], true
4119
4120
; CHECK-NEXT: ret i1 [[R]]
4120
4121
;
4121
4122
%zx = zext i1 %x to i8
@@ -4126,9 +4127,9 @@ define i1 @zext_bool_and_eq0(i1 %x, i8 %y) {
4126
4127
4127
4128
define <2 x i1 > @zext_bool_and_eq0_commute (<2 x i1 > %x , <2 x i8 > %p ) {
4128
4129
; CHECK-LABEL: @zext_bool_and_eq0_commute(
4129
- ; CHECK-NEXT: [[ZX :%.*]] = zext <2 x i1 > [[X :%.*]] to <2 x i8 >
4130
- ; CHECK-NEXT: [[A :%.*]] = and <2 x i8 > [[ZX ]], [[P :%.*]]
4131
- ; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8 > [[A ]], zeroinitializer
4130
+ ; CHECK-NEXT: [[TMP1 :%.*]] = trunc <2 x i8 > [[P :%.*]] to <2 x i1 >
4131
+ ; CHECK-NEXT: [[TMP2 :%.*]] = and <2 x i1 > [[TMP1 ]], [[X :%.*]]
4132
+ ; CHECK-NEXT: [[R:%.*]] = xor <2 x i1 > [[TMP2 ]], <i1 true, i1 true>
4132
4133
; CHECK-NEXT: ret <2 x i1> [[R]]
4133
4134
;
4134
4135
%y = mul <2 x i8 > %p , %p ; thwart complexity-based canonicalization
@@ -4140,9 +4141,9 @@ define <2 x i1> @zext_bool_and_eq0_commute(<2 x i1> %x, <2 x i8> %p) {
4140
4141
4141
4142
define i1 @zext_bool_and_ne0 (i1 %x , i8 %y ) {
4142
4143
; CHECK-LABEL: @zext_bool_and_ne0(
4143
- ; CHECK-NEXT: [[ZX :%.*]] = zext i1 [[X :%.*]] to i8
4144
- ; CHECK-NEXT: [[A :%.*]] = and i8 [[ZX ]], [[Y:%.*]]
4145
- ; CHECK-NEXT: [[R:%.*]] = icmp ne i8 [[A ]], 0
4144
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and i8 [[Y :%.*]], 1
4145
+ ; CHECK-NEXT: [[TMP2 :%.*]] = icmp ne i8 [[TMP1 ]], 0
4146
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[TMP2 ]], [[X:%.*]]
4146
4147
; CHECK-NEXT: ret i1 [[R]]
4147
4148
;
4148
4149
%zx = zext i1 %x to i8
@@ -4151,6 +4152,8 @@ define i1 @zext_bool_and_ne0(i1 %x, i8 %y) {
4151
4152
ret i1 %r
4152
4153
}
4153
4154
4155
+ ; TODO: This should transform similarly to eq/ne 0.
4156
+
4154
4157
define i1 @zext_bool_and_ne1 (i1 %x , i8 %y ) {
4155
4158
; CHECK-LABEL: @zext_bool_and_ne1(
4156
4159
; CHECK-NEXT: [[ZX:%.*]] = zext i1 [[X:%.*]] to i8
@@ -4164,6 +4167,8 @@ define i1 @zext_bool_and_ne1(i1 %x, i8 %y) {
4164
4167
ret i1 %r
4165
4168
}
4166
4169
4170
+ ; negative test - wrong logic op
4171
+
4167
4172
define i1 @zext_bool_or_eq0 (i1 %x , i8 %y ) {
4168
4173
; CHECK-LABEL: @zext_bool_or_eq0(
4169
4174
; CHECK-NEXT: [[ZX:%.*]] = zext i1 [[X:%.*]] to i8
@@ -4177,6 +4182,8 @@ define i1 @zext_bool_or_eq0(i1 %x, i8 %y) {
4177
4182
ret i1 %r
4178
4183
}
4179
4184
4185
+ ; negative test - extra use
4186
+
4180
4187
define i1 @zext_bool_and_eq0_use (i1 %x , i64 %y ) {
4181
4188
; CHECK-LABEL: @zext_bool_and_eq0_use(
4182
4189
; CHECK-NEXT: [[ZX:%.*]] = zext i1 [[X:%.*]] to i64
@@ -4192,6 +4199,8 @@ define i1 @zext_bool_and_eq0_use(i1 %x, i64 %y) {
4192
4199
ret i1 %r
4193
4200
}
4194
4201
4202
+ ; negative test - extra use
4203
+
4195
4204
define i1 @zext_bool_and_ne0_use (i1 %x , i64 %y ) {
4196
4205
; CHECK-LABEL: @zext_bool_and_ne0_use(
4197
4206
; CHECK-NEXT: [[ZX:%.*]] = zext i1 [[X:%.*]] to i64
@@ -4207,6 +4216,8 @@ define i1 @zext_bool_and_ne0_use(i1 %x, i64 %y) {
4207
4216
ret i1 %r
4208
4217
}
4209
4218
4219
+ ; negative test - must zext from i1
4220
+
4210
4221
define i1 @zext_notbool_and_ne0 (i2 %x , i8 %y ) {
4211
4222
; CHECK-LABEL: @zext_notbool_and_ne0(
4212
4223
; CHECK-NEXT: [[ZX:%.*]] = zext i2 [[X:%.*]] to i8
0 commit comments