1# RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 %s -o - \ 2# RUN: -run-pass=livevars,phi-node-elimination | FileCheck %s 3# RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 %s -o - \ 4# RUN: --passes='require<live-vars>,phi-node-elimination' | FileCheck %s 5 6--- | 7 define void @phi_eliminate(i32 %0, i32 %1, ptr %2) { 8 %scevgep3 = getelementptr i8, ptr %2, i64 undef 9 call void @llvm.set.loop.iterations.i64(i64 undef) 10 br label %4 11 12 4: ; preds = %4, %3 13 %5 = phi i32 [ %8, %4 ], [ %0, %3 ] 14 %6 = phi ptr [ %scevgep3, %3 ], [ %7, %4 ] 15 %7 = getelementptr i8, ptr %6, i64 -1 16 %8 = sdiv i32 %5, %1 17 %9 = mul nsw i32 %8, %1 18 %10 = sub nsw i32 %5, %9 19 %11 = icmp ult i32 %10, 10 20 %12 = trunc i32 %10 to i8 21 %13 = select i1 %11, i8 48, i8 55 22 %14 = add i8 %13, %12 23 store i8 %14, ptr %7, align 1 24 %15 = call i1 @llvm.loop.decrement.i64(i64 1) 25 br i1 %15, label %4, label %16 26 27 16: ; preds = %4 28 ret void 29 } 30 31 declare void @llvm.set.loop.iterations.i64(i64) 32 33 declare i1 @llvm.loop.decrement.i64(i64) 34 35 declare void @llvm.stackprotector(ptr, ptr) 36... 37--- 38name: phi_eliminate 39alignment: 16 40exposesReturnsTwice: false 41legalized: false 42regBankSelected: false 43selected: false 44failedISel: false 45tracksRegLiveness: true 46hasWinCFI: false 47registers: 48 - { id: 0, class: g8rc_and_g8rc_nox0, preferred-register: '' } 49 - { id: 1, class: gprc, preferred-register: '' } 50 - { id: 2, class: g8rc_and_g8rc_nox0, preferred-register: '' } 51 - { id: 3, class: g8rc, preferred-register: '' } 52 - { id: 4, class: gprc, preferred-register: '' } 53 - { id: 5, class: g8rc, preferred-register: '' } 54 - { id: 6, class: g8rc, preferred-register: '' } 55 - { id: 7, class: g8rc, preferred-register: '' } 56 - { id: 8, class: gprc, preferred-register: '' } 57 - { id: 9, class: gprc, preferred-register: '' } 58 - { id: 10, class: g8rc, preferred-register: '' } 59 - { id: 11, class: gprc, preferred-register: '' } 60 - { id: 12, class: gprc, preferred-register: '' } 61 - { id: 13, class: crrc, preferred-register: '' } 62 - { id: 14, class: gprc_and_gprc_nor0, preferred-register: '' } 63 - { id: 15, class: gprc_and_gprc_nor0, preferred-register: '' } 64 - { id: 16, class: gprc, preferred-register: '' } 65 - { id: 17, class: gprc, preferred-register: '' } 66 - { id: 18, class: g8rc_and_g8rc_nox0, preferred-register: '' } 67 - { id: 19, class: gprc, preferred-register: '' } 68 - { id: 20, class: gprc, preferred-register: '' } 69 - { id: 21, class: gprc, preferred-register: '' } 70 - { id: 22, class: crrc, preferred-register: '' } 71 - { id: 23, class: gprc, preferred-register: '' } 72 - { id: 24, class: gprc, preferred-register: '' } 73 - { id: 25, class: g8rc_and_g8rc_nox0, preferred-register: '' } 74 - { id: 26, class: gprc, preferred-register: '' } 75 - { id: 27, class: g8rc_and_g8rc_nox0, preferred-register: '' } 76 - { id: 28, class: gprc, preferred-register: '' } 77 - { id: 29, class: gprc, preferred-register: '' } 78 - { id: 30, class: gprc, preferred-register: '' } 79 - { id: 31, class: crrc, preferred-register: '' } 80 - { id: 32, class: gprc, preferred-register: '' } 81 - { id: 33, class: gprc, preferred-register: '' } 82 - { id: 34, class: g8rc_and_g8rc_nox0, preferred-register: '' } 83 - { id: 35, class: gprc, preferred-register: '' } 84 - { id: 36, class: gprc, preferred-register: '' } 85 - { id: 37, class: gprc, preferred-register: '' } 86 - { id: 38, class: g8rc_and_g8rc_nox0, preferred-register: '' } 87 - { id: 39, class: g8rc, preferred-register: '' } 88 - { id: 40, class: gprc, preferred-register: '' } 89 - { id: 41, class: gprc, preferred-register: '' } 90 - { id: 42, class: g8rc_and_g8rc_nox0, preferred-register: '' } 91 - { id: 43, class: gprc, preferred-register: '' } 92 - { id: 44, class: g8rc_and_g8rc_nox0, preferred-register: '' } 93 - { id: 45, class: gprc, preferred-register: '' } 94 - { id: 46, class: gprc, preferred-register: '' } 95 - { id: 47, class: crrc, preferred-register: '' } 96 - { id: 48, class: gprc, preferred-register: '' } 97 - { id: 49, class: gprc, preferred-register: '' } 98 - { id: 50, class: g8rc_and_g8rc_nox0, preferred-register: '' } 99 - { id: 51, class: g8rc, preferred-register: '' } 100 - { id: 52, class: gprc, preferred-register: '' } 101 - { id: 53, class: gprc, preferred-register: '' } 102 - { id: 54, class: g8rc_and_g8rc_nox0, preferred-register: '' } 103 - { id: 55, class: gprc, preferred-register: '' } 104 - { id: 56, class: gprc, preferred-register: '' } 105liveins: 106 - { reg: '$x3', virtual-reg: '%5' } 107 - { reg: '$x4', virtual-reg: '%6' } 108frameInfo: 109 isFrameAddressTaken: false 110 isReturnAddressTaken: false 111 hasStackMap: false 112 hasPatchPoint: false 113 stackSize: 0 114 offsetAdjustment: 0 115 maxAlignment: 1 116 adjustsStack: false 117 hasCalls: false 118 stackProtector: '' 119 maxCallFrameSize: 4294967295 120 cvBytesOfCalleeSavedRegisters: 0 121 hasOpaqueSPAdjustment: false 122 hasVAStart: false 123 hasMustTailInVarArgFunc: false 124 localFrameSize: 0 125 savePoint: '' 126 restorePoint: '' 127fixedStack: [] 128stack: [] 129callSites: [] 130constants: [] 131machineFunctionInfo: {} 132body: | 133 ; CHECK-LABEL: name: phi_eliminate 134 ; CHECK: bb.0 (%ir-block.3): 135 ; CHECK: successors: %bb.1(0x80000000) 136 ; CHECK: liveins: $x3, $x4 137 ; CHECK: %6:g8rc = COPY killed $x4 138 ; CHECK: %5:g8rc = COPY killed $x3 139 ; CHECK: %9:gprc = COPY killed %6.sub_32 140 ; CHECK: %8:gprc = COPY killed %5.sub_32 141 ; CHECK: MTCTR8loop undef %10:g8rc, implicit-def dead $ctr8 142 ; CHECK: %14:gprc_and_gprc_nor0 = LI 55 143 ; CHECK: %15:gprc_and_gprc_nor0 = LI 48 144 145 ; CHECK: bb.1 (%ir-block.4): 146 ; CHECK: successors: %bb.2(0x40000000), %bb.7(0x40000000) 147 ; CHECK: %19:gprc = DIVW %8, %9 148 ; CHECK: BDNZ8 %bb.2, implicit-def $ctr8, implicit $ctr8 149 150 ; CHECK: bb.7: 151 ; CHECK: successors: %bb.5(0x80000000) 152 ; CHECK: %61:gprc = COPY killed %8 153 ; CHECK: %62:g8rc_and_g8rc_nox0 = IMPLICIT_DEF 154 ; CHECK: %63:gprc = COPY killed %19 155 ; CHECK: B %bb.5 156 157 ; CHECK: bb.2 (%ir-block.4): 158 ; CHECK: successors: %bb.3(0x40000000), %bb.4(0x40000000) 159 ; CHECK: %20:gprc = nsw MULLW %19, %9 160 ; CHECK: %21:gprc = SUBF killed %20, killed %8 161 ; CHECK: %22:crrc = CMPLWI %21, 10 162 ; CHECK: %23:gprc = ISEL %15, %14, killed %22.sub_lt 163 ; CHECK: %24:gprc = ADD4 killed %23, killed %21 164 ; CHECK: %25:g8rc_and_g8rc_nox0 = STBU killed %24, -1, undef %0:g8rc_and_g8rc_nox0 :: (store (s8) into %ir.7) 165 ; CHECK: %26:gprc = DIVW %19, %9 166 ; CHECK: %57:gprc = COPY killed %26 167 ; CHECK: %58:gprc = COPY %19 168 ; CHECK: %59:g8rc_and_g8rc_nox0 = COPY killed %25 169 ; CHECK: %60:gprc = COPY killed %19 170 ; CHECK: BDZ8 %bb.4, implicit-def $ctr8, implicit $ctr8 171 ; CHECK: B %bb.3 172 173 ; CHECK: bb.3 (%ir-block.4): 174 ; CHECK: successors: %bb.3(0x7c000000), %bb.4(0x04000000) 175 ; CHECK: %38:g8rc_and_g8rc_nox0 = COPY killed %59 176 ; CHECK: %37:gprc = COPY %57 177 ; CHECK: %36:gprc = COPY killed %58 178 ; CHECK: %35:gprc = COPY killed %57 179 ; CHECK: %27:g8rc_and_g8rc_nox0 = COPY killed %38 180 ; CHECK: %56:gprc = COPY %35 181 ; CHECK: %28:gprc = DIVW %56, %9 182 ; CHECK: %29:gprc = nsw MULLW killed %37, %9 183 ; CHECK: %30:gprc = SUBF killed %29, killed %36 184 ; CHECK: %31:crrc = CMPLWI %30, 10 185 ; CHECK: %32:gprc = ISEL %15, %14, killed %31.sub_lt 186 ; CHECK: %33:gprc = ADD4 killed %32, killed %30 187 ; CHECK: %34:g8rc_and_g8rc_nox0 = STBU killed %33, -1, killed %27 :: (store unknown-size into %ir.7, align 1) 188 ; CHECK: %57:gprc = COPY killed %28 189 ; CHECK: %58:gprc = COPY killed %35 190 ; CHECK: %59:g8rc_and_g8rc_nox0 = COPY killed %34 191 ; CHECK: %60:gprc = COPY killed %56 192 ; CHECK: BDNZ8 %bb.3, implicit-def $ctr8, implicit $ctr8 193 ; CHECK: B %bb.4 194 195 ; CHECK: bb.4: 196 ; CHECK: successors: %bb.5(0x80000000) 197 ; CHECK: %44:g8rc_and_g8rc_nox0 = COPY killed %59 198 ; CHECK: %43:gprc = COPY killed %57 199 ; CHECK: %41:gprc = COPY killed %60 200 ; CHECK: %39:g8rc = COPY killed %44 201 ; CHECK: %61:gprc = COPY killed %41 202 ; CHECK: %62:g8rc_and_g8rc_nox0 = COPY killed %39 203 ; CHECK: %63:gprc = COPY killed %43 204 205 ; CHECK: bb.5: 206 ; CHECK: successors: %bb.6(0x80000000) 207 ; CHECK: %55:gprc = COPY killed %63 208 ; CHECK: %54:g8rc_and_g8rc_nox0 = COPY killed %62 209 ; CHECK: %53:gprc = COPY killed %61 210 ; CHECK: %45:gprc = nsw MULLW killed %55, killed %9 211 ; CHECK: %46:gprc = SUBF killed %45, killed %53 212 ; CHECK: %47:crrc = CMPLWI %46, 10 213 ; CHECK: %48:gprc = ISEL killed %15, killed %14, killed %47.sub_lt 214 ; CHECK: %49:gprc = ADD4 killed %48, killed %46 215 ; CHECK: dead %50:g8rc_and_g8rc_nox0 = STBU killed %49, -1, killed %54 :: (store unknown-size into %ir.7, align 1) 216 ; CHECK: B %bb.6 217 218 ; CHECK: bb.6 (%ir-block.16): 219 ; CHECK: BLR8 implicit $lr8, implicit $rm 220 221 bb.0 (%ir-block.3): 222 successors: %bb.1(0x80000000) 223 liveins: $x3, $x4 224 225 %6:g8rc = COPY killed $x4 226 %5:g8rc = COPY killed $x3 227 %9:gprc = COPY killed %6.sub_32 228 %8:gprc = COPY killed %5.sub_32 229 MTCTR8loop undef %10:g8rc, implicit-def dead $ctr8 230 %14:gprc_and_gprc_nor0 = LI 55 231 %15:gprc_and_gprc_nor0 = LI 48 232 233 bb.1 (%ir-block.4): 234 successors: %bb.2(0x40000000), %bb.5(0x40000000) 235 236 %19:gprc = DIVW %8, %9 237 BDZ8 %bb.5, implicit-def $ctr8, implicit $ctr8 238 B %bb.2 239 240 bb.2 (%ir-block.4): 241 successors: %bb.3(0x40000000), %bb.4(0x40000000) 242 243 %20:gprc = nsw MULLW %19, %9 244 %21:gprc = SUBF killed %20, killed %8 245 %22:crrc = CMPLWI %21, 10 246 %23:gprc = ISEL %15, %14, killed %22.sub_lt 247 %24:gprc = ADD4 killed %23, killed %21 248 %25:g8rc_and_g8rc_nox0 = STBU killed %24, -1, undef %0:g8rc_and_g8rc_nox0 :: (store (s8) into %ir.7) 249 %26:gprc = DIVW %19, %9 250 BDZ8 %bb.4, implicit-def $ctr8, implicit $ctr8 251 B %bb.3 252 253 bb.3 (%ir-block.4): 254 successors: %bb.3(0x7c000000), %bb.4(0x04000000) 255 256 %35:gprc = PHI %26, %bb.2, %28, %bb.3 257 %36:gprc = PHI %19, %bb.2, %35, %bb.3 258 %37:gprc = PHI %26, %bb.2, %28, %bb.3 259 %38:g8rc_and_g8rc_nox0 = PHI %25, %bb.2, %34, %bb.3 260 %27:g8rc_and_g8rc_nox0 = COPY killed %38 261 %56:gprc = COPY %35 262 %28:gprc = DIVW %56, %9 263 %29:gprc = nsw MULLW killed %37, %9 264 %30:gprc = SUBF killed %29, killed %36 265 %31:crrc = CMPLWI %30, 10 266 %32:gprc = ISEL %15, %14, killed %31.sub_lt 267 %33:gprc = ADD4 killed %32, killed %30 268 %34:g8rc_and_g8rc_nox0 = STBU killed %33, -1, killed %27 :: (store unknown-size into %ir.7, align 1) 269 BDNZ8 %bb.3, implicit-def $ctr8, implicit $ctr8 270 B %bb.4 271 272 bb.4: 273 successors: %bb.5(0x80000000) 274 275 %41:gprc = PHI %19, %bb.2, %56, %bb.3 276 %43:gprc = PHI %26, %bb.2, %28, %bb.3 277 %44:g8rc_and_g8rc_nox0 = PHI %25, %bb.2, %34, %bb.3 278 %39:g8rc = COPY killed %44 279 280 bb.5: 281 successors: %bb.6(0x80000000) 282 283 %53:gprc = PHI %8, %bb.1, %41, %bb.4 284 %54:g8rc_and_g8rc_nox0 = PHI undef %0:g8rc_and_g8rc_nox0, %bb.1, %39, %bb.4 285 %55:gprc = PHI %19, %bb.1, %43, %bb.4 286 %45:gprc = nsw MULLW killed %55, killed %9 287 %46:gprc = SUBF killed %45, killed %53 288 %47:crrc = CMPLWI %46, 10 289 %48:gprc = ISEL killed %15, killed %14, killed %47.sub_lt 290 %49:gprc = ADD4 killed %48, killed %46 291 dead %50:g8rc_and_g8rc_nox0 = STBU killed %49, -1, killed %54 :: (store unknown-size into %ir.7, align 1) 292 B %bb.6 293 294 bb.6 (%ir-block.16): 295 BLR8 implicit $lr8, implicit $rm 296 297... 298