Skip to content

Commit b3dcd15

Browse files
davemgreentstellar
authored andcommitted
[ARM] Define ComplexPatternFuncMutatesDAG
Some of the Arm complex pattern functions call canExtractShiftFromMul, which can modify the DAG in-place. For this to be valid and handled successfully we need to define ComplexPatternFuncMutatesDAG. Differential Revision: https://reviews.llvm.org/D107476 (cherry picked from commit 77e8f4e)
1 parent 1f1854c commit b3dcd15

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ class ARMDAGToDAGISel : public SelectionDAGISel {
7979

8080
void Select(SDNode *N) override;
8181

82+
/// Return true as some complex patterns, like those that call
83+
/// canExtractShiftFromMul can modify the DAG inplace.
84+
bool ComplexPatternFuncMutatesDAG() const override { return true; }
85+
8286
bool hasNoVMLxHazardUse(SDNode *N) const;
8387
bool isShifterOpProfitable(const SDValue &Shift,
8488
ARM_AM::ShiftOpc ShOpcVal, unsigned ShAmt);

llvm/test/CodeGen/ARM/shifter_operand.ll

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,108 @@ define { i32, i32 } @test_multi_use_add(i32 %base, i32 %offset) {
256256

257257
ret { i32, i32 } %ret
258258
}
259+
260+
define i32 @test_new(i32 %x, i32 %y) {
261+
; CHECK-ARM-LABEL: test_new:
262+
; CHECK-ARM: @ %bb.0: @ %entry
263+
; CHECK-ARM-NEXT: movw r2, #48047
264+
; CHECK-ARM-NEXT: mul r1, r1, r2
265+
; CHECK-ARM-NEXT: add r0, r0, r1, lsl #1
266+
; CHECK-ARM-NEXT: bx lr
267+
;
268+
; CHECK-THUMB-LABEL: test_new:
269+
; CHECK-THUMB: @ %bb.0: @ %entry
270+
; CHECK-THUMB-NEXT: movw r2, #48047
271+
; CHECK-THUMB-NEXT: muls r1, r2, r1
272+
; CHECK-THUMB-NEXT: add.w r0, r0, r1, lsl #1
273+
; CHECK-THUMB-NEXT: bx lr
274+
entry:
275+
%mul = mul i32 %y, 96094
276+
%conv = add i32 %mul, %x
277+
ret i32 %conv
278+
}
279+
280+
; This test was hitting issues with deleted nodes because ComplexPatternFuncMutatesDAG
281+
; was not defined.
282+
@arr_9 = external dso_local local_unnamed_addr global [15 x [25 x [18 x i8]]], align 1
283+
define void @test_mutateddag(i32 %b, i32 %c, i32 %d, i1 %cc) {
284+
; CHECK-THUMB-LABEL: test_mutateddag:
285+
; CHECK-THUMB: @ %bb.0: @ %entry
286+
; CHECK-THUMB-NEXT: .save {r4, lr}
287+
; CHECK-THUMB-NEXT: push {r4, lr}
288+
; CHECK-THUMB-NEXT: movw r12, #50608
289+
; CHECK-THUMB-NEXT: movw r4, #51512
290+
; CHECK-THUMB-NEXT: movt r12, #17917
291+
; CHECK-THUMB-NEXT: movt r4, #52
292+
; CHECK-THUMB-NEXT: mla r12, r1, r4, r12
293+
; CHECK-THUMB-NEXT: mov.w r4, #450
294+
; CHECK-THUMB-NEXT: lsls r3, r3, #31
295+
; CHECK-THUMB-NEXT: mul lr, r0, r4
296+
; CHECK-THUMB-NEXT: movw r0, #48047
297+
; CHECK-THUMB-NEXT: muls r0, r1, r0
298+
; CHECK-THUMB-NEXT: movw r1, :lower16:arr_9
299+
; CHECK-THUMB-NEXT: movt r1, :upper16:arr_9
300+
; CHECK-THUMB-NEXT: add.w r0, r2, r0, lsl #1
301+
; CHECK-THUMB-NEXT: movw r2, #24420
302+
; CHECK-THUMB-NEXT: movt r2, #19356
303+
; CHECK-THUMB-NEXT: add.w r0, r0, r0, lsl #3
304+
; CHECK-THUMB-NEXT: add.w r0, r1, r0, lsl #1
305+
; CHECK-THUMB-NEXT: movw r1, #60920
306+
; CHECK-THUMB-NEXT: movt r1, #64028
307+
; CHECK-THUMB-NEXT: add r2, r0
308+
; CHECK-THUMB-NEXT: add r1, r0
309+
; CHECK-THUMB-NEXT: movs r0, #0
310+
; CHECK-THUMB-NEXT: b .LBB19_2
311+
; CHECK-THUMB-NEXT: .LBB19_1: @ %for.cond1.for.cond.cleanup_crit_edge
312+
; CHECK-THUMB-NEXT: @ in Loop: Header=BB19_2 Depth=1
313+
; CHECK-THUMB-NEXT: add r1, lr
314+
; CHECK-THUMB-NEXT: add r2, lr
315+
; CHECK-THUMB-NEXT: .LBB19_2: @ %for.cond
316+
; CHECK-THUMB-NEXT: @ =>This Loop Header: Depth=1
317+
; CHECK-THUMB-NEXT: @ Child Loop BB19_3 Depth 2
318+
; CHECK-THUMB-NEXT: movs r4, #0
319+
; CHECK-THUMB-NEXT: .LBB19_3: @ %for.cond2.preheader
320+
; CHECK-THUMB-NEXT: @ Parent Loop BB19_2 Depth=1
321+
; CHECK-THUMB-NEXT: @ => This Inner Loop Header: Depth=2
322+
; CHECK-THUMB-NEXT: cmp r3, #0
323+
; CHECK-THUMB-NEXT: str r0, [r1, r4]
324+
; CHECK-THUMB-NEXT: bne .LBB19_1
325+
; CHECK-THUMB-NEXT: @ %bb.4: @ %for.cond2.preheader.2
326+
; CHECK-THUMB-NEXT: @ in Loop: Header=BB19_3 Depth=2
327+
; CHECK-THUMB-NEXT: str r0, [r2, r4]
328+
; CHECK-THUMB-NEXT: add r4, r12
329+
; CHECK-THUMB-NEXT: b .LBB19_3
330+
entry:
331+
%0 = add i32 %d, -4
332+
%1 = mul i32 %c, 864846
333+
%2 = add i32 %1, 1367306604
334+
br label %for.cond
335+
336+
for.cond: ; preds = %for.cond1.for.cond.cleanup_crit_edge, %for.cond.preheader
337+
%indvar = phi i32 [ 0, %entry ], [ %indvar.next, %for.cond1.for.cond.cleanup_crit_edge ]
338+
%3 = mul i32 %indvar, %b
339+
%4 = add i32 %3, -2
340+
br label %for.cond2.preheader
341+
342+
for.cond2.preheader: ; preds = %for.cond2.preheader.2, %for.cond
343+
%indvar24 = phi i32 [ 0, %for.cond ], [ %indvar.next25.3, %for.cond2.preheader.2 ]
344+
%indvar.next25 = or i32 %indvar24, 1
345+
%l5 = mul i32 %2, %indvar.next25
346+
%scevgep.1 = getelementptr [15 x [25 x [18 x i8]]], [15 x [25 x [18 x i8]]]* @arr_9, i32 -217196, i32 %4, i32 %0, i32 %l5
347+
%l7 = bitcast i8* %scevgep.1 to i32*
348+
store i32 0, i32* %l7, align 1
349+
br i1 %cc, label %for.cond1.for.cond.cleanup_crit_edge, label %for.cond2.preheader.2
350+
351+
for.cond2.preheader.2: ; preds = %for.cond2.preheader
352+
%indvar.next25.1 = or i32 %indvar24, 2
353+
%l8 = mul i32 %2, %indvar.next25.1
354+
%scevgep.2 = getelementptr [15 x [25 x [18 x i8]]], [15 x [25 x [18 x i8]]]* @arr_9, i32 -217196, i32 %4, i32 %0, i32 %l8
355+
%l10 = bitcast i8* %scevgep.2 to i32*
356+
store i32 0, i32* %l10, align 1
357+
%indvar.next25.3 = add i32 %indvar24, 4
358+
br label %for.cond2.preheader
359+
360+
for.cond1.for.cond.cleanup_crit_edge: ; preds = %for.cond2.preheader
361+
%indvar.next = add i32 %indvar, 1
362+
br label %for.cond
363+
}

0 commit comments

Comments
 (0)