10e6c1576SIvan Tetyushkin; This test is designed to run 4 times, once with function attribute +c, 20e6c1576SIvan Tetyushkin; once with function attribute -c for eq/ne in icmp 30e6c1576SIvan Tetyushkin; The optimization should appear only with +c, otherwise default isel should be 40e6c1576SIvan Tetyushkin; choosen. 50e6c1576SIvan Tetyushkin; 60e6c1576SIvan Tetyushkin; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=+c,+f,+d -filetype=obj \ 7e7e78274SCraig Topper; RUN: -disable-block-placement < %s \ 80e6c1576SIvan Tetyushkin; RUN: | llvm-objdump -d --triple=riscv32 --mattr=+c,+f,+d -M no-aliases - \ 9e7e78274SCraig Topper; RUN: | FileCheck -check-prefix=RV32IFDC %s 100e6c1576SIvan Tetyushkin; 11*0a6a40d6SCraig Topper; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=+zca,+f,+d -filetype=obj \ 12*0a6a40d6SCraig Topper; RUN: -disable-block-placement < %s \ 13*0a6a40d6SCraig Topper; RUN: | llvm-objdump -d --triple=riscv32 --mattr=+zca,+f,+d -M no-aliases - \ 14*0a6a40d6SCraig Topper; RUN: | FileCheck -check-prefix=RV32IFDC %s 15*0a6a40d6SCraig Topper; 160e6c1576SIvan Tetyushkin; RUN: llc -mtriple=riscv32 -target-abi ilp32d -mattr=-c,+f,+d -filetype=obj \ 17e7e78274SCraig Topper; RUN: -disable-block-placement < %s \ 180e6c1576SIvan Tetyushkin; RUN: | llvm-objdump -d --triple=riscv32 --mattr=-c,+f,+d -M no-aliases - \ 19e7e78274SCraig Topper; RUN: | FileCheck -check-prefix=RV32IFD %s 200e6c1576SIvan Tetyushkin 210e6c1576SIvan Tetyushkin 220e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm) 23e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_pos_eq>: 24c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], 0x14 25e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 260e6c1576SIvan Tetyushkin; --- no compress extension 27e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_pos_eq>: 28c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x14 29e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 30e7e78274SCraig Topperdefine i32 @f_small_pos_eq(i32 %in0) minsize { 31e7e78274SCraig Topper %cmp = icmp eq i32 %in0, 20 320e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 330e6c1576SIvan Tetyushkinif.then: 340e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 350e6c1576SIvan Tetyushkin br label %if.end 360e6c1576SIvan Tetyushkinif.else: 370e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 380e6c1576SIvan Tetyushkin br label %if.end 390e6c1576SIvan Tetyushkin 400e6c1576SIvan Tetyushkinif.end: 410e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 420e6c1576SIvan Tetyushkin ret i32 %toRet 430e6c1576SIvan Tetyushkin} 440e6c1576SIvan Tetyushkin 450e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm) 46e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_pos_ne>: 47e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x14 48e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 49e7e78274SCraig Topper; --- no compress extension 50e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_pos_ne>: 51e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x14 52e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 53e7e78274SCraig Topperdefine i32 @f_small_pos_ne(i32 %in0) minsize { 54e7e78274SCraig Topper %cmp = icmp ne i32 %in0, 20 55e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 56e7e78274SCraig Topperif.then: 57e7e78274SCraig Topper %call = shl i32 %in0, 1 58e7e78274SCraig Topper br label %if.end 59e7e78274SCraig Topperif.else: 60e7e78274SCraig Topper %call2 = add i32 %in0, 42 61e7e78274SCraig Topper br label %if.end 62e7e78274SCraig Topper 63e7e78274SCraig Topperif.end: 64e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 65e7e78274SCraig Topper ret i32 %toRet 66e7e78274SCraig Topper} 67e7e78274SCraig Topper 68e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm) 69e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_neg_eq>: 70c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], -0x14 71e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 720e6c1576SIvan Tetyushkin; --- no compress extension 73e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_neg_eq>: 74c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x14 75e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 76e7e78274SCraig Topperdefine i32 @f_small_neg_eq(i32 %in0) minsize { 77e7e78274SCraig Topper %cmp = icmp eq i32 %in0, -20 780e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 790e6c1576SIvan Tetyushkinif.then: 800e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 810e6c1576SIvan Tetyushkin br label %if.end 820e6c1576SIvan Tetyushkinif.else: 830e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 840e6c1576SIvan Tetyushkin br label %if.end 850e6c1576SIvan Tetyushkin 860e6c1576SIvan Tetyushkinif.end: 870e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 880e6c1576SIvan Tetyushkin ret i32 %toRet 890e6c1576SIvan Tetyushkin} 900e6c1576SIvan Tetyushkin 910e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm) 92e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_neg_ne>: 93e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], -0x14 94e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 95e7e78274SCraig Topper; --- no compress extension 96e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_neg_ne>: 97e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x14 98e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 99e7e78274SCraig Topperdefine i32 @f_small_neg_ne(i32 %in0) minsize { 100e7e78274SCraig Topper %cmp = icmp ne i32 %in0, -20 101e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 102e7e78274SCraig Topperif.then: 103e7e78274SCraig Topper %call = shl i32 %in0, 1 104e7e78274SCraig Topper br label %if.end 105e7e78274SCraig Topperif.else: 106e7e78274SCraig Topper %call2 = add i32 %in0, 42 107e7e78274SCraig Topper br label %if.end 108e7e78274SCraig Topper 109e7e78274SCraig Topperif.end: 110e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 111e7e78274SCraig Topper ret i32 %toRet 112e7e78274SCraig Topper} 113e7e78274SCraig Topper 114e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm) 115e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_pos_eq>: 116c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], 0x1f 117e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 1180e6c1576SIvan Tetyushkin; --- no compress extension 119e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_pos_eq>: 120c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x1f 121e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 122e7e78274SCraig Topperdefine i32 @f_small_edge_pos_eq(i32 %in0) minsize { 123e7e78274SCraig Topper %cmp = icmp eq i32 %in0, 31 1240e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 1250e6c1576SIvan Tetyushkinif.then: 1260e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 1270e6c1576SIvan Tetyushkin br label %if.end 1280e6c1576SIvan Tetyushkinif.else: 1290e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 1300e6c1576SIvan Tetyushkin br label %if.end 1310e6c1576SIvan Tetyushkin 1320e6c1576SIvan Tetyushkinif.end: 1330e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 1340e6c1576SIvan Tetyushkin ret i32 %toRet 1350e6c1576SIvan Tetyushkin} 1360e6c1576SIvan Tetyushkin 1370e6c1576SIvan Tetyushkin; constant is small and fit in 6 bit (compress imm) 138e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_pos_ne>: 139e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x1f 140e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 141e7e78274SCraig Topper; --- no compress extension 142e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_pos_ne>: 143e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x1f 144e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 145e7e78274SCraig Topperdefine i32 @f_small_edge_pos_ne(i32 %in0) minsize { 146e7e78274SCraig Topper %cmp = icmp ne i32 %in0, 31 147e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 148e7e78274SCraig Topperif.then: 149e7e78274SCraig Topper %call = shl i32 %in0, 1 150e7e78274SCraig Topper br label %if.end 151e7e78274SCraig Topperif.else: 152e7e78274SCraig Topper %call2 = add i32 %in0, 42 153e7e78274SCraig Topper br label %if.end 154e7e78274SCraig Topper 155e7e78274SCraig Topperif.end: 156e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 157e7e78274SCraig Topper ret i32 %toRet 158e7e78274SCraig Topper} 159e7e78274SCraig Topper 160e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm) 161e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_neg_eq>: 162c532ba4eSWang Yaduo; RV32IFDC: c.li [[REG:.*]], -0x20 163e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 1640e6c1576SIvan Tetyushkin; --- no compress extension 165e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_neg_eq>: 166c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x20 167e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 168e7e78274SCraig Topperdefine i32 @f_small_edge_neg_eq(i32 %in0) minsize { 169e7e78274SCraig Topper %cmp = icmp eq i32 %in0, -32 170e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 171e7e78274SCraig Topperif.then: 172e7e78274SCraig Topper %call = shl i32 %in0, 1 173e7e78274SCraig Topper br label %if.end 174e7e78274SCraig Topperif.else: 175e7e78274SCraig Topper %call2 = add i32 %in0, 42 176e7e78274SCraig Topper br label %if.end 177e7e78274SCraig Topper 178e7e78274SCraig Topperif.end: 179e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 180e7e78274SCraig Topper ret i32 %toRet 181e7e78274SCraig Topper} 182e7e78274SCraig Topper 183e7e78274SCraig Topper; constant is small and fit in 6 bit (compress imm) 184e7e78274SCraig Topper; RV32IFDC-LABEL: <f_small_edge_neg_ne>: 185e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], -0x20 186e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 187e7e78274SCraig Topper; --- no compress extension 188e7e78274SCraig Topper; RV32IFD-LABEL: <f_small_edge_neg_ne>: 189e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x20 190e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 191e7e78274SCraig Topperdefine i32 @f_small_edge_neg_ne(i32 %in0) minsize { 192e7e78274SCraig Topper %cmp = icmp ne i32 %in0, -32 1930e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 1940e6c1576SIvan Tetyushkinif.then: 1950e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 1960e6c1576SIvan Tetyushkin br label %if.end 1970e6c1576SIvan Tetyushkinif.else: 1980e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 1990e6c1576SIvan Tetyushkin br label %if.end 2000e6c1576SIvan Tetyushkin 2010e6c1576SIvan Tetyushkinif.end: 2020e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 2030e6c1576SIvan Tetyushkin ret i32 %toRet 2040e6c1576SIvan Tetyushkin} 2050e6c1576SIvan Tetyushkin 2060e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm), 2070e6c1576SIvan Tetyushkin; but fit in 12 bit (imm) 208e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_pos_eq>: 209c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x20 210e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]] 2110e6c1576SIvan Tetyushkin; --- no compress extension 212e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_pos_eq>: 213c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x20 214e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 215e7e78274SCraig Topperdefine i32 @f_medium_ledge_pos_eq(i32 %in0) minsize { 216e7e78274SCraig Topper %cmp = icmp eq i32 %in0, 32 2170e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 2180e6c1576SIvan Tetyushkinif.then: 2190e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 2200e6c1576SIvan Tetyushkin br label %if.end 2210e6c1576SIvan Tetyushkinif.else: 2220e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 2230e6c1576SIvan Tetyushkin br label %if.end 2240e6c1576SIvan Tetyushkin 2250e6c1576SIvan Tetyushkinif.end: 2260e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 2270e6c1576SIvan Tetyushkin ret i32 %toRet 2280e6c1576SIvan Tetyushkin} 2290e6c1576SIvan Tetyushkin 2300e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm), 2310e6c1576SIvan Tetyushkin; but fit in 12 bit (imm) 232e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_pos_ne>: 233e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x20 234e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]] 235e7e78274SCraig Topper; --- no compress extension 236e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_pos_ne>: 237e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x20 238e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 239e7e78274SCraig Topperdefine i32 @f_medium_ledge_pos_ne(i32 %in0) minsize { 240e7e78274SCraig Topper %cmp = icmp ne i32 %in0, 32 241e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 242e7e78274SCraig Topperif.then: 243e7e78274SCraig Topper %call = shl i32 %in0, 1 244e7e78274SCraig Topper br label %if.end 245e7e78274SCraig Topperif.else: 246e7e78274SCraig Topper %call2 = add i32 %in0, 42 247e7e78274SCraig Topper br label %if.end 248e7e78274SCraig Topper 249e7e78274SCraig Topperif.end: 250e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 251e7e78274SCraig Topper ret i32 %toRet 252e7e78274SCraig Topper} 253e7e78274SCraig Topper 254e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm), 255e7e78274SCraig Topper; but fit in 12 bit (imm) 256e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_neg_eq>: 257c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x21 258e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]] 2590e6c1576SIvan Tetyushkin; --- no compress extension 260e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_neg_eq>: 261c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x21 262e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 263e7e78274SCraig Topperdefine i32 @f_medium_ledge_neg_eq(i32 %in0) minsize { 264e7e78274SCraig Topper %cmp = icmp eq i32 %in0, -33 2650e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 2660e6c1576SIvan Tetyushkinif.then: 2670e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 2680e6c1576SIvan Tetyushkin br label %if.end 2690e6c1576SIvan Tetyushkinif.else: 2700e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 2710e6c1576SIvan Tetyushkin br label %if.end 2720e6c1576SIvan Tetyushkin 2730e6c1576SIvan Tetyushkinif.end: 2740e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 2750e6c1576SIvan Tetyushkin ret i32 %toRet 2760e6c1576SIvan Tetyushkin} 2770e6c1576SIvan Tetyushkin 2780e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm), 2790e6c1576SIvan Tetyushkin; but fit in 12 bit (imm) 280e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_ledge_neg_ne>: 281e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x21 282e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]] 283e7e78274SCraig Topper; --- no compress extension 284e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_ledge_neg_ne>: 285e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x21 286e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 287e7e78274SCraig Topperdefine i32 @f_medium_ledge_neg_ne(i32 %in0) minsize { 288e7e78274SCraig Topper %cmp = icmp ne i32 %in0, -33 289e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 290e7e78274SCraig Topperif.then: 291e7e78274SCraig Topper %call = shl i32 %in0, 1 292e7e78274SCraig Topper br label %if.end 293e7e78274SCraig Topperif.else: 294e7e78274SCraig Topper %call2 = add i32 %in0, 42 295e7e78274SCraig Topper br label %if.end 296e7e78274SCraig Topper 297e7e78274SCraig Topperif.end: 298e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 299e7e78274SCraig Topper ret i32 %toRet 300e7e78274SCraig Topper} 301e7e78274SCraig Topper 302e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm), 303e7e78274SCraig Topper; but fit in 12 bit (imm) 304e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_pos_eq>: 305c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x3f 306e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]] 3070e6c1576SIvan Tetyushkin; --- no compress extension 308e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_pos_eq>: 309c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x3f 310e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 311e7e78274SCraig Topperdefine i32 @f_medium_pos_eq(i32 %in0) minsize { 312e7e78274SCraig Topper %cmp = icmp eq i32 %in0, 63 3130e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 3140e6c1576SIvan Tetyushkinif.then: 3150e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 3160e6c1576SIvan Tetyushkin br label %if.end 3170e6c1576SIvan Tetyushkinif.else: 3180e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 3190e6c1576SIvan Tetyushkin br label %if.end 3200e6c1576SIvan Tetyushkin 3210e6c1576SIvan Tetyushkinif.end: 3220e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 3230e6c1576SIvan Tetyushkin ret i32 %toRet 3240e6c1576SIvan Tetyushkin} 3250e6c1576SIvan Tetyushkin 3260e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm), 3270e6c1576SIvan Tetyushkin; but fit in 12 bit (imm) 328e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_pos_ne>: 329e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x3f 330e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]] 331e7e78274SCraig Topper; --- no compress extension 332e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_pos_ne>: 333e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x3f 334e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 335e7e78274SCraig Topperdefine i32 @f_medium_pos_ne(i32 %in0) minsize { 336e7e78274SCraig Topper %cmp = icmp ne i32 %in0, 63 337e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 338e7e78274SCraig Topperif.then: 339e7e78274SCraig Topper %call = shl i32 %in0, 1 340e7e78274SCraig Topper br label %if.end 341e7e78274SCraig Topperif.else: 342e7e78274SCraig Topper %call2 = add i32 %in0, 42 343e7e78274SCraig Topper br label %if.end 344e7e78274SCraig Topper 345e7e78274SCraig Topperif.end: 346e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 347e7e78274SCraig Topper ret i32 %toRet 348e7e78274SCraig Topper} 349e7e78274SCraig Topper 350e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm), 351e7e78274SCraig Topper; but fit in 12 bit (imm) 352e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_neg_eq>: 353c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x3f 354e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]] 3550e6c1576SIvan Tetyushkin; --- no compress extension 356e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_neg_eq>: 357c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x3f 358e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 359e7e78274SCraig Topperdefine i32 @f_medium_neg_eq(i32 %in0) minsize { 360e7e78274SCraig Topper %cmp = icmp eq i32 %in0, -63 3610e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 3620e6c1576SIvan Tetyushkinif.then: 3630e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 3640e6c1576SIvan Tetyushkin br label %if.end 3650e6c1576SIvan Tetyushkinif.else: 3660e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 3670e6c1576SIvan Tetyushkin br label %if.end 3680e6c1576SIvan Tetyushkin 3690e6c1576SIvan Tetyushkinif.end: 3700e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 3710e6c1576SIvan Tetyushkin ret i32 %toRet 3720e6c1576SIvan Tetyushkin} 3730e6c1576SIvan Tetyushkin 3740e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm), 3750e6c1576SIvan Tetyushkin; but fit in 12 bit (imm) 376e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_neg_ne>: 377e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x3f 378e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]] 3790e6c1576SIvan Tetyushkin; --- no compress extension 380e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_neg_ne>: 381e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x3f 382e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 383e7e78274SCraig Topperdefine i32 @f_medium_neg_ne(i32 %in0) minsize { 384e7e78274SCraig Topper %cmp = icmp ne i32 %in0, -63 385e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 386e7e78274SCraig Topperif.then: 387e7e78274SCraig Topper %call = shl i32 %in0, 1 388e7e78274SCraig Topper br label %if.end 389e7e78274SCraig Topperif.else: 390e7e78274SCraig Topper %call2 = add i32 %in0, 42 391e7e78274SCraig Topper br label %if.end 392e7e78274SCraig Topper 393e7e78274SCraig Topperif.end: 394e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 395e7e78274SCraig Topper ret i32 %toRet 396e7e78274SCraig Topper} 397e7e78274SCraig Topper 398e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm), 399e7e78274SCraig Topper; but fit in 12 bit (imm) 400e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_pos_eq>: 401e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x7ff 402e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]] 403e7e78274SCraig Topper; --- no compress extension 404e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_pos_eq>: 405c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, 0x7ff 406e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 407e7e78274SCraig Topperdefine i32 @f_medium_bedge_pos_eq(i32 %in0) minsize { 408e7e78274SCraig Topper %cmp = icmp eq i32 %in0, 2047 409e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 410e7e78274SCraig Topperif.then: 411e7e78274SCraig Topper %call = shl i32 %in0, 1 412e7e78274SCraig Topper br label %if.end 413e7e78274SCraig Topperif.else: 414e7e78274SCraig Topper %call2 = add i32 %in0, 42 415e7e78274SCraig Topper br label %if.end 416e7e78274SCraig Topper 417e7e78274SCraig Topperif.end: 418e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 419e7e78274SCraig Topper ret i32 %toRet 420e7e78274SCraig Topper} 421e7e78274SCraig Topper 422e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm), 423e7e78274SCraig Topper; but fit in 12 bit (imm) 424e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_pos_ne>: 425e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], -0x7ff 426e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]] 427e7e78274SCraig Topper; --- no compress extension 428e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_pos_ne>: 429e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, 0x7ff 430e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 431e7e78274SCraig Topperdefine i32 @f_medium_bedge_pos_ne(i32 %in0) minsize { 432e7e78274SCraig Topper %cmp = icmp ne i32 %in0, 2047 4330e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 4340e6c1576SIvan Tetyushkinif.then: 4350e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 4360e6c1576SIvan Tetyushkin br label %if.end 4370e6c1576SIvan Tetyushkinif.else: 4380e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 4390e6c1576SIvan Tetyushkin br label %if.end 4400e6c1576SIvan Tetyushkin 4410e6c1576SIvan Tetyushkinif.end: 4420e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 4430e6c1576SIvan Tetyushkin ret i32 %toRet 4440e6c1576SIvan Tetyushkin} 4450e6c1576SIvan Tetyushkin 4460e6c1576SIvan Tetyushkin; constant is medium and not fit in 6 bit (compress imm), 4470e6c1576SIvan Tetyushkin; but fit in 12 bit (imm), negative value fit in 12 bit too. 448e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_neg_eq>: 449c532ba4eSWang Yaduo; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x7ff 450e7e78274SCraig Topper; RV32IFDC: c.bnez [[MAYZEROREG]], [[PLACE:.*]] 4510e6c1576SIvan Tetyushkin; --- no compress extension 452e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_neg_eq>: 453c532ba4eSWang Yaduo; RV32IFD: addi [[REG:.*]], zero, -0x7ff 454e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 455e7e78274SCraig Topperdefine i32 @f_medium_bedge_neg_eq(i32 %in0) minsize { 456e7e78274SCraig Topper %cmp = icmp eq i32 %in0, -2047 457e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 458e7e78274SCraig Topperif.then: 459e7e78274SCraig Topper %call = shl i32 %in0, 1 460e7e78274SCraig Topper br label %if.end 461e7e78274SCraig Topperif.else: 462e7e78274SCraig Topper %call2 = add i32 %in0, 42 463e7e78274SCraig Topper br label %if.end 464e7e78274SCraig Topper 465e7e78274SCraig Topperif.end: 466e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 467e7e78274SCraig Topper ret i32 %toRet 468e7e78274SCraig Topper} 469e7e78274SCraig Topper 470e7e78274SCraig Topper; constant is medium and not fit in 6 bit (compress imm), 471e7e78274SCraig Topper; but fit in 12 bit (imm), negative value fit in 12 bit too. 472e7e78274SCraig Topper; RV32IFDC-LABEL: <f_medium_bedge_neg_ne>: 473e7e78274SCraig Topper; RV32IFDC: addi [[MAYZEROREG:.*]], [[REG:.*]], 0x7ff 474e7e78274SCraig Topper; RV32IFDC: c.beqz [[MAYZEROREG]], [[PLACE:.*]] 475e7e78274SCraig Topper; --- no compress extension 476e7e78274SCraig Topper; RV32IFD-LABEL: <f_medium_bedge_neg_ne>: 477e7e78274SCraig Topper; RV32IFD: addi [[REG:.*]], zero, -0x7ff 478e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 479e7e78274SCraig Topperdefine i32 @f_medium_bedge_neg_ne(i32 %in0) minsize { 480e7e78274SCraig Topper %cmp = icmp ne i32 %in0, -2047 4810e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 4820e6c1576SIvan Tetyushkinif.then: 4830e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 4840e6c1576SIvan Tetyushkin br label %if.end 4850e6c1576SIvan Tetyushkinif.else: 4860e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 4870e6c1576SIvan Tetyushkin br label %if.end 4880e6c1576SIvan Tetyushkin 4890e6c1576SIvan Tetyushkinif.end: 4900e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 4910e6c1576SIvan Tetyushkin ret i32 %toRet 4920e6c1576SIvan Tetyushkin} 4930e6c1576SIvan Tetyushkin 4940e6c1576SIvan Tetyushkin; constant is big and do not fit in 12 bit (imm), fit in i32 495e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_pos_eq>: 4963c37f926SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x1 4973c37f926SCraig Topper; RV32IFDC: c.slli [[REG]], 0xb 498e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 4990e6c1576SIvan Tetyushkin; --- no compress extension 500e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_pos_eq>: 5013c37f926SCraig Topper; RV32IFD: addi [[REG1:.*]], zero, 0x1 5023c37f926SCraig Topper; RV32IFD: slli [[REG2:.*]], [[REG1]], 0xb 503e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]] 504e7e78274SCraig Topperdefine i32 @f_big_ledge_pos_eq(i32 %in0) minsize { 505e7e78274SCraig Topper %cmp = icmp eq i32 %in0, 2048 5060e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 5070e6c1576SIvan Tetyushkinif.then: 5080e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 5090e6c1576SIvan Tetyushkin br label %if.end 5100e6c1576SIvan Tetyushkinif.else: 5110e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 5120e6c1576SIvan Tetyushkin br label %if.end 5130e6c1576SIvan Tetyushkin 5140e6c1576SIvan Tetyushkinif.end: 5150e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 5160e6c1576SIvan Tetyushkin ret i32 %toRet 5170e6c1576SIvan Tetyushkin} 5180e6c1576SIvan Tetyushkin 5190e6c1576SIvan Tetyushkin; constant is big and do not fit in 12 bit (imm), fit in i32 520e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_pos_ne>: 521e7e78274SCraig Topper; RV32IFDC: c.li [[REG:.*]], 0x1 522e7e78274SCraig Topper; RV32IFDC: c.slli [[REG]], 0xb 523e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 524e7e78274SCraig Topper; --- no compress extension 525e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_pos_ne>: 526e7e78274SCraig Topper; RV32IFD: addi [[REG1:.*]], zero, 0x1 527e7e78274SCraig Topper; RV32IFD: slli [[REG2:.*]], [[REG1]], 0xb 528e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]] 529e7e78274SCraig Topperdefine i32 @f_big_ledge_pos_ne(i32 %in0) minsize { 530e7e78274SCraig Topper %cmp = icmp ne i32 %in0, 2048 531e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 532e7e78274SCraig Topperif.then: 533e7e78274SCraig Topper %call = shl i32 %in0, 1 534e7e78274SCraig Topper br label %if.end 535e7e78274SCraig Topperif.else: 536e7e78274SCraig Topper %call2 = add i32 %in0, 42 537e7e78274SCraig Topper br label %if.end 538e7e78274SCraig Topper 539e7e78274SCraig Topperif.end: 540e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 541e7e78274SCraig Topper ret i32 %toRet 542e7e78274SCraig Topper} 543e7e78274SCraig Topper 544e7e78274SCraig Topper; constant is big and do not fit in 12 bit (imm), fit in i32 545e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_neg_eq>: 5463c37f926SCraig Topper; RV32IFDC: c.lui [[REG1:.*]], 0xfffff 5473c37f926SCraig Topper; RV32IFDC: addi [[REG2:.*]], [[REG1]], 0x7ff 548e7e78274SCraig Topper; RV32IFDC: bne [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 5490e6c1576SIvan Tetyushkin; --- no compress extension 550e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_neg_eq>: 5513c37f926SCraig Topper; RV32IFD: lui [[REG1:.*]], 0xfffff 5523c37f926SCraig Topper; RV32IFD: addi [[REG2:.*]], [[REG1]], 0x7ff 553e7e78274SCraig Topper; RV32IFD: bne [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]] 554e7e78274SCraig Topperdefine i32 @f_big_ledge_neg_eq(i32 %in0) minsize { 555e7e78274SCraig Topper %cmp = icmp eq i32 %in0, -2049 556e7e78274SCraig Topper br i1 %cmp, label %if.then, label %if.else 557e7e78274SCraig Topperif.then: 558e7e78274SCraig Topper %call = shl i32 %in0, 1 559e7e78274SCraig Topper br label %if.end 560e7e78274SCraig Topperif.else: 561e7e78274SCraig Topper %call2 = add i32 %in0, 42 562e7e78274SCraig Topper br label %if.end 563e7e78274SCraig Topper 564e7e78274SCraig Topperif.end: 565e7e78274SCraig Topper %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 566e7e78274SCraig Topper ret i32 %toRet 567e7e78274SCraig Topper} 568e7e78274SCraig Topper 569e7e78274SCraig Topper; constant is big and do not fit in 12 bit (imm), fit in i32 570e7e78274SCraig Topper; RV32IFDC-LABEL: <f_big_ledge_neg_ne>: 571e7e78274SCraig Topper; RV32IFDC: c.lui [[REG1:.*]], 0xfffff 572e7e78274SCraig Topper; RV32IFDC: addi [[REG2:.*]], [[REG1]], 0x7ff 573e7e78274SCraig Topper; RV32IFDC: beq [[ANOTHER:.*]], [[REG]], [[PLACE:.*]] 574e7e78274SCraig Topper; --- no compress extension 575e7e78274SCraig Topper; RV32IFD-LABEL: <f_big_ledge_neg_ne>: 576e7e78274SCraig Topper; RV32IFD: lui [[REG1:.*]], 0xfffff 577e7e78274SCraig Topper; RV32IFD: addi [[REG2:.*]], [[REG1]], 0x7ff 578e7e78274SCraig Topper; RV32IFD: beq [[ANOTHER:.*]], [[REG2]], [[PLACE:.*]] 579e7e78274SCraig Topperdefine i32 @f_big_ledge_neg_ne(i32 %in0) minsize { 580e7e78274SCraig Topper %cmp = icmp ne i32 %in0, -2049 5810e6c1576SIvan Tetyushkin br i1 %cmp, label %if.then, label %if.else 5820e6c1576SIvan Tetyushkinif.then: 5830e6c1576SIvan Tetyushkin %call = shl i32 %in0, 1 5840e6c1576SIvan Tetyushkin br label %if.end 5850e6c1576SIvan Tetyushkinif.else: 5860e6c1576SIvan Tetyushkin %call2 = add i32 %in0, 42 5870e6c1576SIvan Tetyushkin br label %if.end 5880e6c1576SIvan Tetyushkin 5890e6c1576SIvan Tetyushkinif.end: 5900e6c1576SIvan Tetyushkin %toRet = phi i32 [ %call, %if.then ], [ %call2, %if.else ] 5910e6c1576SIvan Tetyushkin ret i32 %toRet 5920e6c1576SIvan Tetyushkin} 593