diff --git a/llvm/test/Transforms/InstCombine/icmp-add.ll b/llvm/test/Transforms/InstCombine/icmp-add.ll index a2d0c3eb39d69..b1576ebb0b2f8 100644 --- a/llvm/test/Transforms/InstCombine/icmp-add.ll +++ b/llvm/test/Transforms/InstCombine/icmp-add.ll @@ -5,6 +5,1852 @@ declare void @use(i32) ; PR1949 +; negative test for zext/zext additions with i16 +define i1 @cvt_icmp_0_zext_plus_zext_eq_i16(i16 %arg, i16 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_zext_plus_zext_eq_i16( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i16 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i16 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = sub nsw i32 0, [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp eq i32 [[I2]], [[I3]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i16 %arg to i32 + %i2 = zext i16 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp eq i32 %i3, 0 + ret i1 %i4 +} + +; negative test for zext/zext addtions with i8 +define i1 @cvt_icmp_0_zext_plus_zext_eq_i8(i8 %arg, i8 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_zext_plus_zext_eq_i8( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i8 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i8 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = sub nsw i32 0, [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp eq i32 [[I2]], [[I3]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i8 %arg to i32 + %i2 = zext i8 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp eq i32 %i3, 0 + ret i1 %i4 +} + +; start of positive tests +define i1 @cvt_icmp_neg_2_zext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_zext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp eq i32 %i3, -2 + ret i1 %i4 +} + +define i1 @cvt_icmp_neg_1_zext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_zext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp eq i32 %i3, -1 + ret i1 %i4 +} + +define i1 @cvt_icmp_0_zext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_zext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp eq i32 %i3, 0 + ret i1 %i4 +} + +define i1 @cvt_icmp_1_zext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_zext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp eq i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp eq i32 %i3, 1 + ret i1 %i4 +} + +define <2 x i1> @cvt_icmp_1_zext_plus_zext_eq_vec(<2 x i1> %arg, <2 x i1> %arg1) { +; CHECK-LABEL: @cvt_icmp_1_zext_plus_zext_eq_vec( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext <2 x i1> [[ARG:%.*]] to <2 x i32> +; CHECK-NEXT: [[I2:%.*]] = zext <2 x i1> [[ARG1:%.*]] to <2 x i32> +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw <2 x i32> [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp eq <2 x i32> [[I3]], +; CHECK-NEXT: ret <2 x i1> [[I4]] +; +bb: + %i = zext <2 x i1> %arg to <2 x i32> + %i2 = zext <2 x i1> %arg1 to <2 x i32> + %i3 = add <2 x i32> %i2, %i + %i4 = icmp eq <2 x i32> %i3, + ret <2 x i1> %i4 +} + +define i1 @cvt_icmp_2_zext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_zext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_2_sext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_sext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, -2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_1_sext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_sext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], -1 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, -1 + ret i1 %t +} + +define i1 @cvt_icmp_0_sext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_sext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG:%.*]], [[ARG1:%.*]] +; CHECK-NEXT: [[T:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 0 + ret i1 %t +} + +define i1 @cvt_icmp_1_sext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_sext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 1 + ret i1 %t +} + +define i1 @cvt_icmp_2_sext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_sext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_2_sext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_sext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, -2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_1_sext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_sext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[T:%.*]] = and i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, -1 + ret i1 %t +} + +define i1 @cvt_icmp_0_sext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_sext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], [[ARG1:%.*]] +; CHECK-NEXT: [[T:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 0 + ret i1 %t +} + +define i1 @cvt_icmp_1_sext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_sext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[T:%.*]] = and i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 1 + ret i1 %t +} + +define i1 @cvt_icmp_2_sext_plus_zext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_sext_plus_zext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_2_zext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_zext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ne i32 %i3, -2 + ret i1 %i4 +} + +define i1 @cvt_icmp_neg_1_zext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_zext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ne i32 %i3, -1 + ret i1 %i4 +} + +define i1 @cvt_icmp_0_zext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_zext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ne i32 %i3, 0 + ret i1 %i4 +} + +define i1 @cvt_icmp_1_zext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_zext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ne i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ne i32 %i3, 1 + ret i1 %i4 +} + +define i1 @cvt_icmp_1_zext_plus_zext_ne_extra_use_1(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_zext_plus_zext_ne_extra_use_1( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: call void @use(i32 [[I3]]) +; CHECK-NEXT: [[I4:%.*]] = icmp ne i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + call void @use(i32 %i3) + %i4 = icmp ne i32 %i3, 1 + ret i1 %i4 +} + +define i1 @cvt_icmp_1_zext_plus_zext_ne_extra_use_2(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_zext_plus_zext_ne_extra_use_2( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: call void @use(i32 [[I]]) +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: call void @use(i32 [[I2]]) +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ne i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + call void @use(i32 %i) + %i2 = zext i1 %arg1 to i32 + call void @use(i32 %i2) + %i3 = add i32 %i2, %i + %i4 = icmp ne i32 %i3, 1 + ret i1 %i4 +} + +define i1 @cvt_icmp_2_zext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_zext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_2_sext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_sext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, -2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_1_sext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_sext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], -1 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, -1 + ret i1 %t +} + +define i1 @cvt_icmp_0_sext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_sext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG:%.*]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 0 + ret i1 %t +} + +define i1 @cvt_icmp_1_sext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_sext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 1 + ret i1 %t +} + +define i1 @cvt_icmp_2_sext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_sext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_2_sext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_sext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, -2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_1_sext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_sext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[T:%.*]] = or i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, -1 + ret i1 %t +} + +define i1 @cvt_icmp_0_sext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_sext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[T:%.*]] = xor i1 [[ARG:%.*]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 0 + ret i1 %t +} + +define i1 @cvt_icmp_1_sext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_sext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[T:%.*]] = or i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 1 + ret i1 %t +} + +define i1 @cvt_icmp_2_sext_plus_zext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_sext_plus_zext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 2 + ret i1 %t +} + +; test if zext i1 X + sext i1 Y converted to sext i1 X + zext i1 Y +; and then processed + +define i1 @cvt_icmp_neg_2_zext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_zext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, -2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_1_zext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_zext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[T:%.*]] = and i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, -1 + ret i1 %t +} + +define i1 @cvt_icmp_0_zext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_zext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], [[ARG1:%.*]] +; CHECK-NEXT: [[T:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 0 + ret i1 %t +} + +define i1 @cvt_icmp_1_zext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_zext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[T:%.*]] = and i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 1 + ret i1 %t +} + +define i1 @cvt_icmp_2_zext_plus_sext_eq(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_zext_plus_sext_eq( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp eq i32 %i3, 2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_2_zext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_2_zext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, -2 + ret i1 %t +} + +define i1 @cvt_icmp_neg_1_zext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_neg_1_zext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[T:%.*]] = or i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, -1 + ret i1 %t +} + +define i1 @cvt_icmp_0_zext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_0_zext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[T:%.*]] = xor i1 [[ARG:%.*]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 0 + ret i1 %t +} + +define i1 @cvt_icmp_1_zext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_1_zext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[T:%.*]] = or i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 1 + ret i1 %t +} + +define i1 @cvt_icmp_2_zext_plus_sext_ne(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @cvt_icmp_2_zext_plus_sext_ne( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I]], [[I2]] +; CHECK-NEXT: [[T:%.*]] = icmp ne i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i, %i2 + %t = icmp ne i32 %i3, 2 + ret i1 %t +} + +; test zext/zext additions with more than one use + +define i1 @test_cvt_icmp1(i1 %arg, i1 %arg1, ptr %p) { +; CHECK-LABEL: @test_cvt_icmp1( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG]] to i32 +; CHECK-NEXT: store i32 [[I2]], ptr [[P:%.*]], align 4 +; CHECK-NEXT: [[I4:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[T:%.*]] = icmp eq i32 [[I4]], 1 +; CHECK-NEXT: ret i1 [[T]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg to i32 + store i32 %i2, ptr %p + %i3 = load i32, ptr %p + %i4 = add i32 %i3, %i + %t = icmp eq i32 %i4, 1 + ret i1 %t +} + +define i1 @test_cvt_icmp2(i1 %arg, i1 %arg1, ptr %p) { +; CHECK-LABEL: @test_cvt_icmp2( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: store i32 [[I2]], ptr [[P:%.*]], align 4 +; CHECK-NEXT: ret i1 false +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg to i32 + store i32 %i2, ptr %p + %i3 = load i32, ptr %p + %i4 = add i32 %i3, %i + %t = icmp eq i32 %i4, 1 + ret i1 %t +} + +; tests for ult +define i1 @test_zext_zext_cvt_neg_2_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_neg_2_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_neg_1_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_neg_1_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_0_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_0_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_2_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_2_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ult i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_neg_2_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_neg_2_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_neg_1_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_neg_1_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ne i32 [[I3]], -1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_0_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_0_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_1_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_1_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_2_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_2_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_sext_zext_cvt_neg_2_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_zext_cvt_neg_2_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[ARG_NOT:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[ARG_NOT]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_sext_zext_cvt_neg_1_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_zext_cvt_neg_1_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_sext_zext_cvt_0_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_zext_cvt_0_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_sext_zext_cvt_2_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_zext_cvt_2_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[ARG_NOT:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[ARG_NOT]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_neg_1_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_neg_1_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_0_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_0_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_1_ult_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_1_ult_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 1 + ret i1 %i4 +} + +; tests for ugt +define i1 @test_cvt_icmp4(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp4( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_neg_2_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_neg_2_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_1_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_1_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ugt i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_2_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_2_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp eq i32 [[I3]], 3 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_neg_2_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_neg_2_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp eq i32 [[I3]], -1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_0_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_0_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_2_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_2_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ugt i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_neg_2_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_neg_2_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = and i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_neg_1_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_neg_1_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_0_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_0_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_1_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_1_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = and i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_2_ugt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_2_ugt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = and i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp5(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp5( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp uge i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_cvt_icmp6(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp6( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ult i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ule i32 %i3, 1 + ret i1 %i4 +} + +; tests for sgt +define i1 @test_cvt_icmp7(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp7( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ugt i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_neg_2_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_neg_2_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_neg_1_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_neg_1_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_2_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_2_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp eq i32 [[I3]], 3 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_neg_2_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_neg_2_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp sgt i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_0_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_0_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp sgt i32 [[I3]], 0 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_2_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_2_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp sgt i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_neg_2_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_neg_2_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_neg_1_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_neg_1_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_0_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_0_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = and i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_1_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_1_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_2_sgt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_2_sgt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 2 + ret i1 %i4 +} + +; tests for slt +define i1 @test_zext_zext_cvt_neg_2_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_neg_2_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_neg_1_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_neg_1_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_zext_zext_cvt_2_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_zext_cvt_2_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ult i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_neg_2_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_neg_2_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp slt i32 [[I3]], -2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_0_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_0_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_sext_sext_cvt_2_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_sext_sext_cvt_2_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp slt i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_neg_2_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_neg_2_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, -2 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_neg_1_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_neg_1_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, -1 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_0_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_0_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = and i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_1_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_1_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_zext_sext_cvt_2_slt_icmp(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_zext_sext_cvt_2_slt_icmp( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = zext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp8(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp8( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sge i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_cvt_icmp9(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp9( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_cvt_icmp10(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp10( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = zext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nuw nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ult i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = zext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sle i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_cvt_icmp11(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp11( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ugt i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp12(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp12( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[TMP0]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp uge i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_cvt_icmp13(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp13( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[TMP0]], true +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_cvt_icmp14(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp14( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ult i32 [[I3]], 3 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ule i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp15(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp15( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp sgt i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp16(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp16( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp sgt i32 [[I3]], 1 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sge i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp17(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp17( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp slt i32 [[I3]], 2 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp18(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp18( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = sext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp slt i32 [[I3]], 3 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = sext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sle i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp19(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp19( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = and i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ugt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp20(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp20( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I4:%.*]] = xor i1 [[ARG1:%.*]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp uge i32 %i3, 1 + ret i1 %i4 +} + +define i1 @test_cvt_icmp21(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp21( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[ARG_NOT:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[ARG_NOT]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ult i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp22(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp22( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[I:%.*]] = sext i1 [[ARG:%.*]] to i32 +; CHECK-NEXT: [[I2:%.*]] = zext i1 [[ARG1:%.*]] to i32 +; CHECK-NEXT: [[I3:%.*]] = add nsw i32 [[I2]], [[I]] +; CHECK-NEXT: [[I4:%.*]] = icmp ult i32 [[I3]], 3 +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp ule i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp23(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp23( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 false +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sgt i32 %i3, 2 + ret i1 %i4 +} + +define i1 @test_cvt_icmp24(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp24( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = or i1 [[TMP0]], [[ARG1:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sge i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_cvt_icmp25(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp25( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true +; CHECK-NEXT: [[I4:%.*]] = and i1 [[TMP0]], [[ARG:%.*]] +; CHECK-NEXT: ret i1 [[I4]] +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp slt i32 %i3, 0 + ret i1 %i4 +} + +define i1 @test_cvt_icmp26(i1 %arg, i1 %arg1) { +; CHECK-LABEL: @test_cvt_icmp26( +; CHECK-NEXT: bb: +; CHECK-NEXT: ret i1 true +; +bb: + %i = sext i1 %arg to i32 + %i2 = zext i1 %arg1 to i32 + %i3 = add i32 %i2, %i + %i4 = icmp sle i32 %i3, 1 + ret i1 %i4 +} + define i1 @test1(i32 %a) { ; CHECK-LABEL: @test1( ; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[A:%.*]], -5