Skip to content

Commit 63ca937

Browse files
committed
[ARM] Implement target hook function to decide folding (mul (add x, c1), c2)
Prevent the folding in DAGCombine if it leads to worse code. Reviewed By: dmgreen Differential Revision: https://reviews.llvm.org/D109124
1 parent 20f8906 commit 63ca937

File tree

5 files changed

+156
-211
lines changed

5 files changed

+156
-211
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18793,6 +18793,31 @@ bool ARMTargetLowering::isLegalAddImmediate(int64_t Imm) const {
1879318793
return AbsImm >= 0 && AbsImm <= 255;
1879418794
}
1879518795

18796+
// Return false to prevent folding
18797+
// (mul (add r, c0), c1) -> (add (mul r, c1), c0*c1) in DAGCombine,
18798+
// if the folding leads to worse code.
18799+
bool ARMTargetLowering::isMulAddWithConstProfitable(
18800+
const SDValue &AddNode, const SDValue &ConstNode) const {
18801+
// Let the DAGCombiner decide for vector types and large types.
18802+
const EVT VT = AddNode.getValueType();
18803+
if (VT.isVector() || VT.getScalarSizeInBits() > 32)
18804+
return true;
18805+
18806+
// It is worse if c0 is legal add immediate, while c1*c0 is not
18807+
// and has to be composed by at least two instructions.
18808+
const ConstantSDNode *C0Node = cast<ConstantSDNode>(AddNode.getOperand(1));
18809+
const ConstantSDNode *C1Node = cast<ConstantSDNode>(ConstNode);
18810+
const int64_t C0 = C0Node->getSExtValue();
18811+
APInt CA = C0Node->getAPIntValue() * C1Node->getAPIntValue();
18812+
if (!isLegalAddImmediate(C0) || isLegalAddImmediate(CA.getSExtValue()))
18813+
return true;
18814+
if (ConstantMaterializationCost((unsigned)CA.getZExtValue(), Subtarget) > 1)
18815+
return false;
18816+
18817+
// Default to true and let the DAGCombiner decide.
18818+
return true;
18819+
}
18820+
1879618821
static bool getARMIndexedAddressParts(SDNode *Ptr, EVT VT,
1879718822
bool isSEXTLoad, SDValue &Base,
1879818823
SDValue &Offset, bool &isInc,

llvm/lib/Target/ARM/ARMISelLowering.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,9 @@ class VectorType;
712712
Align Alignment,
713713
const DataLayout &DL) const;
714714

715+
bool isMulAddWithConstProfitable(const SDValue &AddNode,
716+
const SDValue &ConstNode) const override;
717+
715718
bool alignLoopsWithOptSize() const override;
716719

717720
/// Returns the number of interleaved accesses that will be generated when

llvm/test/CodeGen/ARM/addimm-mulimm.ll

