[PATCH] D150177: [RISCV] Enable signed truncation check transforms for i8

Yingwei Zheng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 10 07:20:42 PDT 2023


dtcxzyw added inline comments.


================
Comment at: llvm/test/CodeGen/RISCV/lack-of-signed-truncation-check.ll:401
+; RV32I-NEXT:    sltu a0, a2, a0
+; RV32I-NEXT:    add a0, a1, a0
+; RV32I-NEXT:    addi a0, a0, -1
----------------
reames wrote:
> These two instructions are an odd variant of the add-carry from below.  This looks like something got turned into a select whereas the add-with-carry + compare-two-halves should have worked here.
After legalization, RISCVISD::SELECT_CC was created. Then It was lowered to Select_GPR_Using_CC_GPR at the end of ISel.
```
Legalized selection DAG: %bb.0
SelectionDAG has 21 nodes:	
  t0: ch,glue = EntryToken	
  t2: i32,ch = CopyFromReg t0, Register:i32 %0	
  t20: i32 = add t2, Constant:i32<-128>	
      t4: i32,ch = CopyFromReg t0, Register:i32 %1	
      t22: i32 = setcc t20, t2, setult:ch	
    t33: i32 = add t4, t22	
  t34: i32 = add t33, Constant:i32<-1>	
      t27: i32 = setcc t20, Constant:i32<-256>, setult:ch	
      t29: i32 = setcc t34, Constant:i32<-1>, setne:ch	
    t35: i32 = RISCVISD::SELECT_CC t34, Constant:i32<-1>, seteq:ch, t27, t29	
  t13: ch,glue = CopyToReg t0, Register:i32 $x10, t35	
  t14: ch = RISCVISD::RET_GLUE t13, Register:i32 $x10, t13:1
===== Instruction selection ends:	
Selected selection DAG: %bb.0
SelectionDAG has 21 nodes:	
  t0: ch,glue = EntryToken	
  t2: i32,ch = CopyFromReg t0, Register:i32 %0	
  t20: i32 = ADDI t2, TargetConstant:i32<-128>	
      t4: i32,ch = CopyFromReg t0, Register:i32 %1	
      t22: i32 = SLTU t20, t2	
    t33: i32 = ADD t4, t22	
  t34: i32 = ADDI t33, TargetConstant:i32<-1>	
      t41: i32 = ADDI Register:i32 $x0, TargetConstant:i32<-1>	
      t27: i32 = SLTIU t20, TargetConstant:i32<-256>	
      t29: i32 = SLTIU t34, TargetConstant:i32<-1>	
    t35: i32 = Select_GPR_Using_CC_GPR t34, t41, TargetConstant:i32<0>, t27, t29	
  t13: ch,glue = CopyToReg t0, Register:i32 $x10, t35	
  t14: ch = PseudoRET Register:i32 $x10, t13, t13:1
```
In this case, we can fold (riscvisd::select_cc lhs, rhs, cc, truev, (setcc lhs, rhs, inv cc)) into (riscvisd::select_cc lhs, rhs, cc, truev, 1) and eventually into (or (setcc lhs, rhs, inv cc), truev).
I will try to improve the code without Zbb in follow-up patches.



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150177/new/

https://reviews.llvm.org/D150177



More information about the llvm-commits mailing list