Skip to content

Commit 71faa9e

Browse files
committed
Require mul to be single use and add test
1 parent e73753f commit 71faa9e

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

llvm/lib/Target/NVPTX/NVPTXInstrInfo.td

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,30 +1093,32 @@ def : Pat<(mul (zext i16:$a), (i32 UInt16Const:$b)),
10931093
//
10941094
// Integer multiply-add
10951095
//
1096+
def mul_oneuse : PatFrag<(ops node:$a, node:$b), (mul node:$a, node:$b), [{
1097+
return N->hasOneUse();
1098+
}]>;
10961099

10971100
multiclass MAD<string Ptx, ValueType VT, NVPTXRegClass Reg, Operand Imm> {
1098-
10991101
def rrr:
11001102
NVPTXInst<(outs Reg:$dst),
11011103
(ins Reg:$a, Reg:$b, Reg:$c),
11021104
Ptx # " \t$dst, $a, $b, $c;",
1103-
[(set VT:$dst, (add (mul VT:$a, VT:$b), VT:$c))]>;
1105+
[(set VT:$dst, (add (mul_oneuse VT:$a, VT:$b), VT:$c))]>;
11041106

11051107
def rir:
11061108
NVPTXInst<(outs Reg:$dst),
11071109
(ins Reg:$a, Imm:$b, Reg:$c),
11081110
Ptx # " \t$dst, $a, $b, $c;",
1109-
[(set VT:$dst, (add (mul VT:$a, imm:$b), VT:$c))]>;
1111+
[(set VT:$dst, (add (mul_oneuse VT:$a, imm:$b), VT:$c))]>;
11101112
def rri:
11111113
NVPTXInst<(outs Reg:$dst),
11121114
(ins Reg:$a, Reg:$b, Imm:$c),
11131115
Ptx # " \t$dst, $a, $b, $c;",
1114-
[(set VT:$dst, (add (mul VT:$a, VT:$b), imm:$c))]>;
1116+
[(set VT:$dst, (add (mul_oneuse VT:$a, VT:$b), imm:$c))]>;
11151117
def rii:
11161118
NVPTXInst<(outs Reg:$dst),
11171119
(ins Reg:$a, Imm:$b, Imm:$c),
11181120
Ptx # " \t$dst, $a, $b, $c;",
1119-
[(set VT:$dst, (add (mul VT:$a, imm:$b), imm:$c))]>;
1121+
[(set VT:$dst, (add (mul_oneuse VT:$a, imm:$b), imm:$c))]>;
11201122
}
11211123

11221124
let Predicates = [hasO1] in {

llvm/test/CodeGen/NVPTX/combine-mad.ll

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,41 @@ define i32 @test4_rev(i32 %a, i32 %b, i32 %c, i1 %p) {
184184
ret i32 %add
185185
}
186186

187+
declare i32 @use(i32 %0, i32 %1)
188+
189+
define i32 @test_mad_multi_use(i32 %a, i32 %b, i32 %c) {
190+
; CHECK-LABEL: test_mad_multi_use(
191+
; CHECK: {
192+
; CHECK-NEXT: .reg .b32 %r<8>;
193+
; CHECK-EMPTY:
194+
; CHECK-NEXT: // %bb.0:
195+
; CHECK-NEXT: ld.param.u32 %r1, [test_mad_multi_use_param_0];
196+
; CHECK-NEXT: ld.param.u32 %r2, [test_mad_multi_use_param_1];
197+
; CHECK-NEXT: mul.lo.s32 %r3, %r1, %r2;
198+
; CHECK-NEXT: ld.param.u32 %r4, [test_mad_multi_use_param_2];
199+
; CHECK-NEXT: add.s32 %r5, %r3, %r4;
200+
; CHECK-NEXT: { // callseq 0, 0
201+
; CHECK-NEXT: .param .b32 param0;
202+
; CHECK-NEXT: st.param.b32 [param0], %r3;
203+
; CHECK-NEXT: .param .b32 param1;
204+
; CHECK-NEXT: st.param.b32 [param1], %r5;
205+
; CHECK-NEXT: .param .b32 retval0;
206+
; CHECK-NEXT: call.uni (retval0),
207+
; CHECK-NEXT: use,
208+
; CHECK-NEXT: (
209+
; CHECK-NEXT: param0,
210+
; CHECK-NEXT: param1
211+
; CHECK-NEXT: );
212+
; CHECK-NEXT: ld.param.b32 %r6, [retval0];
213+
; CHECK-NEXT: } // callseq 0
214+
; CHECK-NEXT: st.param.b32 [func_retval0], %r6;
215+
; CHECK-NEXT: ret;
216+
%mul = mul i32 %a, %b
217+
%add = add i32 %mul, %c
218+
%res = call i32 @use(i32 %mul, i32 %add)
219+
ret i32 %res
220+
}
221+
187222
;; This case relies on mad x 1 y => add x y, previously we emit:
188223
;; mad.lo.s32 %r3, %r1, 1, %r2;
189224
define i32 @test_mad_fold(i32 %x) {

0 commit comments

Comments
 (0)