[PATCH] D143646: [RISCV] Return false from shouldFormOverflowOp

Craig Topper via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 20 23:06:42 PST 2023


craig.topper added inline comments.


================
Comment at: llvm/lib/Target/RISCV/RISCVISelLowering.cpp:8923
+  ISD::CondCode Cond = cast<CondCodeSDNode>(N->getOperand(2))->get();
+  if (OpVT == MVT::i64 && !Subtarget.is64Bit() && Cond == ISD::SETULT &&
+      N0->getOpcode() == ISD::ADD && !isa<ConstantSDNode>(N1) &&
----------------
liaolucy wrote:
> craig.topper wrote:
> > I don't understand this criteria. Just looking at the operands of the add is arbitrary. In your example, it seems like the select is important, but you don't check for that.
> It should have nothing to do with the select instruction.
> In fact selectDAG is just one more instruction than before:  %10:gpr = SLTU %6:gpr, %0:gpr 
> IR Dump After Machine code sinking (machine-sink) : generating redundant branch instruction + copy SLTU 
> 
> when add 64 is expanded, it is compared with the left side by default.
> https://github.com/llvm/llvm-project/blob/main/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp#L3017
> ```
> Optimized lowered selection DAG: %bb.0 
> 'uaddo1_math_overflow_used:'
> SelectionDAG has 29 nodes:
>   t0: ch,glue = EntryToken
>     t2: i32,ch = CopyFromReg t0, Register:i32 %0
>     t4: i32,ch = CopyFromReg t0, Register:i32 %1
>   t11: i64 = build_pair t2, t4
>     t6: i32,ch = CopyFromReg t0, Register:i32 %2
>     t8: i32,ch = CopyFromReg t0, Register:i32 %3
>   t12: i64 = build_pair t6, t8
>   t13: i64 = add t12, t11
>     t15: i1 = setcc t13, t11, setult:ch
>   t17: i64 = select t15, t12, Constant:i64<42>
>       t10: i32,ch = CopyFromReg t0, Register:i32 %4
>     t20: ch = store<(store (s64) into %ir.res)> t0, t13, t10, undef:i32
>     t23: i32 = extract_element t17, Constant:i32<0>
>   t25: ch,glue = CopyToReg t20, Register:i32 $x10, t23
>     t22: i32 = extract_element t17, Constant:i32<1>
>   t27: ch,glue = CopyToReg t25, Register:i32 $x11, t22, t25:1
>   t28: ch = RISCVISD::RET_FLAG t27, Register:i32 $x10, Register:i32 $x11, t27:1
> 
> 
> Type-legalized selection DAG: %bb.0 'uaddo1_math_overflow_used:'
> SelectionDAG has 38 nodes:
>   t0: ch,glue = EntryToken
>   t2: i32,ch = CopyFromReg t0, Register:i32 %0
>   t4: i32,ch = CopyFromReg t0, Register:i32 %1
>   t6: i32,ch = CopyFromReg t0, Register:i32 %2
>   t8: i32,ch = CopyFromReg t0, Register:i32 %3
>   t10: i32,ch = CopyFromReg t0, Register:i32 %4
>       t44: ch = store<(store (s32) into %ir.res, align 8)> t0, t30, t10, undef:i32
>         t46: i32 = add nuw t10, Constant:i32<4>
>       t47: ch = store<(store (s32) into %ir.res + 4, basealign 8)> t0, t33, t46, undef:i32
>     t48: ch = TokenFactor t44, t47
>     t35: i32 = select t38, t6, Constant:i32<42>
>   t25: ch,glue = CopyToReg t48, Register:i32 $x10, t35
>     t36: i32 = select t38, t8, Constant:i32<0>
>   t27: ch,glue = CopyToReg t25, Register:i32 $x11, t36, t25:1
>   t30: i32 = add t6, t2
>     t31: i32 = add t8, t4
>     t32: i32 = setcc t30, t6, setult:ch -------- if change to :  t32: i32 = setcc t30, t2, setult:ch
>   t33: i32 = add t31, t32
>       t42: i32 = setcc t33, t4, seteq:ch
>       t39: i32 = setcc t30, t2, setult:ch. -------  t32 and t42 are the sameļ¼Œ t32/t42 can be delete.
>       t40: i32 = setcc t33, t4, setult:ch
>     t43: i32 = select t42, t39, t40
>   t38: i32 = and t43, Constant:i32<1>
>   t28: ch = RISCVISD::RET_FLAG t27, Register:i32 $x10, Register:i32 $x11, t27:1
> ```
Ok I understand now. I'm concerned there aren't enough checks here to prevent infinite loops. If there are two setccs that both use the add but compare to a different operand, we'll infinite loop commuting the add.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D143646



More information about the llvm-commits mailing list