1d624b921SLiaoChunyu; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2d624b921SLiaoChunyu; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3d624b921SLiaoChunyu; RUN: | FileCheck %s -check-prefixes=RV32 4d624b921SLiaoChunyu; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 5d624b921SLiaoChunyu; RUN: | FileCheck %s -check-prefixes=RV64 6d624b921SLiaoChunyu 7d624b921SLiaoChunyu;Copy tests from llvm/tests/Transforms/CodeGenPrepare/X86/overflow-intrinsics.ll 8d624b921SLiaoChunyu;to test shouldFormOverflowOp on RISCV 9d624b921SLiaoChunyu 10d624b921SLiaoChunyudefine i64 @uaddo1_overflow_used(i64 %a, i64 %b) nounwind ssp { 11d624b921SLiaoChunyu; RV32-LABEL: uaddo1_overflow_used: 12d624b921SLiaoChunyu; RV32: # %bb.0: 13d624b921SLiaoChunyu; RV32-NEXT: add a5, a3, a1 14d624b921SLiaoChunyu; RV32-NEXT: add a4, a2, a0 15d624b921SLiaoChunyu; RV32-NEXT: sltu a6, a4, a2 16d624b921SLiaoChunyu; RV32-NEXT: add a5, a5, a6 17d624b921SLiaoChunyu; RV32-NEXT: beq a5, a1, .LBB0_2 18d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 19d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a5, a1 20d624b921SLiaoChunyu; RV32-NEXT: beqz a0, .LBB0_3 21d624b921SLiaoChunyu; RV32-NEXT: j .LBB0_4 22d624b921SLiaoChunyu; RV32-NEXT: .LBB0_2: 23d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a4, a0 24d624b921SLiaoChunyu; RV32-NEXT: bnez a0, .LBB0_4 25d624b921SLiaoChunyu; RV32-NEXT: .LBB0_3: 26d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 27d624b921SLiaoChunyu; RV32-NEXT: .LBB0_4: 28d624b921SLiaoChunyu; RV32-NEXT: neg a1, a0 29d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 30d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 31d624b921SLiaoChunyu; RV32-NEXT: ret 32d624b921SLiaoChunyu; 33d624b921SLiaoChunyu; RV64-LABEL: uaddo1_overflow_used: 34d624b921SLiaoChunyu; RV64: # %bb.0: 35d624b921SLiaoChunyu; RV64-NEXT: add a2, a1, a0 36d624b921SLiaoChunyu; RV64-NEXT: bltu a2, a0, .LBB0_2 37d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 38d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 39d624b921SLiaoChunyu; RV64-NEXT: .LBB0_2: 40d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 41d624b921SLiaoChunyu; RV64-NEXT: ret 42d624b921SLiaoChunyu %add = add i64 %b, %a 43d624b921SLiaoChunyu %cmp = icmp ult i64 %add, %a 44d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 45d624b921SLiaoChunyu ret i64 %Q 46d624b921SLiaoChunyu} 47d624b921SLiaoChunyu 48d624b921SLiaoChunyudefine i64 @uaddo1_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp { 49d624b921SLiaoChunyu; RV32-LABEL: uaddo1_math_overflow_used: 50d624b921SLiaoChunyu; RV32: # %bb.0: 51d624b921SLiaoChunyu; RV32-NEXT: add a5, a3, a1 52d624b921SLiaoChunyu; RV32-NEXT: add a0, a2, a0 53d624b921SLiaoChunyu; RV32-NEXT: sltu a1, a0, a2 54d624b921SLiaoChunyu; RV32-NEXT: add a5, a5, a1 55d624b921SLiaoChunyu; RV32-NEXT: beq a5, a3, .LBB1_2 56d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 57d624b921SLiaoChunyu; RV32-NEXT: sltu a1, a5, a3 58d624b921SLiaoChunyu; RV32-NEXT: .LBB1_2: 59d624b921SLiaoChunyu; RV32-NEXT: bnez a1, .LBB1_4 60d624b921SLiaoChunyu; RV32-NEXT: # %bb.3: 61d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 62d624b921SLiaoChunyu; RV32-NEXT: .LBB1_4: 63d624b921SLiaoChunyu; RV32-NEXT: neg a1, a1 64d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 65d624b921SLiaoChunyu; RV32-NEXT: sw a0, 0(a4) 66d624b921SLiaoChunyu; RV32-NEXT: sw a5, 4(a4) 67d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 68d624b921SLiaoChunyu; RV32-NEXT: ret 69d624b921SLiaoChunyu; 70d624b921SLiaoChunyu; RV64-LABEL: uaddo1_math_overflow_used: 71d624b921SLiaoChunyu; RV64: # %bb.0: 72d624b921SLiaoChunyu; RV64-NEXT: add a0, a1, a0 73d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB1_2 74d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 75d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 76d624b921SLiaoChunyu; RV64-NEXT: .LBB1_2: 77d624b921SLiaoChunyu; RV64-NEXT: sd a0, 0(a2) 78d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 79d624b921SLiaoChunyu; RV64-NEXT: ret 80d624b921SLiaoChunyu %add = add i64 %b, %a 81d624b921SLiaoChunyu %cmp = icmp ult i64 %add, %a 82d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 83d624b921SLiaoChunyu store i64 %add, ptr %res 84d624b921SLiaoChunyu ret i64 %Q 85d624b921SLiaoChunyu} 86d624b921SLiaoChunyu 87d624b921SLiaoChunyudefine i64 @uaddo2_overflow_used(i64 %a, i64 %b) nounwind ssp { 88d624b921SLiaoChunyu; RV32-LABEL: uaddo2_overflow_used: 89d624b921SLiaoChunyu; RV32: # %bb.0: 90d624b921SLiaoChunyu; RV32-NEXT: add a1, a3, a1 91d624b921SLiaoChunyu; RV32-NEXT: add a0, a2, a0 92d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 93d624b921SLiaoChunyu; RV32-NEXT: add a1, a1, a0 94d624b921SLiaoChunyu; RV32-NEXT: beq a1, a3, .LBB2_2 95d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 96d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 97d624b921SLiaoChunyu; RV32-NEXT: .LBB2_2: 98d624b921SLiaoChunyu; RV32-NEXT: bnez a0, .LBB2_4 99d624b921SLiaoChunyu; RV32-NEXT: # %bb.3: 100d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 101d624b921SLiaoChunyu; RV32-NEXT: .LBB2_4: 102d624b921SLiaoChunyu; RV32-NEXT: neg a1, a0 103d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 104d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 105d624b921SLiaoChunyu; RV32-NEXT: ret 106d624b921SLiaoChunyu; 107d624b921SLiaoChunyu; RV64-LABEL: uaddo2_overflow_used: 108d624b921SLiaoChunyu; RV64: # %bb.0: 109d624b921SLiaoChunyu; RV64-NEXT: add a0, a1, a0 110d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB2_2 111d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 112d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 113d624b921SLiaoChunyu; RV64-NEXT: .LBB2_2: 114d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 115d624b921SLiaoChunyu; RV64-NEXT: ret 116d624b921SLiaoChunyu %add = add i64 %b, %a 117d624b921SLiaoChunyu %cmp = icmp ult i64 %add, %b 118d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 119d624b921SLiaoChunyu ret i64 %Q 120d624b921SLiaoChunyu} 121d624b921SLiaoChunyu 122d624b921SLiaoChunyudefine i64 @uaddo2_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp { 123d624b921SLiaoChunyu; RV32-LABEL: uaddo2_math_overflow_used: 124d624b921SLiaoChunyu; RV32: # %bb.0: 125d624b921SLiaoChunyu; RV32-NEXT: add a5, a3, a1 126d624b921SLiaoChunyu; RV32-NEXT: add a0, a2, a0 127d624b921SLiaoChunyu; RV32-NEXT: sltu a1, a0, a2 128d624b921SLiaoChunyu; RV32-NEXT: add a5, a5, a1 129d624b921SLiaoChunyu; RV32-NEXT: beq a5, a3, .LBB3_2 130d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 131d624b921SLiaoChunyu; RV32-NEXT: sltu a1, a5, a3 132d624b921SLiaoChunyu; RV32-NEXT: .LBB3_2: 133d624b921SLiaoChunyu; RV32-NEXT: bnez a1, .LBB3_4 134d624b921SLiaoChunyu; RV32-NEXT: # %bb.3: 135d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 136d624b921SLiaoChunyu; RV32-NEXT: .LBB3_4: 137d624b921SLiaoChunyu; RV32-NEXT: neg a1, a1 138d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 139d624b921SLiaoChunyu; RV32-NEXT: sw a0, 0(a4) 140d624b921SLiaoChunyu; RV32-NEXT: sw a5, 4(a4) 141d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 142d624b921SLiaoChunyu; RV32-NEXT: ret 143d624b921SLiaoChunyu; 144d624b921SLiaoChunyu; RV64-LABEL: uaddo2_math_overflow_used: 145d624b921SLiaoChunyu; RV64: # %bb.0: 146d624b921SLiaoChunyu; RV64-NEXT: add a0, a1, a0 147d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB3_2 148d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 149d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 150d624b921SLiaoChunyu; RV64-NEXT: .LBB3_2: 151d624b921SLiaoChunyu; RV64-NEXT: sd a0, 0(a2) 152d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 153d624b921SLiaoChunyu; RV64-NEXT: ret 154d624b921SLiaoChunyu %add = add i64 %b, %a 155d624b921SLiaoChunyu %cmp = icmp ult i64 %add, %b 156d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 157d624b921SLiaoChunyu store i64 %add, ptr %res 158d624b921SLiaoChunyu ret i64 %Q 159d624b921SLiaoChunyu} 160d624b921SLiaoChunyu 161d624b921SLiaoChunyudefine i64 @uaddo3_overflow_used(i64 %a, i64 %b) nounwind ssp { 162d624b921SLiaoChunyu; RV32-LABEL: uaddo3_overflow_used: 163d624b921SLiaoChunyu; RV32: # %bb.0: 164d624b921SLiaoChunyu; RV32-NEXT: add a1, a3, a1 165d624b921SLiaoChunyu; RV32-NEXT: add a0, a2, a0 166d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 167d624b921SLiaoChunyu; RV32-NEXT: add a1, a1, a0 168d624b921SLiaoChunyu; RV32-NEXT: beq a3, a1, .LBB4_2 169d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 170d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 171d624b921SLiaoChunyu; RV32-NEXT: .LBB4_2: 172d624b921SLiaoChunyu; RV32-NEXT: bnez a0, .LBB4_4 173d624b921SLiaoChunyu; RV32-NEXT: # %bb.3: 174d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 175d624b921SLiaoChunyu; RV32-NEXT: .LBB4_4: 176d624b921SLiaoChunyu; RV32-NEXT: neg a1, a0 177d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 178d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 179d624b921SLiaoChunyu; RV32-NEXT: ret 180d624b921SLiaoChunyu; 181d624b921SLiaoChunyu; RV64-LABEL: uaddo3_overflow_used: 182d624b921SLiaoChunyu; RV64: # %bb.0: 183d624b921SLiaoChunyu; RV64-NEXT: add a0, a1, a0 184d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB4_2 185d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 186d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 187d624b921SLiaoChunyu; RV64-NEXT: .LBB4_2: 188d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 189d624b921SLiaoChunyu; RV64-NEXT: ret 190d624b921SLiaoChunyu %add = add i64 %b, %a 191d624b921SLiaoChunyu %cmp = icmp ugt i64 %b, %add 192d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 193d624b921SLiaoChunyu ret i64 %Q 194d624b921SLiaoChunyu} 195d624b921SLiaoChunyu 196d624b921SLiaoChunyudefine i64 @uaddo3_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp { 197d624b921SLiaoChunyu; RV32-LABEL: uaddo3_math_overflow_used: 198d624b921SLiaoChunyu; RV32: # %bb.0: 199d624b921SLiaoChunyu; RV32-NEXT: add a5, a3, a1 200d624b921SLiaoChunyu; RV32-NEXT: add a0, a2, a0 201d624b921SLiaoChunyu; RV32-NEXT: sltu a1, a0, a2 202d624b921SLiaoChunyu; RV32-NEXT: add a5, a5, a1 203d624b921SLiaoChunyu; RV32-NEXT: beq a5, a3, .LBB5_2 204d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 205d624b921SLiaoChunyu; RV32-NEXT: sltu a1, a5, a3 206d624b921SLiaoChunyu; RV32-NEXT: .LBB5_2: 207d624b921SLiaoChunyu; RV32-NEXT: bnez a1, .LBB5_4 208d624b921SLiaoChunyu; RV32-NEXT: # %bb.3: 209d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 210d624b921SLiaoChunyu; RV32-NEXT: .LBB5_4: 211d624b921SLiaoChunyu; RV32-NEXT: neg a1, a1 212d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 213d624b921SLiaoChunyu; RV32-NEXT: sw a0, 0(a4) 214d624b921SLiaoChunyu; RV32-NEXT: sw a5, 4(a4) 215d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 216d624b921SLiaoChunyu; RV32-NEXT: ret 217d624b921SLiaoChunyu; 218d624b921SLiaoChunyu; RV64-LABEL: uaddo3_math_overflow_used: 219d624b921SLiaoChunyu; RV64: # %bb.0: 220d624b921SLiaoChunyu; RV64-NEXT: add a0, a1, a0 221d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB5_2 222d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 223d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 224d624b921SLiaoChunyu; RV64-NEXT: .LBB5_2: 225d624b921SLiaoChunyu; RV64-NEXT: sd a0, 0(a2) 226d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 227d624b921SLiaoChunyu; RV64-NEXT: ret 228d624b921SLiaoChunyu %add = add i64 %b, %a 229d624b921SLiaoChunyu %cmp = icmp ugt i64 %b, %add 230d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 231d624b921SLiaoChunyu store i64 %add, ptr %res 232d624b921SLiaoChunyu ret i64 %Q 233d624b921SLiaoChunyu} 234d624b921SLiaoChunyu 235d624b921SLiaoChunyu; TODO? CGP sinks the compare before we have a chance to form the overflow intrinsic. 236d624b921SLiaoChunyu 237d624b921SLiaoChunyudefine i64 @uaddo4(i64 %a, i64 %b, i1 %c) nounwind ssp { 238d624b921SLiaoChunyu; RV32-LABEL: uaddo4: 239d624b921SLiaoChunyu; RV32: # %bb.0: # %entry 240d624b921SLiaoChunyu; RV32-NEXT: andi a4, a4, 1 241d624b921SLiaoChunyu; RV32-NEXT: beqz a4, .LBB6_6 242d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: # %next 243d624b921SLiaoChunyu; RV32-NEXT: add a1, a3, a1 244d624b921SLiaoChunyu; RV32-NEXT: add a0, a2, a0 245d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 246d624b921SLiaoChunyu; RV32-NEXT: add a1, a1, a0 247d624b921SLiaoChunyu; RV32-NEXT: beq a3, a1, .LBB6_3 248d624b921SLiaoChunyu; RV32-NEXT: # %bb.2: # %next 249d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 250d624b921SLiaoChunyu; RV32-NEXT: .LBB6_3: # %next 251d624b921SLiaoChunyu; RV32-NEXT: bnez a0, .LBB6_5 252d624b921SLiaoChunyu; RV32-NEXT: # %bb.4: # %next 253d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 254d624b921SLiaoChunyu; RV32-NEXT: .LBB6_5: # %next 255d624b921SLiaoChunyu; RV32-NEXT: neg a1, a0 256d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 257d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 258d624b921SLiaoChunyu; RV32-NEXT: ret 259d624b921SLiaoChunyu; RV32-NEXT: .LBB6_6: # %exit 260d624b921SLiaoChunyu; RV32-NEXT: li a0, 0 261d624b921SLiaoChunyu; RV32-NEXT: li a1, 0 262d624b921SLiaoChunyu; RV32-NEXT: ret 263d624b921SLiaoChunyu; 264d624b921SLiaoChunyu; RV64-LABEL: uaddo4: 265d624b921SLiaoChunyu; RV64: # %bb.0: # %entry 266d624b921SLiaoChunyu; RV64-NEXT: andi a2, a2, 1 267d624b921SLiaoChunyu; RV64-NEXT: beqz a2, .LBB6_4 268d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: # %next 269d624b921SLiaoChunyu; RV64-NEXT: add a0, a1, a0 270d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB6_3 271d624b921SLiaoChunyu; RV64-NEXT: # %bb.2: # %next 272d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 273d624b921SLiaoChunyu; RV64-NEXT: .LBB6_3: # %next 274d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 275d624b921SLiaoChunyu; RV64-NEXT: ret 276d624b921SLiaoChunyu; RV64-NEXT: .LBB6_4: # %exit 277d624b921SLiaoChunyu; RV64-NEXT: li a0, 0 278d624b921SLiaoChunyu; RV64-NEXT: ret 279d624b921SLiaoChunyuentry: 280d624b921SLiaoChunyu %add = add i64 %b, %a 281d624b921SLiaoChunyu %cmp = icmp ugt i64 %b, %add 282d624b921SLiaoChunyu br i1 %c, label %next, label %exit 283d624b921SLiaoChunyu 284d624b921SLiaoChunyunext: 285d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 286d624b921SLiaoChunyu ret i64 %Q 287d624b921SLiaoChunyu 288d624b921SLiaoChunyuexit: 289d624b921SLiaoChunyu ret i64 0 290d624b921SLiaoChunyu} 291d624b921SLiaoChunyu 292d624b921SLiaoChunyudefine i64 @uaddo5(i64 %a, i64 %b, ptr %ptr, i1 %c) nounwind ssp { 293d624b921SLiaoChunyu; RV32-LABEL: uaddo5: 294d624b921SLiaoChunyu; RV32: # %bb.0: # %entry 295d624b921SLiaoChunyu; RV32-NEXT: andi a5, a5, 1 296d624b921SLiaoChunyu; RV32-NEXT: add a1, a3, a1 297d624b921SLiaoChunyu; RV32-NEXT: add a6, a2, a0 298d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a6, a2 299d624b921SLiaoChunyu; RV32-NEXT: add a1, a1, a0 300d624b921SLiaoChunyu; RV32-NEXT: sw a6, 0(a4) 301d624b921SLiaoChunyu; RV32-NEXT: sw a1, 4(a4) 302d624b921SLiaoChunyu; RV32-NEXT: beqz a5, .LBB7_6 303d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: # %next 304d624b921SLiaoChunyu; RV32-NEXT: beq a3, a1, .LBB7_3 305d624b921SLiaoChunyu; RV32-NEXT: # %bb.2: # %next 306d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 307d624b921SLiaoChunyu; RV32-NEXT: .LBB7_3: # %next 308d624b921SLiaoChunyu; RV32-NEXT: bnez a0, .LBB7_5 309d624b921SLiaoChunyu; RV32-NEXT: # %bb.4: # %next 310d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 311d624b921SLiaoChunyu; RV32-NEXT: .LBB7_5: # %next 312d624b921SLiaoChunyu; RV32-NEXT: neg a1, a0 313d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 314d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 315d624b921SLiaoChunyu; RV32-NEXT: ret 316d624b921SLiaoChunyu; RV32-NEXT: .LBB7_6: # %exit 317d624b921SLiaoChunyu; RV32-NEXT: li a0, 0 318d624b921SLiaoChunyu; RV32-NEXT: li a1, 0 319d624b921SLiaoChunyu; RV32-NEXT: ret 320d624b921SLiaoChunyu; 321d624b921SLiaoChunyu; RV64-LABEL: uaddo5: 322d624b921SLiaoChunyu; RV64: # %bb.0: # %entry 323d624b921SLiaoChunyu; RV64-NEXT: andi a3, a3, 1 324d624b921SLiaoChunyu; RV64-NEXT: add a0, a1, a0 325d624b921SLiaoChunyu; RV64-NEXT: sd a0, 0(a2) 326d624b921SLiaoChunyu; RV64-NEXT: beqz a3, .LBB7_4 327d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: # %next 328d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB7_3 329d624b921SLiaoChunyu; RV64-NEXT: # %bb.2: # %next 330d624b921SLiaoChunyu; RV64-NEXT: li a1, 42 331d624b921SLiaoChunyu; RV64-NEXT: .LBB7_3: # %next 332d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 333d624b921SLiaoChunyu; RV64-NEXT: ret 334d624b921SLiaoChunyu; RV64-NEXT: .LBB7_4: # %exit 335d624b921SLiaoChunyu; RV64-NEXT: li a0, 0 336d624b921SLiaoChunyu; RV64-NEXT: ret 337d624b921SLiaoChunyuentry: 338d624b921SLiaoChunyu %add = add i64 %b, %a 339d624b921SLiaoChunyu store i64 %add, ptr %ptr 340d624b921SLiaoChunyu %cmp = icmp ugt i64 %b, %add 341d624b921SLiaoChunyu br i1 %c, label %next, label %exit 342d624b921SLiaoChunyu 343d624b921SLiaoChunyunext: 344d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 345d624b921SLiaoChunyu ret i64 %Q 346d624b921SLiaoChunyu 347d624b921SLiaoChunyuexit: 348d624b921SLiaoChunyu ret i64 0 349d624b921SLiaoChunyu} 350d624b921SLiaoChunyu 351d624b921SLiaoChunyu; Instcombine folds (a + b <u a) to (a ^ -1 <u b). Make sure we match this 352d624b921SLiaoChunyu; pattern as well. 353d624b921SLiaoChunyudefine i64 @uaddo6_xor(i64 %a, i64 %b) { 354d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor: 355d624b921SLiaoChunyu; RV32: # %bb.0: 356d624b921SLiaoChunyu; RV32-NEXT: not a1, a1 357d624b921SLiaoChunyu; RV32-NEXT: beq a1, a3, .LBB8_2 358d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 359d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 360d624b921SLiaoChunyu; RV32-NEXT: beqz a0, .LBB8_3 361d624b921SLiaoChunyu; RV32-NEXT: j .LBB8_4 362d624b921SLiaoChunyu; RV32-NEXT: .LBB8_2: 363d624b921SLiaoChunyu; RV32-NEXT: not a0, a0 364d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 365d624b921SLiaoChunyu; RV32-NEXT: bnez a0, .LBB8_4 366d624b921SLiaoChunyu; RV32-NEXT: .LBB8_3: 367d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 368d624b921SLiaoChunyu; RV32-NEXT: .LBB8_4: 369d624b921SLiaoChunyu; RV32-NEXT: neg a1, a0 370d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 371d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 372d624b921SLiaoChunyu; RV32-NEXT: ret 373d624b921SLiaoChunyu; 374d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor: 375d624b921SLiaoChunyu; RV64: # %bb.0: 376d624b921SLiaoChunyu; RV64-NEXT: not a2, a0 377d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 378d624b921SLiaoChunyu; RV64-NEXT: bltu a2, a1, .LBB8_2 379d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 380d624b921SLiaoChunyu; RV64-NEXT: li a0, 42 381d624b921SLiaoChunyu; RV64-NEXT: .LBB8_2: 382d624b921SLiaoChunyu; RV64-NEXT: ret 383d624b921SLiaoChunyu %x = xor i64 %a, -1 384d624b921SLiaoChunyu %cmp = icmp ult i64 %x, %b 385d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 386d624b921SLiaoChunyu ret i64 %Q 387d624b921SLiaoChunyu} 388d624b921SLiaoChunyu 389d624b921SLiaoChunyudefine i64 @uaddo6_xor_commuted(i64 %a, i64 %b) { 390d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor_commuted: 391d624b921SLiaoChunyu; RV32: # %bb.0: 392d624b921SLiaoChunyu; RV32-NEXT: not a1, a1 393d624b921SLiaoChunyu; RV32-NEXT: beq a1, a3, .LBB9_2 394d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 395d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 396d624b921SLiaoChunyu; RV32-NEXT: beqz a0, .LBB9_3 397d624b921SLiaoChunyu; RV32-NEXT: j .LBB9_4 398d624b921SLiaoChunyu; RV32-NEXT: .LBB9_2: 399d624b921SLiaoChunyu; RV32-NEXT: not a0, a0 400d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 401d624b921SLiaoChunyu; RV32-NEXT: bnez a0, .LBB9_4 402d624b921SLiaoChunyu; RV32-NEXT: .LBB9_3: 403d624b921SLiaoChunyu; RV32-NEXT: li a2, 42 404d624b921SLiaoChunyu; RV32-NEXT: .LBB9_4: 405d624b921SLiaoChunyu; RV32-NEXT: neg a1, a0 406d624b921SLiaoChunyu; RV32-NEXT: and a1, a1, a3 407d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 408d624b921SLiaoChunyu; RV32-NEXT: ret 409d624b921SLiaoChunyu; 410d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor_commuted: 411d624b921SLiaoChunyu; RV64: # %bb.0: 412d624b921SLiaoChunyu; RV64-NEXT: not a2, a0 413d624b921SLiaoChunyu; RV64-NEXT: mv a0, a1 414d624b921SLiaoChunyu; RV64-NEXT: bltu a2, a1, .LBB9_2 415d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 416d624b921SLiaoChunyu; RV64-NEXT: li a0, 42 417d624b921SLiaoChunyu; RV64-NEXT: .LBB9_2: 418d624b921SLiaoChunyu; RV64-NEXT: ret 419d624b921SLiaoChunyu %x = xor i64 %a, -1 420d624b921SLiaoChunyu %cmp = icmp ult i64 %x, %b 421d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 422d624b921SLiaoChunyu ret i64 %Q 423d624b921SLiaoChunyu} 424d624b921SLiaoChunyu 425d624b921SLiaoChunyudeclare void @use(i64) 426d624b921SLiaoChunyu 427d624b921SLiaoChunyudefine i64 @uaddo6_xor_multi_use(i64 %a, i64 %b) { 428d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor_multi_use: 429d624b921SLiaoChunyu; RV32: # %bb.0: 430d624b921SLiaoChunyu; RV32-NEXT: addi sp, sp, -16 431d624b921SLiaoChunyu; RV32-NEXT: .cfi_def_cfa_offset 16 432d624b921SLiaoChunyu; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 433d624b921SLiaoChunyu; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 434d624b921SLiaoChunyu; RV32-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 435d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset ra, -4 436d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s0, -8 437d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s1, -12 438d624b921SLiaoChunyu; RV32-NEXT: mv s0, a2 439d624b921SLiaoChunyu; RV32-NEXT: not a1, a1 440d624b921SLiaoChunyu; RV32-NEXT: not a0, a0 441d624b921SLiaoChunyu; RV32-NEXT: beq a1, a3, .LBB10_2 442d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 443d624b921SLiaoChunyu; RV32-NEXT: sltu a2, a1, a3 444d624b921SLiaoChunyu; RV32-NEXT: beqz a2, .LBB10_3 445d624b921SLiaoChunyu; RV32-NEXT: j .LBB10_4 446d624b921SLiaoChunyu; RV32-NEXT: .LBB10_2: 447d624b921SLiaoChunyu; RV32-NEXT: sltu a2, a0, s0 448d624b921SLiaoChunyu; RV32-NEXT: bnez a2, .LBB10_4 449d624b921SLiaoChunyu; RV32-NEXT: .LBB10_3: 450d624b921SLiaoChunyu; RV32-NEXT: li s0, 42 451d624b921SLiaoChunyu; RV32-NEXT: .LBB10_4: 452d624b921SLiaoChunyu; RV32-NEXT: neg s1, a2 453d624b921SLiaoChunyu; RV32-NEXT: and s1, s1, a3 454eabaee0cSFangrui Song; RV32-NEXT: call use 455d624b921SLiaoChunyu; RV32-NEXT: mv a0, s0 456d624b921SLiaoChunyu; RV32-NEXT: mv a1, s1 457d624b921SLiaoChunyu; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 458d624b921SLiaoChunyu; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 459d624b921SLiaoChunyu; RV32-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 46097982a8cSdlav-sc; RV32-NEXT: .cfi_restore ra 46197982a8cSdlav-sc; RV32-NEXT: .cfi_restore s0 46297982a8cSdlav-sc; RV32-NEXT: .cfi_restore s1 463d624b921SLiaoChunyu; RV32-NEXT: addi sp, sp, 16 46497982a8cSdlav-sc; RV32-NEXT: .cfi_def_cfa_offset 0 465d624b921SLiaoChunyu; RV32-NEXT: ret 466d624b921SLiaoChunyu; 467d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor_multi_use: 468d624b921SLiaoChunyu; RV64: # %bb.0: 469d624b921SLiaoChunyu; RV64-NEXT: addi sp, sp, -16 470d624b921SLiaoChunyu; RV64-NEXT: .cfi_def_cfa_offset 16 471d624b921SLiaoChunyu; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 472d624b921SLiaoChunyu; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 473d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset ra, -8 474d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset s0, -16 475d624b921SLiaoChunyu; RV64-NEXT: not a0, a0 476d624b921SLiaoChunyu; RV64-NEXT: mv s0, a1 477d624b921SLiaoChunyu; RV64-NEXT: bltu a0, a1, .LBB10_2 478d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: 479d624b921SLiaoChunyu; RV64-NEXT: li s0, 42 480d624b921SLiaoChunyu; RV64-NEXT: .LBB10_2: 481eabaee0cSFangrui Song; RV64-NEXT: call use 482d624b921SLiaoChunyu; RV64-NEXT: mv a0, s0 483d624b921SLiaoChunyu; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 484d624b921SLiaoChunyu; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 48597982a8cSdlav-sc; RV64-NEXT: .cfi_restore ra 48697982a8cSdlav-sc; RV64-NEXT: .cfi_restore s0 487d624b921SLiaoChunyu; RV64-NEXT: addi sp, sp, 16 48897982a8cSdlav-sc; RV64-NEXT: .cfi_def_cfa_offset 0 489d624b921SLiaoChunyu; RV64-NEXT: ret 490d624b921SLiaoChunyu %x = xor i64 -1, %a 491d624b921SLiaoChunyu %cmp = icmp ult i64 %x, %b 492d624b921SLiaoChunyu %Q = select i1 %cmp, i64 %b, i64 42 493d624b921SLiaoChunyu call void @use(i64 %x) 494d624b921SLiaoChunyu ret i64 %Q 495d624b921SLiaoChunyu} 496d624b921SLiaoChunyu 497d624b921SLiaoChunyu; Make sure we do not use the XOR binary operator as insert point, as it may 498d624b921SLiaoChunyu; come before the second operand of the overflow intrinsic. 499d624b921SLiaoChunyudefine i1 @uaddo6_xor_op_after_XOR(i32 %a, ptr %b.ptr) { 500d624b921SLiaoChunyu; RV32-LABEL: uaddo6_xor_op_after_XOR: 501d624b921SLiaoChunyu; RV32: # %bb.0: 502d624b921SLiaoChunyu; RV32-NEXT: lw a1, 0(a1) 503d624b921SLiaoChunyu; RV32-NEXT: not a0, a0 504d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a1 505d624b921SLiaoChunyu; RV32-NEXT: xori a0, a0, 1 506d624b921SLiaoChunyu; RV32-NEXT: ret 507d624b921SLiaoChunyu; 508d624b921SLiaoChunyu; RV64-LABEL: uaddo6_xor_op_after_XOR: 509d624b921SLiaoChunyu; RV64: # %bb.0: 510d624b921SLiaoChunyu; RV64-NEXT: lw a1, 0(a1) 511d624b921SLiaoChunyu; RV64-NEXT: not a0, a0 512d624b921SLiaoChunyu; RV64-NEXT: sext.w a0, a0 513d624b921SLiaoChunyu; RV64-NEXT: sltu a0, a0, a1 514d624b921SLiaoChunyu; RV64-NEXT: xori a0, a0, 1 515d624b921SLiaoChunyu; RV64-NEXT: ret 516d624b921SLiaoChunyu %x = xor i32 %a, -1 517d624b921SLiaoChunyu %b = load i32, ptr %b.ptr, align 8 518d624b921SLiaoChunyu %cmp14 = icmp ugt i32 %b, %x 519d624b921SLiaoChunyu %ov = xor i1 %cmp14, true 520d624b921SLiaoChunyu ret i1 %ov 521d624b921SLiaoChunyu} 522d624b921SLiaoChunyu 523d624b921SLiaoChunyu; When adding 1, the general pattern for add-overflow may be different due to icmp canonicalization. 524d624b921SLiaoChunyu; PR31754: https://bugs.llvm.org/show_bug.cgi?id=31754 525d624b921SLiaoChunyu 526d624b921SLiaoChunyudefine i1 @uaddo_i64_increment(i64 %x, ptr %p) { 527d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_increment: 528d624b921SLiaoChunyu; RV32: # %bb.0: 5292fc5a511SCraig Topper; RV32-NEXT: addi a3, a0, 1 530230e6165SCraig Topper; RV32-NEXT: seqz a0, a3 5312fc5a511SCraig Topper; RV32-NEXT: add a1, a1, a0 5322fc5a511SCraig Topper; RV32-NEXT: or a0, a3, a1 5332fc5a511SCraig Topper; RV32-NEXT: seqz a0, a0 5342fc5a511SCraig Topper; RV32-NEXT: sw a3, 0(a2) 5352fc5a511SCraig Topper; RV32-NEXT: sw a1, 4(a2) 536d624b921SLiaoChunyu; RV32-NEXT: ret 537d624b921SLiaoChunyu; 538d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_increment: 539d624b921SLiaoChunyu; RV64: # %bb.0: 540d624b921SLiaoChunyu; RV64-NEXT: addi a2, a0, 1 541d624b921SLiaoChunyu; RV64-NEXT: seqz a0, a2 542d624b921SLiaoChunyu; RV64-NEXT: sd a2, 0(a1) 543d624b921SLiaoChunyu; RV64-NEXT: ret 544d624b921SLiaoChunyu %a = add i64 %x, 1 545d624b921SLiaoChunyu %ov = icmp eq i64 %a, 0 546d624b921SLiaoChunyu store i64 %a, ptr %p 547d624b921SLiaoChunyu ret i1 %ov 548d624b921SLiaoChunyu} 549d624b921SLiaoChunyu 550d624b921SLiaoChunyudefine i1 @uaddo_i8_increment_noncanonical_1(i8 %x, ptr %p) { 551d624b921SLiaoChunyu; RV32-LABEL: uaddo_i8_increment_noncanonical_1: 552d624b921SLiaoChunyu; RV32: # %bb.0: 553d624b921SLiaoChunyu; RV32-NEXT: addi a2, a0, 1 554d624b921SLiaoChunyu; RV32-NEXT: andi a0, a2, 255 555eb54254bSLiaoChunyu; RV32-NEXT: seqz a0, a0 556d624b921SLiaoChunyu; RV32-NEXT: sb a2, 0(a1) 557d624b921SLiaoChunyu; RV32-NEXT: ret 558d624b921SLiaoChunyu; 559d624b921SLiaoChunyu; RV64-LABEL: uaddo_i8_increment_noncanonical_1: 560d624b921SLiaoChunyu; RV64: # %bb.0: 56186240751SPhilip Reames; RV64-NEXT: addi a2, a0, 1 562d624b921SLiaoChunyu; RV64-NEXT: andi a0, a2, 255 563eb54254bSLiaoChunyu; RV64-NEXT: seqz a0, a0 564d624b921SLiaoChunyu; RV64-NEXT: sb a2, 0(a1) 565d624b921SLiaoChunyu; RV64-NEXT: ret 566d624b921SLiaoChunyu %a = add i8 1, %x ; commute 567d624b921SLiaoChunyu %ov = icmp eq i8 %a, 0 568d624b921SLiaoChunyu store i8 %a, ptr %p 569d624b921SLiaoChunyu ret i1 %ov 570d624b921SLiaoChunyu} 571d624b921SLiaoChunyu 572d624b921SLiaoChunyudefine i1 @uaddo_i32_increment_noncanonical_2(i32 %x, ptr %p) { 573d624b921SLiaoChunyu; RV32-LABEL: uaddo_i32_increment_noncanonical_2: 574d624b921SLiaoChunyu; RV32: # %bb.0: 575d624b921SLiaoChunyu; RV32-NEXT: addi a2, a0, 1 576d624b921SLiaoChunyu; RV32-NEXT: seqz a0, a2 577d624b921SLiaoChunyu; RV32-NEXT: sw a2, 0(a1) 578d624b921SLiaoChunyu; RV32-NEXT: ret 579d624b921SLiaoChunyu; 580d624b921SLiaoChunyu; RV64-LABEL: uaddo_i32_increment_noncanonical_2: 581d624b921SLiaoChunyu; RV64: # %bb.0: 582d624b921SLiaoChunyu; RV64-NEXT: addiw a2, a0, 1 583d624b921SLiaoChunyu; RV64-NEXT: seqz a0, a2 584d624b921SLiaoChunyu; RV64-NEXT: sw a2, 0(a1) 585d624b921SLiaoChunyu; RV64-NEXT: ret 586d624b921SLiaoChunyu %a = add i32 %x, 1 587d624b921SLiaoChunyu %ov = icmp eq i32 0, %a ; commute 588d624b921SLiaoChunyu store i32 %a, ptr %p 589d624b921SLiaoChunyu ret i1 %ov 590d624b921SLiaoChunyu} 591d624b921SLiaoChunyu 592d624b921SLiaoChunyudefine i1 @uaddo_i16_increment_noncanonical_3(i16 %x, ptr %p) { 593d624b921SLiaoChunyu; RV32-LABEL: uaddo_i16_increment_noncanonical_3: 594d624b921SLiaoChunyu; RV32: # %bb.0: 595eb54254bSLiaoChunyu; RV32-NEXT: addi a2, a0, 1 596eb54254bSLiaoChunyu; RV32-NEXT: slli a0, a2, 16 597eb54254bSLiaoChunyu; RV32-NEXT: srli a0, a0, 16 598eb54254bSLiaoChunyu; RV32-NEXT: seqz a0, a0 599eb54254bSLiaoChunyu; RV32-NEXT: sh a2, 0(a1) 600d624b921SLiaoChunyu; RV32-NEXT: ret 601d624b921SLiaoChunyu; 602d624b921SLiaoChunyu; RV64-LABEL: uaddo_i16_increment_noncanonical_3: 603d624b921SLiaoChunyu; RV64: # %bb.0: 60486240751SPhilip Reames; RV64-NEXT: addi a2, a0, 1 605eb54254bSLiaoChunyu; RV64-NEXT: slli a0, a2, 48 606eb54254bSLiaoChunyu; RV64-NEXT: srli a0, a0, 48 607eb54254bSLiaoChunyu; RV64-NEXT: seqz a0, a0 608eb54254bSLiaoChunyu; RV64-NEXT: sh a2, 0(a1) 609d624b921SLiaoChunyu; RV64-NEXT: ret 610d624b921SLiaoChunyu %a = add i16 1, %x ; commute 611d624b921SLiaoChunyu %ov = icmp eq i16 0, %a ; commute 612d624b921SLiaoChunyu store i16 %a, ptr %p 613d624b921SLiaoChunyu ret i1 %ov 614d624b921SLiaoChunyu} 615d624b921SLiaoChunyu 616d624b921SLiaoChunyu; The overflow check may be against the input rather than the sum. 617d624b921SLiaoChunyu 618d624b921SLiaoChunyudefine i1 @uaddo_i64_increment_alt(i64 %x, ptr %p) { 619d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_increment_alt: 620d624b921SLiaoChunyu; RV32: # %bb.0: 621d624b921SLiaoChunyu; RV32-NEXT: addi a3, a0, 1 622697a28b3SCraig Topper; RV32-NEXT: seqz a0, a3 623697a28b3SCraig Topper; RV32-NEXT: add a1, a1, a0 624697a28b3SCraig Topper; RV32-NEXT: or a0, a3, a1 625d624b921SLiaoChunyu; RV32-NEXT: seqz a0, a0 626697a28b3SCraig Topper; RV32-NEXT: sw a3, 0(a2) 627697a28b3SCraig Topper; RV32-NEXT: sw a1, 4(a2) 628d624b921SLiaoChunyu; RV32-NEXT: ret 629d624b921SLiaoChunyu; 630d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_increment_alt: 631d624b921SLiaoChunyu; RV64: # %bb.0: 632d624b921SLiaoChunyu; RV64-NEXT: addi a2, a0, 1 633d624b921SLiaoChunyu; RV64-NEXT: seqz a0, a2 634d624b921SLiaoChunyu; RV64-NEXT: sd a2, 0(a1) 635d624b921SLiaoChunyu; RV64-NEXT: ret 636d624b921SLiaoChunyu %a = add i64 %x, 1 637d624b921SLiaoChunyu store i64 %a, ptr %p 638d624b921SLiaoChunyu %ov = icmp eq i64 %x, -1 639d624b921SLiaoChunyu ret i1 %ov 640d624b921SLiaoChunyu} 641d624b921SLiaoChunyu 642d624b921SLiaoChunyu; Make sure insertion is done correctly based on dominance. 643d624b921SLiaoChunyu 644d624b921SLiaoChunyudefine i1 @uaddo_i64_increment_alt_dom(i64 %x, ptr %p) { 645d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_increment_alt_dom: 646d624b921SLiaoChunyu; RV32: # %bb.0: 647697a28b3SCraig Topper; RV32-NEXT: addi a3, a0, 1 648697a28b3SCraig Topper; RV32-NEXT: seqz a0, a3 649697a28b3SCraig Topper; RV32-NEXT: add a1, a1, a0 650697a28b3SCraig Topper; RV32-NEXT: or a0, a3, a1 651697a28b3SCraig Topper; RV32-NEXT: seqz a0, a0 652697a28b3SCraig Topper; RV32-NEXT: sw a3, 0(a2) 653230e6165SCraig Topper; RV32-NEXT: sw a1, 4(a2) 654d624b921SLiaoChunyu; RV32-NEXT: ret 655d624b921SLiaoChunyu; 656d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_increment_alt_dom: 657d624b921SLiaoChunyu; RV64: # %bb.0: 658d624b921SLiaoChunyu; RV64-NEXT: addi a2, a0, 1 659d624b921SLiaoChunyu; RV64-NEXT: seqz a0, a2 660d624b921SLiaoChunyu; RV64-NEXT: sd a2, 0(a1) 661d624b921SLiaoChunyu; RV64-NEXT: ret 662d624b921SLiaoChunyu %ov = icmp eq i64 %x, -1 663d624b921SLiaoChunyu %a = add i64 %x, 1 664d624b921SLiaoChunyu store i64 %a, ptr %p 665d624b921SLiaoChunyu ret i1 %ov 666d624b921SLiaoChunyu} 667d624b921SLiaoChunyu 668d624b921SLiaoChunyu; The overflow check may be against the input rather than the sum. 669d624b921SLiaoChunyu 670e15dbda9SCraig Topperdefine i1 @uaddo_i32_decrement_alt(i32 signext %x, ptr %p) { 671e15dbda9SCraig Topper; RV32-LABEL: uaddo_i32_decrement_alt: 672e15dbda9SCraig Topper; RV32: # %bb.0: 673e15dbda9SCraig Topper; RV32-NEXT: snez a2, a0 674e15dbda9SCraig Topper; RV32-NEXT: addi a0, a0, -1 675e15dbda9SCraig Topper; RV32-NEXT: sw a0, 0(a1) 676e15dbda9SCraig Topper; RV32-NEXT: mv a0, a2 677e15dbda9SCraig Topper; RV32-NEXT: ret 678e15dbda9SCraig Topper; 679e15dbda9SCraig Topper; RV64-LABEL: uaddo_i32_decrement_alt: 680e15dbda9SCraig Topper; RV64: # %bb.0: 681241ad16eSCraig Topper; RV64-NEXT: snez a2, a0 68286240751SPhilip Reames; RV64-NEXT: addi a0, a0, -1 683241ad16eSCraig Topper; RV64-NEXT: sw a0, 0(a1) 684241ad16eSCraig Topper; RV64-NEXT: mv a0, a2 685e15dbda9SCraig Topper; RV64-NEXT: ret 686e15dbda9SCraig Topper %a = add i32 %x, -1 687e15dbda9SCraig Topper store i32 %a, ptr %p 688e15dbda9SCraig Topper %ov = icmp ne i32 %x, 0 689e15dbda9SCraig Topper ret i1 %ov 690e15dbda9SCraig Topper} 691e15dbda9SCraig Topper 692d624b921SLiaoChunyudefine i1 @uaddo_i64_decrement_alt(i64 %x, ptr %p) { 693d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_decrement_alt: 694d624b921SLiaoChunyu; RV32: # %bb.0: 695c9e4d9a8SCraig Topper; RV32-NEXT: or a3, a0, a1 696697a28b3SCraig Topper; RV32-NEXT: seqz a4, a0 697*9122c523SPengcheng Wang; RV32-NEXT: addi a5, a0, -1 698*9122c523SPengcheng Wang; RV32-NEXT: snez a0, a3 699c9e4d9a8SCraig Topper; RV32-NEXT: sub a1, a1, a4 700*9122c523SPengcheng Wang; RV32-NEXT: sw a5, 0(a2) 701c9e4d9a8SCraig Topper; RV32-NEXT: sw a1, 4(a2) 702d624b921SLiaoChunyu; RV32-NEXT: ret 703d624b921SLiaoChunyu; 704d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_decrement_alt: 705d624b921SLiaoChunyu; RV64: # %bb.0: 706c9e4d9a8SCraig Topper; RV64-NEXT: snez a2, a0 707c9e4d9a8SCraig Topper; RV64-NEXT: addi a0, a0, -1 708c9e4d9a8SCraig Topper; RV64-NEXT: sd a0, 0(a1) 709c9e4d9a8SCraig Topper; RV64-NEXT: mv a0, a2 710d624b921SLiaoChunyu; RV64-NEXT: ret 711d624b921SLiaoChunyu %a = add i64 %x, -1 712d624b921SLiaoChunyu store i64 %a, ptr %p 713d624b921SLiaoChunyu %ov = icmp ne i64 %x, 0 714d624b921SLiaoChunyu ret i1 %ov 715d624b921SLiaoChunyu} 716d624b921SLiaoChunyu 717d624b921SLiaoChunyu; Make sure insertion is done correctly based on dominance. 718d624b921SLiaoChunyu 719d624b921SLiaoChunyudefine i1 @uaddo_i64_decrement_alt_dom(i64 %x, ptr %p) { 720d624b921SLiaoChunyu; RV32-LABEL: uaddo_i64_decrement_alt_dom: 721d624b921SLiaoChunyu; RV32: # %bb.0: 722c9e4d9a8SCraig Topper; RV32-NEXT: or a3, a0, a1 72324847a90SLiaoChunyu; RV32-NEXT: seqz a4, a0 724*9122c523SPengcheng Wang; RV32-NEXT: addi a5, a0, -1 725*9122c523SPengcheng Wang; RV32-NEXT: snez a0, a3 726c9e4d9a8SCraig Topper; RV32-NEXT: sub a1, a1, a4 727*9122c523SPengcheng Wang; RV32-NEXT: sw a5, 0(a2) 728c9e4d9a8SCraig Topper; RV32-NEXT: sw a1, 4(a2) 729d624b921SLiaoChunyu; RV32-NEXT: ret 730d624b921SLiaoChunyu; 731d624b921SLiaoChunyu; RV64-LABEL: uaddo_i64_decrement_alt_dom: 732d624b921SLiaoChunyu; RV64: # %bb.0: 733c9e4d9a8SCraig Topper; RV64-NEXT: snez a2, a0 734c9e4d9a8SCraig Topper; RV64-NEXT: addi a0, a0, -1 735c9e4d9a8SCraig Topper; RV64-NEXT: sd a0, 0(a1) 736c9e4d9a8SCraig Topper; RV64-NEXT: mv a0, a2 737d624b921SLiaoChunyu; RV64-NEXT: ret 738d624b921SLiaoChunyu %ov = icmp ne i64 %x, 0 739d624b921SLiaoChunyu %a = add i64 %x, -1 740d624b921SLiaoChunyu store i64 %a, ptr %p 741d624b921SLiaoChunyu ret i1 %ov 742d624b921SLiaoChunyu} 743d624b921SLiaoChunyu 744d624b921SLiaoChunyu; No transform for illegal types. 745d624b921SLiaoChunyu 746d624b921SLiaoChunyudefine i1 @uaddo_i42_increment_illegal_type(i42 %x, ptr %p) { 747d624b921SLiaoChunyu; RV32-LABEL: uaddo_i42_increment_illegal_type: 748d624b921SLiaoChunyu; RV32: # %bb.0: 749d624b921SLiaoChunyu; RV32-NEXT: addi a3, a0, 1 750230e6165SCraig Topper; RV32-NEXT: seqz a0, a3 751d624b921SLiaoChunyu; RV32-NEXT: add a0, a1, a0 752d624b921SLiaoChunyu; RV32-NEXT: andi a1, a0, 1023 753d624b921SLiaoChunyu; RV32-NEXT: or a0, a3, a1 754d624b921SLiaoChunyu; RV32-NEXT: seqz a0, a0 755d624b921SLiaoChunyu; RV32-NEXT: sw a3, 0(a2) 756d624b921SLiaoChunyu; RV32-NEXT: sh a1, 4(a2) 757d624b921SLiaoChunyu; RV32-NEXT: ret 758d624b921SLiaoChunyu; 759d624b921SLiaoChunyu; RV64-LABEL: uaddo_i42_increment_illegal_type: 760d624b921SLiaoChunyu; RV64: # %bb.0: 761d624b921SLiaoChunyu; RV64-NEXT: addi a2, a0, 1 762d624b921SLiaoChunyu; RV64-NEXT: slli a0, a2, 22 763d624b921SLiaoChunyu; RV64-NEXT: srli a3, a0, 22 764d624b921SLiaoChunyu; RV64-NEXT: seqz a0, a3 765d624b921SLiaoChunyu; RV64-NEXT: srli a3, a3, 32 7662967e5f8SAlex Bradbury; RV64-NEXT: sw a2, 0(a1) 767d624b921SLiaoChunyu; RV64-NEXT: sh a3, 4(a1) 768d624b921SLiaoChunyu; RV64-NEXT: ret 769d624b921SLiaoChunyu %a = add i42 %x, 1 770d624b921SLiaoChunyu %ov = icmp eq i42 %a, 0 771d624b921SLiaoChunyu store i42 %a, ptr %p 772d624b921SLiaoChunyu ret i1 %ov 773d624b921SLiaoChunyu} 774d624b921SLiaoChunyu 775d624b921SLiaoChunyudefine i1 @usubo_ult_i64_overflow_used(i64 %x, i64 %y, ptr %p) { 776d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_i64_overflow_used: 777d624b921SLiaoChunyu; RV32: # %bb.0: 778e15dbda9SCraig Topper; RV32-NEXT: beq a1, a3, .LBB22_2 779d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 780d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 781d624b921SLiaoChunyu; RV32-NEXT: ret 782e15dbda9SCraig Topper; RV32-NEXT: .LBB22_2: 783d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 784d624b921SLiaoChunyu; RV32-NEXT: ret 785d624b921SLiaoChunyu; 786d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_i64_overflow_used: 787d624b921SLiaoChunyu; RV64: # %bb.0: 788d624b921SLiaoChunyu; RV64-NEXT: sltu a0, a0, a1 789d624b921SLiaoChunyu; RV64-NEXT: ret 790d624b921SLiaoChunyu %s = sub i64 %x, %y 791d624b921SLiaoChunyu %ov = icmp ult i64 %x, %y 792d624b921SLiaoChunyu ret i1 %ov 793d624b921SLiaoChunyu} 794d624b921SLiaoChunyu 795d624b921SLiaoChunyudefine i1 @usubo_ult_i64_math_overflow_used(i64 %x, i64 %y, ptr %p) { 796d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_i64_math_overflow_used: 797d624b921SLiaoChunyu; RV32: # %bb.0: 798d624b921SLiaoChunyu; RV32-NEXT: mv a5, a0 799d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 800d624b921SLiaoChunyu; RV32-NEXT: sub a6, a1, a3 801d624b921SLiaoChunyu; RV32-NEXT: sub a5, a5, a2 802*9122c523SPengcheng Wang; RV32-NEXT: sub a2, a6, a0 803d624b921SLiaoChunyu; RV32-NEXT: sw a5, 0(a4) 804*9122c523SPengcheng Wang; RV32-NEXT: sw a2, 4(a4) 805e15dbda9SCraig Topper; RV32-NEXT: beq a1, a3, .LBB23_2 806d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: 807d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 808e15dbda9SCraig Topper; RV32-NEXT: .LBB23_2: 809d624b921SLiaoChunyu; RV32-NEXT: ret 810d624b921SLiaoChunyu; 811d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_i64_math_overflow_used: 812d624b921SLiaoChunyu; RV64: # %bb.0: 813d624b921SLiaoChunyu; RV64-NEXT: sub a3, a0, a1 814d624b921SLiaoChunyu; RV64-NEXT: sltu a0, a0, a1 815d624b921SLiaoChunyu; RV64-NEXT: sd a3, 0(a2) 816d624b921SLiaoChunyu; RV64-NEXT: ret 817d624b921SLiaoChunyu %s = sub i64 %x, %y 818d624b921SLiaoChunyu store i64 %s, ptr %p 819d624b921SLiaoChunyu %ov = icmp ult i64 %x, %y 820d624b921SLiaoChunyu ret i1 %ov 821d624b921SLiaoChunyu} 822d624b921SLiaoChunyu 823d624b921SLiaoChunyu; Verify insertion point for single-BB. Toggle predicate. 824d624b921SLiaoChunyu 825d624b921SLiaoChunyudefine i1 @usubo_ugt_i32(i32 %x, i32 %y, ptr %p) { 826d624b921SLiaoChunyu; RV32-LABEL: usubo_ugt_i32: 827d624b921SLiaoChunyu; RV32: # %bb.0: 828d624b921SLiaoChunyu; RV32-NEXT: sltu a3, a0, a1 829d624b921SLiaoChunyu; RV32-NEXT: sub a0, a0, a1 830d624b921SLiaoChunyu; RV32-NEXT: sw a0, 0(a2) 831d624b921SLiaoChunyu; RV32-NEXT: mv a0, a3 832d624b921SLiaoChunyu; RV32-NEXT: ret 833d624b921SLiaoChunyu; 834d624b921SLiaoChunyu; RV64-LABEL: usubo_ugt_i32: 835d624b921SLiaoChunyu; RV64: # %bb.0: 836d624b921SLiaoChunyu; RV64-NEXT: sext.w a3, a1 837d624b921SLiaoChunyu; RV64-NEXT: sext.w a4, a0 838d624b921SLiaoChunyu; RV64-NEXT: sltu a3, a4, a3 839d624b921SLiaoChunyu; RV64-NEXT: subw a0, a0, a1 840d624b921SLiaoChunyu; RV64-NEXT: sw a0, 0(a2) 841d624b921SLiaoChunyu; RV64-NEXT: mv a0, a3 842d624b921SLiaoChunyu; RV64-NEXT: ret 843d624b921SLiaoChunyu %ov = icmp ugt i32 %y, %x 844d624b921SLiaoChunyu %s = sub i32 %x, %y 845d624b921SLiaoChunyu store i32 %s, ptr %p 846d624b921SLiaoChunyu ret i1 %ov 847d624b921SLiaoChunyu} 848d624b921SLiaoChunyu 849d624b921SLiaoChunyu; Constant operand should match. 850d624b921SLiaoChunyu 851d624b921SLiaoChunyudefine i1 @usubo_ugt_constant_op0_i8(i8 %x, ptr %p) { 852d624b921SLiaoChunyu; RV32-LABEL: usubo_ugt_constant_op0_i8: 853d624b921SLiaoChunyu; RV32: # %bb.0: 854d624b921SLiaoChunyu; RV32-NEXT: andi a2, a0, 255 855d624b921SLiaoChunyu; RV32-NEXT: li a3, 42 856d624b921SLiaoChunyu; RV32-NEXT: sub a3, a3, a0 857d624b921SLiaoChunyu; RV32-NEXT: sltiu a0, a2, 43 858d624b921SLiaoChunyu; RV32-NEXT: xori a0, a0, 1 859d624b921SLiaoChunyu; RV32-NEXT: sb a3, 0(a1) 860d624b921SLiaoChunyu; RV32-NEXT: ret 861d624b921SLiaoChunyu; 862d624b921SLiaoChunyu; RV64-LABEL: usubo_ugt_constant_op0_i8: 863d624b921SLiaoChunyu; RV64: # %bb.0: 864d624b921SLiaoChunyu; RV64-NEXT: andi a2, a0, 255 865d624b921SLiaoChunyu; RV64-NEXT: li a3, 42 866d624b921SLiaoChunyu; RV64-NEXT: subw a3, a3, a0 867d624b921SLiaoChunyu; RV64-NEXT: sltiu a0, a2, 43 868d624b921SLiaoChunyu; RV64-NEXT: xori a0, a0, 1 869d624b921SLiaoChunyu; RV64-NEXT: sb a3, 0(a1) 870d624b921SLiaoChunyu; RV64-NEXT: ret 871d624b921SLiaoChunyu %s = sub i8 42, %x 872d624b921SLiaoChunyu %ov = icmp ugt i8 %x, 42 873d624b921SLiaoChunyu store i8 %s, ptr %p 874d624b921SLiaoChunyu ret i1 %ov 875d624b921SLiaoChunyu} 876d624b921SLiaoChunyu 877d624b921SLiaoChunyu; Compare with constant operand 0 is canonicalized by commuting, but verify match for non-canonical form. 878d624b921SLiaoChunyu 879d624b921SLiaoChunyudefine i1 @usubo_ult_constant_op0_i16(i16 %x, ptr %p) { 880d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_constant_op0_i16: 881d624b921SLiaoChunyu; RV32: # %bb.0: 882d624b921SLiaoChunyu; RV32-NEXT: slli a2, a0, 16 883d624b921SLiaoChunyu; RV32-NEXT: li a3, 43 884*9122c523SPengcheng Wang; RV32-NEXT: srli a2, a2, 16 885d624b921SLiaoChunyu; RV32-NEXT: sub a3, a3, a0 886d624b921SLiaoChunyu; RV32-NEXT: sltiu a0, a2, 44 887d624b921SLiaoChunyu; RV32-NEXT: xori a0, a0, 1 888d624b921SLiaoChunyu; RV32-NEXT: sh a3, 0(a1) 889d624b921SLiaoChunyu; RV32-NEXT: ret 890d624b921SLiaoChunyu; 891d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_constant_op0_i16: 892d624b921SLiaoChunyu; RV64: # %bb.0: 893d624b921SLiaoChunyu; RV64-NEXT: slli a2, a0, 48 894d624b921SLiaoChunyu; RV64-NEXT: li a3, 43 895*9122c523SPengcheng Wang; RV64-NEXT: srli a2, a2, 48 896d624b921SLiaoChunyu; RV64-NEXT: subw a3, a3, a0 897d624b921SLiaoChunyu; RV64-NEXT: sltiu a0, a2, 44 898d624b921SLiaoChunyu; RV64-NEXT: xori a0, a0, 1 899d624b921SLiaoChunyu; RV64-NEXT: sh a3, 0(a1) 900d624b921SLiaoChunyu; RV64-NEXT: ret 901d624b921SLiaoChunyu %s = sub i16 43, %x 902d624b921SLiaoChunyu %ov = icmp ult i16 43, %x 903d624b921SLiaoChunyu store i16 %s, ptr %p 904d624b921SLiaoChunyu ret i1 %ov 905d624b921SLiaoChunyu} 906d624b921SLiaoChunyu 907d624b921SLiaoChunyu; Subtract with constant operand 1 is canonicalized to add. 908d624b921SLiaoChunyu 909d624b921SLiaoChunyudefine i1 @usubo_ult_constant_op1_i16(i16 %x, ptr %p) { 910d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_constant_op1_i16: 911d624b921SLiaoChunyu; RV32: # %bb.0: 912d624b921SLiaoChunyu; RV32-NEXT: slli a2, a0, 16 913d624b921SLiaoChunyu; RV32-NEXT: srli a2, a2, 16 914d624b921SLiaoChunyu; RV32-NEXT: addi a3, a0, -44 915d624b921SLiaoChunyu; RV32-NEXT: sltiu a0, a2, 44 916d624b921SLiaoChunyu; RV32-NEXT: sh a3, 0(a1) 917d624b921SLiaoChunyu; RV32-NEXT: ret 918d624b921SLiaoChunyu; 919d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_constant_op1_i16: 920d624b921SLiaoChunyu; RV64: # %bb.0: 921d624b921SLiaoChunyu; RV64-NEXT: slli a2, a0, 48 922d624b921SLiaoChunyu; RV64-NEXT: srli a2, a2, 48 92386240751SPhilip Reames; RV64-NEXT: addi a3, a0, -44 924d624b921SLiaoChunyu; RV64-NEXT: sltiu a0, a2, 44 925d624b921SLiaoChunyu; RV64-NEXT: sh a3, 0(a1) 926d624b921SLiaoChunyu; RV64-NEXT: ret 927d624b921SLiaoChunyu %s = add i16 %x, -44 928d624b921SLiaoChunyu %ov = icmp ult i16 %x, 44 929d624b921SLiaoChunyu store i16 %s, ptr %p 930d624b921SLiaoChunyu ret i1 %ov 931d624b921SLiaoChunyu} 932d624b921SLiaoChunyu 933d624b921SLiaoChunyudefine i1 @usubo_ugt_constant_op1_i8(i8 %x, ptr %p) { 934d624b921SLiaoChunyu; RV32-LABEL: usubo_ugt_constant_op1_i8: 935d624b921SLiaoChunyu; RV32: # %bb.0: 936d624b921SLiaoChunyu; RV32-NEXT: andi a2, a0, 255 937d624b921SLiaoChunyu; RV32-NEXT: sltiu a2, a2, 45 938d624b921SLiaoChunyu; RV32-NEXT: addi a0, a0, -45 939d624b921SLiaoChunyu; RV32-NEXT: sb a0, 0(a1) 940d624b921SLiaoChunyu; RV32-NEXT: mv a0, a2 941d624b921SLiaoChunyu; RV32-NEXT: ret 942d624b921SLiaoChunyu; 943d624b921SLiaoChunyu; RV64-LABEL: usubo_ugt_constant_op1_i8: 944d624b921SLiaoChunyu; RV64: # %bb.0: 945d624b921SLiaoChunyu; RV64-NEXT: andi a2, a0, 255 946d624b921SLiaoChunyu; RV64-NEXT: sltiu a2, a2, 45 94786240751SPhilip Reames; RV64-NEXT: addi a0, a0, -45 948d624b921SLiaoChunyu; RV64-NEXT: sb a0, 0(a1) 949d624b921SLiaoChunyu; RV64-NEXT: mv a0, a2 950d624b921SLiaoChunyu; RV64-NEXT: ret 951d624b921SLiaoChunyu %ov = icmp ugt i8 45, %x 952d624b921SLiaoChunyu %s = add i8 %x, -45 953d624b921SLiaoChunyu store i8 %s, ptr %p 954d624b921SLiaoChunyu ret i1 %ov 955d624b921SLiaoChunyu} 956d624b921SLiaoChunyu 957d624b921SLiaoChunyu; Special-case: subtract 1 changes the compare predicate and constant. 958d624b921SLiaoChunyu 959d624b921SLiaoChunyudefine i1 @usubo_eq_constant1_op1_i32(i32 %x, ptr %p) { 960d624b921SLiaoChunyu; RV32-LABEL: usubo_eq_constant1_op1_i32: 961d624b921SLiaoChunyu; RV32: # %bb.0: 962d624b921SLiaoChunyu; RV32-NEXT: addi a2, a0, -1 963d624b921SLiaoChunyu; RV32-NEXT: seqz a0, a0 964d624b921SLiaoChunyu; RV32-NEXT: sw a2, 0(a1) 965d624b921SLiaoChunyu; RV32-NEXT: ret 966d624b921SLiaoChunyu; 967d624b921SLiaoChunyu; RV64-LABEL: usubo_eq_constant1_op1_i32: 968d624b921SLiaoChunyu; RV64: # %bb.0: 969d624b921SLiaoChunyu; RV64-NEXT: sext.w a2, a0 97086240751SPhilip Reames; RV64-NEXT: addi a3, a0, -1 971d624b921SLiaoChunyu; RV64-NEXT: seqz a0, a2 972d624b921SLiaoChunyu; RV64-NEXT: sw a3, 0(a1) 973d624b921SLiaoChunyu; RV64-NEXT: ret 974d624b921SLiaoChunyu %s = add i32 %x, -1 975d624b921SLiaoChunyu %ov = icmp eq i32 %x, 0 976d624b921SLiaoChunyu store i32 %s, ptr %p 977d624b921SLiaoChunyu ret i1 %ov 978d624b921SLiaoChunyu} 979d624b921SLiaoChunyu 980d624b921SLiaoChunyu; Special-case: subtract from 0 (negate) changes the compare predicate. 981d624b921SLiaoChunyu 982d624b921SLiaoChunyudefine i1 @usubo_ne_constant0_op1_i32(i32 %x, ptr %p) { 983d624b921SLiaoChunyu; RV32-LABEL: usubo_ne_constant0_op1_i32: 984d624b921SLiaoChunyu; RV32: # %bb.0: 985d624b921SLiaoChunyu; RV32-NEXT: neg a2, a0 986d624b921SLiaoChunyu; RV32-NEXT: snez a0, a0 987d624b921SLiaoChunyu; RV32-NEXT: sw a2, 0(a1) 988d624b921SLiaoChunyu; RV32-NEXT: ret 989d624b921SLiaoChunyu; 990d624b921SLiaoChunyu; RV64-LABEL: usubo_ne_constant0_op1_i32: 991d624b921SLiaoChunyu; RV64: # %bb.0: 992d624b921SLiaoChunyu; RV64-NEXT: sext.w a2, a0 993d624b921SLiaoChunyu; RV64-NEXT: negw a3, a0 994d624b921SLiaoChunyu; RV64-NEXT: snez a0, a2 995d624b921SLiaoChunyu; RV64-NEXT: sw a3, 0(a1) 996d624b921SLiaoChunyu; RV64-NEXT: ret 997d624b921SLiaoChunyu %s = sub i32 0, %x 998d624b921SLiaoChunyu %ov = icmp ne i32 %x, 0 999d624b921SLiaoChunyu store i32 %s, ptr %p 1000d624b921SLiaoChunyu ret i1 %ov 1001d624b921SLiaoChunyu} 1002d624b921SLiaoChunyu 1003d624b921SLiaoChunyu; This used to verify insertion point for multi-BB, but now we just bail out. 1004d624b921SLiaoChunyu 1005d624b921SLiaoChunyudeclare void @call(i1) 1006d624b921SLiaoChunyu 1007d624b921SLiaoChunyudefine i1 @usubo_ult_sub_dominates_i64(i64 %x, i64 %y, ptr %p, i1 %cond) { 1008d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_sub_dominates_i64: 1009d624b921SLiaoChunyu; RV32: # %bb.0: # %entry 1010cbdccb30SGuozhi Wei; RV32-NEXT: andi a6, a5, 1 1011cbdccb30SGuozhi Wei; RV32-NEXT: beqz a6, .LBB31_5 1012d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: # %t 1013cbdccb30SGuozhi Wei; RV32-NEXT: mv a7, a0 1014d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a0, a2 1015d624b921SLiaoChunyu; RV32-NEXT: sub t0, a1, a3 1016cbdccb30SGuozhi Wei; RV32-NEXT: sub a2, a7, a2 1017*9122c523SPengcheng Wang; RV32-NEXT: sub a7, t0, a0 1018d624b921SLiaoChunyu; RV32-NEXT: sw a2, 0(a4) 1019*9122c523SPengcheng Wang; RV32-NEXT: sw a7, 4(a4) 1020cbdccb30SGuozhi Wei; RV32-NEXT: beqz a6, .LBB31_5 1021d624b921SLiaoChunyu; RV32-NEXT: # %bb.2: # %end 1022e15dbda9SCraig Topper; RV32-NEXT: beq a1, a3, .LBB31_4 1023d624b921SLiaoChunyu; RV32-NEXT: # %bb.3: # %end 1024d624b921SLiaoChunyu; RV32-NEXT: sltu a0, a1, a3 1025e15dbda9SCraig Topper; RV32-NEXT: .LBB31_4: # %end 1026d624b921SLiaoChunyu; RV32-NEXT: ret 1027e15dbda9SCraig Topper; RV32-NEXT: .LBB31_5: # %f 1028d624b921SLiaoChunyu; RV32-NEXT: mv a0, a5 1029d624b921SLiaoChunyu; RV32-NEXT: ret 1030d624b921SLiaoChunyu; 1031d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_sub_dominates_i64: 1032d624b921SLiaoChunyu; RV64: # %bb.0: # %entry 1033d624b921SLiaoChunyu; RV64-NEXT: andi a4, a3, 1 1034e15dbda9SCraig Topper; RV64-NEXT: beqz a4, .LBB31_3 1035d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: # %t 1036d624b921SLiaoChunyu; RV64-NEXT: sub a5, a0, a1 1037d624b921SLiaoChunyu; RV64-NEXT: sd a5, 0(a2) 1038e15dbda9SCraig Topper; RV64-NEXT: beqz a4, .LBB31_3 1039d624b921SLiaoChunyu; RV64-NEXT: # %bb.2: # %end 1040d624b921SLiaoChunyu; RV64-NEXT: sltu a0, a0, a1 1041d624b921SLiaoChunyu; RV64-NEXT: ret 1042e15dbda9SCraig Topper; RV64-NEXT: .LBB31_3: # %f 1043d624b921SLiaoChunyu; RV64-NEXT: mv a0, a3 1044d624b921SLiaoChunyu; RV64-NEXT: ret 1045d624b921SLiaoChunyuentry: 1046d624b921SLiaoChunyu br i1 %cond, label %t, label %f 1047d624b921SLiaoChunyu 1048d624b921SLiaoChunyut: 1049d624b921SLiaoChunyu %s = sub i64 %x, %y 1050d624b921SLiaoChunyu store i64 %s, ptr %p 1051d624b921SLiaoChunyu br i1 %cond, label %end, label %f 1052d624b921SLiaoChunyu 1053d624b921SLiaoChunyuf: 1054d624b921SLiaoChunyu ret i1 %cond 1055d624b921SLiaoChunyu 1056d624b921SLiaoChunyuend: 1057d624b921SLiaoChunyu %ov = icmp ult i64 %x, %y 1058d624b921SLiaoChunyu ret i1 %ov 1059d624b921SLiaoChunyu} 1060d624b921SLiaoChunyu 1061d624b921SLiaoChunyudefine i1 @usubo_ult_cmp_dominates_i64(i64 %x, i64 %y, ptr %p, i1 %cond) { 1062d624b921SLiaoChunyu; RV32-LABEL: usubo_ult_cmp_dominates_i64: 1063d624b921SLiaoChunyu; RV32: # %bb.0: # %entry 1064d624b921SLiaoChunyu; RV32-NEXT: addi sp, sp, -32 1065d624b921SLiaoChunyu; RV32-NEXT: .cfi_def_cfa_offset 32 1066d624b921SLiaoChunyu; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1067d624b921SLiaoChunyu; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1068d624b921SLiaoChunyu; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1069d624b921SLiaoChunyu; RV32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 1070d624b921SLiaoChunyu; RV32-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 1071d624b921SLiaoChunyu; RV32-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 1072d624b921SLiaoChunyu; RV32-NEXT: sw s5, 4(sp) # 4-byte Folded Spill 1073d624b921SLiaoChunyu; RV32-NEXT: sw s6, 0(sp) # 4-byte Folded Spill 1074d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset ra, -4 1075d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s0, -8 1076d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s1, -12 1077d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s2, -16 1078d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s3, -20 1079d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s4, -24 1080d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s5, -28 1081d624b921SLiaoChunyu; RV32-NEXT: .cfi_offset s6, -32 1082*9122c523SPengcheng Wang; RV32-NEXT: mv s5, a5 1083*9122c523SPengcheng Wang; RV32-NEXT: mv s3, a1 1084*9122c523SPengcheng Wang; RV32-NEXT: andi a1, a5, 1 1085*9122c523SPengcheng Wang; RV32-NEXT: beqz a1, .LBB32_8 1086d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: # %t 1087d624b921SLiaoChunyu; RV32-NEXT: mv s0, a4 1088*9122c523SPengcheng Wang; RV32-NEXT: mv s2, a3 1089d624b921SLiaoChunyu; RV32-NEXT: mv s1, a2 10907b3bbd83SJay Foad; RV32-NEXT: mv s4, a0 1091*9122c523SPengcheng Wang; RV32-NEXT: beq s3, a3, .LBB32_3 1092d624b921SLiaoChunyu; RV32-NEXT: # %bb.2: # %t 1093*9122c523SPengcheng Wang; RV32-NEXT: sltu s6, s3, s2 1094e15dbda9SCraig Topper; RV32-NEXT: j .LBB32_4 1095e15dbda9SCraig Topper; RV32-NEXT: .LBB32_3: 10967b3bbd83SJay Foad; RV32-NEXT: sltu s6, s4, s1 1097e15dbda9SCraig Topper; RV32-NEXT: .LBB32_4: # %t 1098d624b921SLiaoChunyu; RV32-NEXT: mv a0, s6 1099eabaee0cSFangrui Song; RV32-NEXT: call call 1100e15dbda9SCraig Topper; RV32-NEXT: beqz s6, .LBB32_8 1101d624b921SLiaoChunyu; RV32-NEXT: # %bb.5: # %end 11027b3bbd83SJay Foad; RV32-NEXT: sltu a1, s4, s1 1103d624b921SLiaoChunyu; RV32-NEXT: mv a0, a1 1104*9122c523SPengcheng Wang; RV32-NEXT: beq s3, s2, .LBB32_7 1105d624b921SLiaoChunyu; RV32-NEXT: # %bb.6: # %end 1106*9122c523SPengcheng Wang; RV32-NEXT: sltu a0, s3, s2 1107e15dbda9SCraig Topper; RV32-NEXT: .LBB32_7: # %end 1108*9122c523SPengcheng Wang; RV32-NEXT: sub a2, s3, s2 1109*9122c523SPengcheng Wang; RV32-NEXT: sub a3, s4, s1 1110d624b921SLiaoChunyu; RV32-NEXT: sub a2, a2, a1 1111*9122c523SPengcheng Wang; RV32-NEXT: sw a3, 0(s0) 1112d624b921SLiaoChunyu; RV32-NEXT: sw a2, 4(s0) 1113e15dbda9SCraig Topper; RV32-NEXT: j .LBB32_9 1114e15dbda9SCraig Topper; RV32-NEXT: .LBB32_8: # %f 1115*9122c523SPengcheng Wang; RV32-NEXT: mv a0, s5 1116e15dbda9SCraig Topper; RV32-NEXT: .LBB32_9: # %f 1117d624b921SLiaoChunyu; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1118d624b921SLiaoChunyu; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1119d624b921SLiaoChunyu; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1120d624b921SLiaoChunyu; RV32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 1121d624b921SLiaoChunyu; RV32-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 1122d624b921SLiaoChunyu; RV32-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 1123d624b921SLiaoChunyu; RV32-NEXT: lw s5, 4(sp) # 4-byte Folded Reload 1124d624b921SLiaoChunyu; RV32-NEXT: lw s6, 0(sp) # 4-byte Folded Reload 112597982a8cSdlav-sc; RV32-NEXT: .cfi_restore ra 112697982a8cSdlav-sc; RV32-NEXT: .cfi_restore s0 112797982a8cSdlav-sc; RV32-NEXT: .cfi_restore s1 112897982a8cSdlav-sc; RV32-NEXT: .cfi_restore s2 112997982a8cSdlav-sc; RV32-NEXT: .cfi_restore s3 113097982a8cSdlav-sc; RV32-NEXT: .cfi_restore s4 113197982a8cSdlav-sc; RV32-NEXT: .cfi_restore s5 113297982a8cSdlav-sc; RV32-NEXT: .cfi_restore s6 1133d624b921SLiaoChunyu; RV32-NEXT: addi sp, sp, 32 113497982a8cSdlav-sc; RV32-NEXT: .cfi_def_cfa_offset 0 1135d624b921SLiaoChunyu; RV32-NEXT: ret 1136d624b921SLiaoChunyu; 1137d624b921SLiaoChunyu; RV64-LABEL: usubo_ult_cmp_dominates_i64: 1138d624b921SLiaoChunyu; RV64: # %bb.0: # %entry 1139d624b921SLiaoChunyu; RV64-NEXT: addi sp, sp, -48 1140d624b921SLiaoChunyu; RV64-NEXT: .cfi_def_cfa_offset 48 1141d624b921SLiaoChunyu; RV64-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1142d624b921SLiaoChunyu; RV64-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1143d624b921SLiaoChunyu; RV64-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1144d624b921SLiaoChunyu; RV64-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1145d624b921SLiaoChunyu; RV64-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 1146d624b921SLiaoChunyu; RV64-NEXT: sd s4, 0(sp) # 8-byte Folded Spill 1147d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset ra, -8 1148d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset s0, -16 1149d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset s1, -24 1150d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset s2, -32 1151d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset s3, -40 1152d624b921SLiaoChunyu; RV64-NEXT: .cfi_offset s4, -48 1153d624b921SLiaoChunyu; RV64-NEXT: mv s0, a3 1154*9122c523SPengcheng Wang; RV64-NEXT: mv s2, a1 1155*9122c523SPengcheng Wang; RV64-NEXT: andi a1, a3, 1 1156*9122c523SPengcheng Wang; RV64-NEXT: beqz a1, .LBB32_3 1157d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: # %t 1158d624b921SLiaoChunyu; RV64-NEXT: mv s1, a2 1159d624b921SLiaoChunyu; RV64-NEXT: mv s3, a0 1160*9122c523SPengcheng Wang; RV64-NEXT: sltu s4, a0, s2 1161d624b921SLiaoChunyu; RV64-NEXT: mv a0, s4 1162eabaee0cSFangrui Song; RV64-NEXT: call call 1163e15dbda9SCraig Topper; RV64-NEXT: bgeu s3, s2, .LBB32_3 1164d624b921SLiaoChunyu; RV64-NEXT: # %bb.2: # %end 1165d624b921SLiaoChunyu; RV64-NEXT: sub a0, s3, s2 1166d624b921SLiaoChunyu; RV64-NEXT: sd a0, 0(s1) 1167d624b921SLiaoChunyu; RV64-NEXT: mv a0, s4 1168e15dbda9SCraig Topper; RV64-NEXT: j .LBB32_4 1169e15dbda9SCraig Topper; RV64-NEXT: .LBB32_3: # %f 1170d624b921SLiaoChunyu; RV64-NEXT: mv a0, s0 1171e15dbda9SCraig Topper; RV64-NEXT: .LBB32_4: # %f 1172d624b921SLiaoChunyu; RV64-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1173d624b921SLiaoChunyu; RV64-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1174d624b921SLiaoChunyu; RV64-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1175d624b921SLiaoChunyu; RV64-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1176d624b921SLiaoChunyu; RV64-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 1177d624b921SLiaoChunyu; RV64-NEXT: ld s4, 0(sp) # 8-byte Folded Reload 117897982a8cSdlav-sc; RV64-NEXT: .cfi_restore ra 117997982a8cSdlav-sc; RV64-NEXT: .cfi_restore s0 118097982a8cSdlav-sc; RV64-NEXT: .cfi_restore s1 118197982a8cSdlav-sc; RV64-NEXT: .cfi_restore s2 118297982a8cSdlav-sc; RV64-NEXT: .cfi_restore s3 118397982a8cSdlav-sc; RV64-NEXT: .cfi_restore s4 1184d624b921SLiaoChunyu; RV64-NEXT: addi sp, sp, 48 118597982a8cSdlav-sc; RV64-NEXT: .cfi_def_cfa_offset 0 1186d624b921SLiaoChunyu; RV64-NEXT: ret 1187d624b921SLiaoChunyuentry: 1188d624b921SLiaoChunyu br i1 %cond, label %t, label %f 1189d624b921SLiaoChunyu 1190d624b921SLiaoChunyut: 1191d624b921SLiaoChunyu %ov = icmp ult i64 %x, %y 1192d624b921SLiaoChunyu call void @call(i1 %ov) 1193d624b921SLiaoChunyu br i1 %ov, label %end, label %f 1194d624b921SLiaoChunyu 1195d624b921SLiaoChunyuf: 1196d624b921SLiaoChunyu ret i1 %cond 1197d624b921SLiaoChunyu 1198d624b921SLiaoChunyuend: 1199d624b921SLiaoChunyu %s = sub i64 %x, %y 1200d624b921SLiaoChunyu store i64 %s, ptr %p 1201d624b921SLiaoChunyu ret i1 %ov 1202d624b921SLiaoChunyu} 1203d624b921SLiaoChunyu 1204d624b921SLiaoChunyu; Verify that crazy/non-canonical code does not crash. 1205d624b921SLiaoChunyu 1206d624b921SLiaoChunyudefine void @bar() { 1207d624b921SLiaoChunyu; RV32-LABEL: bar: 1208d624b921SLiaoChunyu; RV32: # %bb.0: 1209d624b921SLiaoChunyu; 1210d624b921SLiaoChunyu; RV64-LABEL: bar: 1211d624b921SLiaoChunyu; RV64: # %bb.0: 1212d624b921SLiaoChunyu %cmp = icmp eq i64 1, -1 1213d624b921SLiaoChunyu %frombool = zext i1 %cmp to i8 1214d624b921SLiaoChunyu unreachable 1215d624b921SLiaoChunyu} 1216d624b921SLiaoChunyu 1217d624b921SLiaoChunyudefine void @foo() { 1218d624b921SLiaoChunyu; RV32-LABEL: foo: 1219d624b921SLiaoChunyu; RV32: # %bb.0: 1220d624b921SLiaoChunyu; 1221d624b921SLiaoChunyu; RV64-LABEL: foo: 1222d624b921SLiaoChunyu; RV64: # %bb.0: 1223d624b921SLiaoChunyu %sub = add nsw i64 1, 1 1224d624b921SLiaoChunyu %conv = trunc i64 %sub to i32 1225d624b921SLiaoChunyu unreachable 1226d624b921SLiaoChunyu} 1227d624b921SLiaoChunyu 1228d624b921SLiaoChunyu; Similarly for usubo. 1229d624b921SLiaoChunyu 1230d624b921SLiaoChunyudefine i1 @bar2() { 1231d624b921SLiaoChunyu; RV32-LABEL: bar2: 1232d624b921SLiaoChunyu; RV32: # %bb.0: 1233d624b921SLiaoChunyu; RV32-NEXT: li a0, 0 1234d624b921SLiaoChunyu; RV32-NEXT: ret 1235d624b921SLiaoChunyu; 1236d624b921SLiaoChunyu; RV64-LABEL: bar2: 1237d624b921SLiaoChunyu; RV64: # %bb.0: 1238d624b921SLiaoChunyu; RV64-NEXT: li a0, 0 1239d624b921SLiaoChunyu; RV64-NEXT: ret 1240d624b921SLiaoChunyu %cmp = icmp eq i64 1, 0 1241d624b921SLiaoChunyu ret i1 %cmp 1242d624b921SLiaoChunyu} 1243d624b921SLiaoChunyu 1244d624b921SLiaoChunyudefine i64 @foo2(ptr %p) { 1245d624b921SLiaoChunyu; RV32-LABEL: foo2: 1246d624b921SLiaoChunyu; RV32: # %bb.0: 1247d624b921SLiaoChunyu; RV32-NEXT: li a0, 0 1248d624b921SLiaoChunyu; RV32-NEXT: li a1, 0 1249d624b921SLiaoChunyu; RV32-NEXT: ret 1250d624b921SLiaoChunyu; 1251d624b921SLiaoChunyu; RV64-LABEL: foo2: 1252d624b921SLiaoChunyu; RV64: # %bb.0: 1253d624b921SLiaoChunyu; RV64-NEXT: li a0, 0 1254d624b921SLiaoChunyu; RV64-NEXT: ret 1255d624b921SLiaoChunyu %sub = add nsw i64 1, -1 1256d624b921SLiaoChunyu ret i64 %sub 1257d624b921SLiaoChunyu} 1258d624b921SLiaoChunyu 1259d624b921SLiaoChunyu; Avoid hoisting a math op into a dominating block which would 1260d624b921SLiaoChunyu; increase the critical path. 1261d624b921SLiaoChunyu 1262d624b921SLiaoChunyudefine void @PR41129(ptr %p64) { 1263d624b921SLiaoChunyu; RV32-LABEL: PR41129: 1264d624b921SLiaoChunyu; RV32: # %bb.0: # %entry 126524847a90SLiaoChunyu; RV32-NEXT: lw a1, 0(a0) 126614c4f28eSAlex Bradbury; RV32-NEXT: lw a2, 4(a0) 126724847a90SLiaoChunyu; RV32-NEXT: or a3, a1, a2 1268e15dbda9SCraig Topper; RV32-NEXT: beqz a3, .LBB37_2 1269d624b921SLiaoChunyu; RV32-NEXT: # %bb.1: # %false 127024847a90SLiaoChunyu; RV32-NEXT: andi a1, a1, 7 127124847a90SLiaoChunyu; RV32-NEXT: sw a1, 0(a0) 12722967e5f8SAlex Bradbury; RV32-NEXT: sw zero, 4(a0) 1273d624b921SLiaoChunyu; RV32-NEXT: ret 1274e15dbda9SCraig Topper; RV32-NEXT: .LBB37_2: # %true 127524847a90SLiaoChunyu; RV32-NEXT: seqz a3, a1 1276d624b921SLiaoChunyu; RV32-NEXT: addi a1, a1, -1 1277*9122c523SPengcheng Wang; RV32-NEXT: sub a2, a2, a3 127824847a90SLiaoChunyu; RV32-NEXT: sw a1, 0(a0) 127924847a90SLiaoChunyu; RV32-NEXT: sw a2, 4(a0) 1280d624b921SLiaoChunyu; RV32-NEXT: ret 1281d624b921SLiaoChunyu; 1282d624b921SLiaoChunyu; RV64-LABEL: PR41129: 1283d624b921SLiaoChunyu; RV64: # %bb.0: # %entry 1284d624b921SLiaoChunyu; RV64-NEXT: ld a1, 0(a0) 1285e15dbda9SCraig Topper; RV64-NEXT: beqz a1, .LBB37_2 1286d624b921SLiaoChunyu; RV64-NEXT: # %bb.1: # %false 1287d624b921SLiaoChunyu; RV64-NEXT: andi a1, a1, 7 1288d624b921SLiaoChunyu; RV64-NEXT: sd a1, 0(a0) 1289d624b921SLiaoChunyu; RV64-NEXT: ret 1290e15dbda9SCraig Topper; RV64-NEXT: .LBB37_2: # %true 1291d624b921SLiaoChunyu; RV64-NEXT: addi a1, a1, -1 1292d624b921SLiaoChunyu; RV64-NEXT: sd a1, 0(a0) 1293d624b921SLiaoChunyu; RV64-NEXT: ret 1294d624b921SLiaoChunyuentry: 1295d624b921SLiaoChunyu %key = load i64, ptr %p64, align 8 1296d624b921SLiaoChunyu %cond17 = icmp eq i64 %key, 0 1297d624b921SLiaoChunyu br i1 %cond17, label %true, label %false 1298d624b921SLiaoChunyu 1299d624b921SLiaoChunyufalse: 1300d624b921SLiaoChunyu %andval = and i64 %key, 7 1301d624b921SLiaoChunyu store i64 %andval, ptr %p64 1302d624b921SLiaoChunyu br label %exit 1303d624b921SLiaoChunyu 1304d624b921SLiaoChunyutrue: 1305d624b921SLiaoChunyu %svalue = add i64 %key, -1 1306d624b921SLiaoChunyu store i64 %svalue, ptr %p64 1307d624b921SLiaoChunyu br label %exit 1308d624b921SLiaoChunyu 1309d624b921SLiaoChunyuexit: 1310d624b921SLiaoChunyu ret void 1311d624b921SLiaoChunyu} 1312d624b921SLiaoChunyu 1313eb54254bSLiaoChunyudefine i16 @overflow_not_used(i16 %a, i16 %b, ptr %res) { 131442a5dda5SLiaoChunyu; RV32-LABEL: overflow_not_used: 131542a5dda5SLiaoChunyu; RV32: # %bb.0: 131642a5dda5SLiaoChunyu; RV32-NEXT: lui a3, 16 1317*9122c523SPengcheng Wang; RV32-NEXT: add a0, a1, a0 131842a5dda5SLiaoChunyu; RV32-NEXT: addi a3, a3, -1 131942a5dda5SLiaoChunyu; RV32-NEXT: and a4, a1, a3 132042a5dda5SLiaoChunyu; RV32-NEXT: and a3, a0, a3 1321e15dbda9SCraig Topper; RV32-NEXT: bltu a3, a4, .LBB38_2 132242a5dda5SLiaoChunyu; RV32-NEXT: # %bb.1: 132342a5dda5SLiaoChunyu; RV32-NEXT: li a1, 42 1324e15dbda9SCraig Topper; RV32-NEXT: .LBB38_2: 132542a5dda5SLiaoChunyu; RV32-NEXT: sh a0, 0(a2) 132642a5dda5SLiaoChunyu; RV32-NEXT: mv a0, a1 132742a5dda5SLiaoChunyu; RV32-NEXT: ret 132842a5dda5SLiaoChunyu; 132942a5dda5SLiaoChunyu; RV64-LABEL: overflow_not_used: 133042a5dda5SLiaoChunyu; RV64: # %bb.0: 133142a5dda5SLiaoChunyu; RV64-NEXT: lui a3, 16 1332*9122c523SPengcheng Wang; RV64-NEXT: add a0, a1, a0 133342a5dda5SLiaoChunyu; RV64-NEXT: addiw a3, a3, -1 133442a5dda5SLiaoChunyu; RV64-NEXT: and a4, a1, a3 133542a5dda5SLiaoChunyu; RV64-NEXT: and a3, a0, a3 1336e15dbda9SCraig Topper; RV64-NEXT: bltu a3, a4, .LBB38_2 133742a5dda5SLiaoChunyu; RV64-NEXT: # %bb.1: 133842a5dda5SLiaoChunyu; RV64-NEXT: li a1, 42 1339e15dbda9SCraig Topper; RV64-NEXT: .LBB38_2: 134042a5dda5SLiaoChunyu; RV64-NEXT: sh a0, 0(a2) 134142a5dda5SLiaoChunyu; RV64-NEXT: mv a0, a1 134242a5dda5SLiaoChunyu; RV64-NEXT: ret 134342a5dda5SLiaoChunyu %add = add i16 %b, %a 134442a5dda5SLiaoChunyu %cmp = icmp ult i16 %add, %b 134542a5dda5SLiaoChunyu %Q = select i1 %cmp, i16 %b, i16 42 134642a5dda5SLiaoChunyu store i16 %add, ptr %res 134742a5dda5SLiaoChunyu ret i16 %Q 134842a5dda5SLiaoChunyu} 1349