; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s ; The following binop x, (zext i1) tests will be vector-legalized into a vselect ; of two splat_vectors, but on RV64 the splat value will be implicitly ; truncated: ; ; t15: nxv2i32 = splat_vector Constant:i64<1> ; t13: nxv2i32 = splat_vector Constant:i64<0> ; t16: nxv2i32 = vselect t2, t15, t13 ; t7: nxv2i32 = add t4, t16 ; ; Make sure that foldSelectWithIdentityConstant in DAGCombiner.cpp handles the ; truncating splat, so we pull the vselect back and fold it into a mask. define @i1_zext_add( %a, %b) { ; CHECK-LABEL: i1_zext_add: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu ; CHECK-NEXT: vadd.vi v8, v8, 1, v0.t ; CHECK-NEXT: ret %zext = zext %a to %add = add %b, %zext ret %add } define @i1_zext_add_commuted( %a, %b) { ; CHECK-LABEL: i1_zext_add_commuted: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu ; CHECK-NEXT: vadd.vi v8, v8, 1, v0.t ; CHECK-NEXT: ret %zext = zext %a to %add = add %zext, %b ret %add } define @i1_zext_sub( %a, %b) { ; CHECK-LABEL: i1_zext_sub: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu ; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t ; CHECK-NEXT: ret %zext = zext %a to %sub = sub %b, %zext ret %sub } define @i1_zext_or( %a, %b) { ; CHECK-LABEL: i1_zext_or: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, mu ; CHECK-NEXT: vor.vi v8, v8, 1, v0.t ; CHECK-NEXT: ret %zext = zext %a to %or = or %b, %zext ret %or }