Lines changed: 63 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,9 @@ define i16 @fold_sub301_mul19_i16(i16 %a) {
243243
define i32 @fold_add251_mul253_i32(i32 %a) {
244244
; CHECK-ARMV6-LABEL: fold_add251_mul253_i32:
245245
; CHECK-ARMV6: @ %bb.0:
246-
; CHECK-ARMV6-NEXT: mov r1, #15
247-
; CHECK-ARMV6-NEXT: mov r2, #253
248-
; CHECK-ARMV6-NEXT: orr r1, r1, #63488
249-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
246+
; CHECK-ARMV6-NEXT: add r0, r0, #251
247+
; CHECK-ARMV6-NEXT: mov r1, #253
248+
; CHECK-ARMV6-NEXT: mul r0, r0, r1
250249
; CHECK-ARMV6-NEXT: bx lr
251250
;
252251
; CHECK-ARMV7-LABEL: fold_add251_mul253_i32:
@@ -258,15 +257,10 @@ define i32 @fold_add251_mul253_i32(i32 %a) {
258257
;
259258
; CHECK-THUMBV6M-LABEL: fold_add251_mul253_i32:
260259
; CHECK-THUMBV6M: @ %bb.0:
260+
; CHECK-THUMBV6M-NEXT: adds r0, #251
261261
; CHECK-THUMBV6M-NEXT: movs r1, #253
262-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
263-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI8_0
264-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
262+
; CHECK-THUMBV6M-NEXT: muls r0, r1, r0
265263
; CHECK-THUMBV6M-NEXT: bx lr
266-
; CHECK-THUMBV6M-NEXT: .p2align 2
267-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
268-
; CHECK-THUMBV6M-NEXT: .LCPI8_0:
269-
; CHECK-THUMBV6M-NEXT: .long 63503 @ 0xf80f
270264
;
271265
; CHECK-THUMBV7M-LABEL: fold_add251_mul253_i32:
272266
; CHECK-THUMBV7M: @ %bb.0:
@@ -282,9 +276,9 @@ define i32 @fold_add251_mul253_i32(i32 %a) {
282276
define i16 @fold_add251_mul253_i16(i16 %a) {
283277
; CHECK-ARMV6-LABEL: fold_add251_mul253_i16:
284278
; CHECK-ARMV6: @ %bb.0:
285-
; CHECK-ARMV6-NEXT: mvn r1, #2032
286-
; CHECK-ARMV6-NEXT: mov r2, #253
287-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
279+
; CHECK-ARMV6-NEXT: add r0, r0, #251
280+
; CHECK-ARMV6-NEXT: mov r1, #253
281+
; CHECK-ARMV6-NEXT: mul r0, r0, r1
288282
; CHECK-ARMV6-NEXT: bx lr
289283
;
290284
; CHECK-ARMV7-LABEL: fold_add251_mul253_i16:
@@ -297,15 +291,10 @@ define i16 @fold_add251_mul253_i16(i16 %a) {
297291
;
298292
; CHECK-THUMBV6M-LABEL: fold_add251_mul253_i16:
299293
; CHECK-THUMBV6M: @ %bb.0:
294+
; CHECK-THUMBV6M-NEXT: adds r0, #251
300295
; CHECK-THUMBV6M-NEXT: movs r1, #253
301-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
302-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI9_0
303-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
296+
; CHECK-THUMBV6M-NEXT: muls r0, r1, r0
304297
; CHECK-THUMBV6M-NEXT: bx lr
305-
; CHECK-THUMBV6M-NEXT: .p2align 2
306-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
307-
; CHECK-THUMBV6M-NEXT: .LCPI9_0:
308-
; CHECK-THUMBV6M-NEXT: .long 4294965263 @ 0xfffff80f
309298
;
310299
; CHECK-THUMBV7M-LABEL: fold_add251_mul253_i16:
311300
; CHECK-THUMBV7M: @ %bb.0:
@@ -319,41 +308,19 @@ define i16 @fold_add251_mul253_i16(i16 %a) {
319308
}
320309

321310
define i32 @fold_sub251_mul253_i32(i32 %a) {
322-
; CHECK-ARMV6-LABEL: fold_sub251_mul253_i32:
323-
; CHECK-ARMV6: @ %bb.0:
324-
; CHECK-ARMV6-NEXT: mvn r1, #14
325-
; CHECK-ARMV6-NEXT: mov r2, #253
326-
; CHECK-ARMV6-NEXT: sub r1, r1, #63488
327-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
328-
; CHECK-ARMV6-NEXT: bx lr
329-
;
330-
; CHECK-ARMV7-LABEL: fold_sub251_mul253_i32:
331-
; CHECK-ARMV7: @ %bb.0:
332-
; CHECK-ARMV7-NEXT: mov r1, #253
333-
; CHECK-ARMV7-NEXT: mul r0, r0, r1
334-
; CHECK-ARMV7-NEXT: movw r1, #63503
335-
; CHECK-ARMV7-NEXT: sub r0, r0, r1
336-
; CHECK-ARMV7-NEXT: bx lr
337-
;
338-
; CHECK-THUMBV6M-LABEL: fold_sub251_mul253_i32:
339-
; CHECK-THUMBV6M: @ %bb.0:
340-
; CHECK-THUMBV6M-NEXT: movs r1, #253
341-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
342-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI10_0
343-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
344-
; CHECK-THUMBV6M-NEXT: bx lr
345-
; CHECK-THUMBV6M-NEXT: .p2align 2
346-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
347-
; CHECK-THUMBV6M-NEXT: .LCPI10_0:
348-
; CHECK-THUMBV6M-NEXT: .long 4294903793 @ 0xffff07f1
311+
; CHECK-ARM-LABEL: fold_sub251_mul253_i32:
312+
; CHECK-ARM: @ %bb.0:
313+
; CHECK-ARM-NEXT: sub r0, r0, #251
314+
; CHECK-ARM-NEXT: mov r1, #253
315+
; CHECK-ARM-NEXT: mul r0, r0, r1
316+
; CHECK-ARM-NEXT: bx lr
349317
;
350-
; CHECK-THUMBV7M-LABEL: fold_sub251_mul253_i32:
351-
; CHECK-THUMBV7M: @ %bb.0:
352-
; CHECK-THUMBV7M-NEXT: movs r1, #253
353-
; CHECK-THUMBV7M-NEXT: muls r0, r1, r0
354-
; CHECK-THUMBV7M-NEXT: movw r1, #63503
355-
; CHECK-THUMBV7M-NEXT: subs r0, r0, r1
356-
; CHECK-THUMBV7M-NEXT: bx lr
318+
; CHECK-THUMB-LABEL: fold_sub251_mul253_i32:
319+
; CHECK-THUMB: @ %bb.0:
320+
; CHECK-THUMB-NEXT: subs r0, #251
321+
; CHECK-THUMB-NEXT: movs r1, #253
322+
; CHECK-THUMB-NEXT: muls r0, r1, r0
323+
; CHECK-THUMB-NEXT: bx lr
357324
%b = add i32 %a, -251
358325
%c = mul i32 %b, 253
359326
ret i32 %c
@@ -362,10 +329,9 @@ define i32 @fold_sub251_mul253_i32(i32 %a) {
362329
define i16 @fold_sub251_mul253_i16(i16 %a) {
363330
; CHECK-ARMV6-LABEL: fold_sub251_mul253_i16:
364331
; CHECK-ARMV6: @ %bb.0:
365-
; CHECK-ARMV6-NEXT: mov r1, #241
366-
; CHECK-ARMV6-NEXT: mov r2, #253
367-
; CHECK-ARMV6-NEXT: orr r1, r1, #1792
368-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
332+
; CHECK-ARMV6-NEXT: sub r0, r0, #251
333+
; CHECK-ARMV6-NEXT: mov r1, #253
334+
; CHECK-ARMV6-NEXT: mul r0, r0, r1
369335
; CHECK-ARMV6-NEXT: bx lr
370336
;
371337
; CHECK-ARMV7-LABEL: fold_sub251_mul253_i16:
@@ -377,15 +343,10 @@ define i16 @fold_sub251_mul253_i16(i16 %a) {
377343
;
378344
; CHECK-THUMBV6M-LABEL: fold_sub251_mul253_i16:
379345
; CHECK-THUMBV6M: @ %bb.0:
346+
; CHECK-THUMBV6M-NEXT: subs r0, #251
380347
; CHECK-THUMBV6M-NEXT: movs r1, #253
381-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
382-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI11_0
383-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
348+
; CHECK-THUMBV6M-NEXT: muls r0, r1, r0
384349
; CHECK-THUMBV6M-NEXT: bx lr
385-
; CHECK-THUMBV6M-NEXT: .p2align 2
386-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
387-
; CHECK-THUMBV6M-NEXT: .LCPI11_0:
388-
; CHECK-THUMBV6M-NEXT: .long 2033 @ 0x7f1
389350
;
390351
; CHECK-THUMBV7M-LABEL: fold_sub251_mul253_i16:
391352
; CHECK-THUMBV7M: @ %bb.0:
@@ -401,43 +362,32 @@ define i16 @fold_sub251_mul253_i16(i16 %a) {
401362
define i32 @fold_add251_mul353_i32(i32 %a) {
402363
; CHECK-ARMV6-LABEL: fold_add251_mul353_i32:
403364
; CHECK-ARMV6: @ %bb.0:
404-
; CHECK-ARMV6-NEXT: mov r2, #97
405-
; CHECK-ARMV6-NEXT: ldr r1, .LCPI12_0
406-
; CHECK-ARMV6-NEXT: orr r2, r2, #256
407-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
365+
; CHECK-ARMV6-NEXT: mov r1, #97
366+
; CHECK-ARMV6-NEXT: add r0, r0, #251
367+
; CHECK-ARMV6-NEXT: orr r1, r1, #256
368+
; CHECK-ARMV6-NEXT: mul r0, r0, r1
408369
; CHECK-ARMV6-NEXT: bx lr
409-
; CHECK-ARMV6-NEXT: .p2align 2
410-
; CHECK-ARMV6-NEXT: @ %bb.1:
411-
; CHECK-ARMV6-NEXT: .LCPI12_0:
412-
; CHECK-ARMV6-NEXT: .long 88603 @ 0x15a1b
413370
;
414371
; CHECK-ARMV7-LABEL: fold_add251_mul353_i32:
415372
; CHECK-ARMV7: @ %bb.0:
416-
; CHECK-ARMV7-NEXT: movw r1, #23067
417-
; CHECK-ARMV7-NEXT: movw r2, #353
418-
; CHECK-ARMV7-NEXT: movt r1, #1
419-
; CHECK-ARMV7-NEXT: mla r0, r0, r2, r1
373+
; CHECK-ARMV7-NEXT: add r0, r0, #251
374+
; CHECK-ARMV7-NEXT: movw r1, #353
375+
; CHECK-ARMV7-NEXT: mul r0, r0, r1
420376
; CHECK-ARMV7-NEXT: bx lr
421377
;
422378
; CHECK-THUMBV6M-LABEL: fold_add251_mul353_i32:
423379
; CHECK-THUMBV6M: @ %bb.0:
424380
; CHECK-THUMBV6M-NEXT: movs r1, #255
425381
; CHECK-THUMBV6M-NEXT: adds r1, #98
426-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
427-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI12_0
428-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
382+
; CHECK-THUMBV6M-NEXT: adds r0, #251
383+
; CHECK-THUMBV6M-NEXT: muls r0, r1, r0
429384
; CHECK-THUMBV6M-NEXT: bx lr
430-
; CHECK-THUMBV6M-NEXT: .p2align 2
431-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
432-
; CHECK-THUMBV6M-NEXT: .LCPI12_0:
433-
; CHECK-THUMBV6M-NEXT: .long 88603 @ 0x15a1b
434385
;
435386
; CHECK-THUMBV7M-LABEL: fold_add251_mul353_i32:
436387
; CHECK-THUMBV7M: @ %bb.0:
437-
; CHECK-THUMBV7M-NEXT: movw r1, #23067
438-
; CHECK-THUMBV7M-NEXT: movw r2, #353
439-
; CHECK-THUMBV7M-NEXT: movt r1, #1
440-
; CHECK-THUMBV7M-NEXT: mla r0, r0, r2, r1
388+
; CHECK-THUMBV7M-NEXT: adds r0, #251
389+
; CHECK-THUMBV7M-NEXT: movw r1, #353
390+
; CHECK-THUMBV7M-NEXT: muls r0, r1, r0
441391
; CHECK-THUMBV7M-NEXT: bx lr
442392
%b = add i32 %a, 251
443393
%c = mul i32 %b, 353
@@ -447,11 +397,10 @@ define i32 @fold_add251_mul353_i32(i32 %a) {
447397
define i16 @fold_add251_mul353_i16(i16 %a) {
448398
; CHECK-ARMV6-LABEL: fold_add251_mul353_i16:
449399
; CHECK-ARMV6: @ %bb.0:
450-
; CHECK-ARMV6-NEXT: mov r2, #97
451-
; CHECK-ARMV6-NEXT: mov r1, #27
452-
; CHECK-ARMV6-NEXT: orr r2, r2, #256
453-
; CHECK-ARMV6-NEXT: orr r1, r1, #23040
454-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
400+
; CHECK-ARMV6-NEXT: mov r1, #97
401+
; CHECK-ARMV6-NEXT: add r0, r0, #251
402+
; CHECK-ARMV6-NEXT: orr r1, r1, #256
403+
; CHECK-ARMV6-NEXT: mul r0, r0, r1
455404
; CHECK-ARMV6-NEXT: bx lr
456405
;
457406
; CHECK-ARMV7-LABEL: fold_add251_mul353_i16:
@@ -465,14 +414,9 @@ define i16 @fold_add251_mul353_i16(i16 %a) {
465414
; CHECK-THUMBV6M: @ %bb.0:
466415
; CHECK-THUMBV6M-NEXT: movs r1, #255
467416
; CHECK-THUMBV6M-NEXT: adds r1, #98
468-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
469-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI13_0
470-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
417+
; CHECK-THUMBV6M-NEXT: adds r0, #251
418+
; CHECK-THUMBV6M-NEXT: muls r0, r1, r0
471419
; CHECK-THUMBV6M-NEXT: bx lr
472-
; CHECK-THUMBV6M-NEXT: .p2align 2
473-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
474-
; CHECK-THUMBV6M-NEXT: .LCPI13_0:
475-
; CHECK-THUMBV6M-NEXT: .long 23067 @ 0x5a1b
476420
;
477421
; CHECK-THUMBV7M-LABEL: fold_add251_mul353_i16:
478422
; CHECK-THUMBV7M: @ %bb.0:
@@ -488,43 +432,32 @@ define i16 @fold_add251_mul353_i16(i16 %a) {
488432
define i32 @fold_sub251_mul353_i32(i32 %a) {
489433
; CHECK-ARMV6-LABEL: fold_sub251_mul353_i32:
490434
; CHECK-ARMV6: @ %bb.0:
491-
; CHECK-ARMV6-NEXT: mov r2, #97
492-
; CHECK-ARMV6-NEXT: ldr r1, .LCPI14_0
493-
; CHECK-ARMV6-NEXT: orr r2, r2, #256
494-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
435+
; CHECK-ARMV6-NEXT: mov r1, #97
436+
; CHECK-ARMV6-NEXT: sub r0, r0, #251
437+
; CHECK-ARMV6-NEXT: orr r1, r1, #256
438+
; CHECK-ARMV6-NEXT: mul r0, r0, r1
495439
; CHECK-ARMV6-NEXT: bx lr
496-
; CHECK-ARMV6-NEXT: .p2align 2
497-
; CHECK-ARMV6-NEXT: @ %bb.1:
498-
; CHECK-ARMV6-NEXT: .LCPI14_0:
499-
; CHECK-ARMV6-NEXT: .long 4294878693 @ 0xfffea5e5
500440
;
501441
; CHECK-ARMV7-LABEL: fold_sub251_mul353_i32:
502442
; CHECK-ARMV7: @ %bb.0:
503-
; CHECK-ARMV7-NEXT: movw r1, #42469
504-
; CHECK-ARMV7-NEXT: movw r2, #353
505-
; CHECK-ARMV7-NEXT: movt r1, #65534
506-
; CHECK-ARMV7-NEXT: mla r0, r0, r2, r1
443+
; CHECK-ARMV7-NEXT: sub r0, r0, #251
444+
; CHECK-ARMV7-NEXT: movw r1, #353
445+
; CHECK-ARMV7-NEXT: mul r0, r0, r1
507446
; CHECK-ARMV7-NEXT: bx lr
508447
;
509448
; CHECK-THUMBV6M-LABEL: fold_sub251_mul353_i32:
510449
; CHECK-THUMBV6M: @ %bb.0:
511450
; CHECK-THUMBV6M-NEXT: movs r1, #255
512451
; CHECK-THUMBV6M-NEXT: adds r1, #98
513-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
514-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI14_0
515-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
452+
; CHECK-THUMBV6M-NEXT: subs r0, #251
453+
; CHECK-THUMBV6M-NEXT: muls r0, r1, r0
516454
; CHECK-THUMBV6M-NEXT: bx lr
517-
; CHECK-THUMBV6M-NEXT: .p2align 2
518-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
519-
; CHECK-THUMBV6M-NEXT: .LCPI14_0:
520-
; CHECK-THUMBV6M-NEXT: .long 4294878693 @ 0xfffea5e5
521455
;
522456
; CHECK-THUMBV7M-LABEL: fold_sub251_mul353_i32:
523457
; CHECK-THUMBV7M: @ %bb.0:
524-
; CHECK-THUMBV7M-NEXT: movw r1, #42469
525-
; CHECK-THUMBV7M-NEXT: movw r2, #353
526-
; CHECK-THUMBV7M-NEXT: movt r1, #65534
527-
; CHECK-THUMBV7M-NEXT: mla r0, r0, r2, r1
458+
; CHECK-THUMBV7M-NEXT: subs r0, #251
459+
; CHECK-THUMBV7M-NEXT: movw r1, #353
460+
; CHECK-THUMBV7M-NEXT: muls r0, r1, r0
528461
; CHECK-THUMBV7M-NEXT: bx lr
529462
%b = add i32 %a, -251
530463
%c = mul i32 %b, 353
@@ -534,11 +467,10 @@ define i32 @fold_sub251_mul353_i32(i32 %a) {
534467
define i16 @fold_sub251_mul353_i16(i16 %a) {
535468
; CHECK-ARMV6-LABEL: fold_sub251_mul353_i16:
536469
; CHECK-ARMV6: @ %bb.0:
537-
; CHECK-ARMV6-NEXT: mov r2, #97
538-
; CHECK-ARMV6-NEXT: mvn r1, #26
539-
; CHECK-ARMV6-NEXT: orr r2, r2, #256
540-
; CHECK-ARMV6-NEXT: sub r1, r1, #23040
541-
; CHECK-ARMV6-NEXT: mla r0, r0, r2, r1
470+
; CHECK-ARMV6-NEXT: mov r1, #97
471+
; CHECK-ARMV6-NEXT: sub r0, r0, #251
472+
; CHECK-ARMV6-NEXT: orr r1, r1, #256
473+
; CHECK-ARMV6-NEXT: mul r0, r0, r1
542474
; CHECK-ARMV6-NEXT: bx lr
543475
;
544476
; CHECK-ARMV7-LABEL: fold_sub251_mul353_i16:
@@ -553,14 +485,9 @@ define i16 @fold_sub251_mul353_i16(i16 %a) {
553485
; CHECK-THUMBV6M: @ %bb.0:
554486
; CHECK-THUMBV6M-NEXT: movs r1, #255
555487
; CHECK-THUMBV6M-NEXT: adds r1, #98
556-
; CHECK-THUMBV6M-NEXT: muls r1, r0, r1
557-
; CHECK-THUMBV6M-NEXT: ldr r0, .LCPI15_0
558-
; CHECK-THUMBV6M-NEXT: adds r0, r1, r0
488+
; CHECK-THUMBV6M-NEXT: subs r0, #251
489+
; CHECK-THUMBV6M-NEXT: muls r0, r1, r0
559490
; CHECK-THUMBV6M-NEXT: bx lr
560-
; CHECK-THUMBV6M-NEXT: .p2align 2
561-
; CHECK-THUMBV6M-NEXT: @ %bb.1:
562-
; CHECK-THUMBV6M-NEXT: .LCPI15_0:
563-
; CHECK-THUMBV6M-NEXT: .long 4294944229 @ 0xffffa5e5
564491
;
565492
; CHECK-THUMBV7M-LABEL: fold_sub251_mul353_i16:
566493
; CHECK-THUMBV7M: @ %bb.0:

0 commit comments

Comments
 (0)