-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[RISCV] Expand multiplication by (2/4/8 * 3/5/9 + 1) << N with SHL_ADD
#166372
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
f38ee6f
9b34e3f
665bfea
dd0a956
af464ba
6e58eb9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||
|---|---|---|---|---|
|
|
@@ -585,6 +585,33 @@ define i64 @addmul12(i64 %a, i64 %b) { | |||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul14(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul14: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: slli a2, a0, 1 | ||||
| ; RV64I-NEXT: slli a0, a0, 4 | ||||
| ; RV64I-NEXT: sub a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul14: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh1add a2, a0, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul14: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 14 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul18(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul18: | ||||
| ; RV64I: # %bb.0: | ||||
|
|
@@ -636,12 +663,26 @@ define i64 @addmul20(i64 %a, i64 %b) { | |||
| } | ||||
|
|
||||
| define i64 @addmul22(i64 %a, i64 %b) { | ||||
| ; CHECK-LABEL: addmul22: | ||||
| ; CHECK: # %bb.0: | ||||
| ; CHECK-NEXT: li a2, 22 | ||||
| ; CHECK-NEXT: mul a0, a0, a2 | ||||
| ; CHECK-NEXT: add a0, a0, a1 | ||||
| ; CHECK-NEXT: ret | ||||
| ; RV64I-LABEL: addmul22: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: li a2, 22 | ||||
| ; RV64I-NEXT: mul a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul22: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh2add a2, a0, a0 | ||||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This sequence is twice the size of the original code when Zca and Zcb are enabled. Do we have any opt for size limits on these transforms?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good point! But the very same problem already affects other multipliers, e.g.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Now I see these transforms are disabled when optimizing for size:
|
||||
| ; RV64ZBA-NEXT: sh1add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul22: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.w a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 22 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
|
|
@@ -672,6 +713,32 @@ define i64 @addmul24(i64 %a, i64 %b) { | |||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul26(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul26: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: li a2, 26 | ||||
| ; RV64I-NEXT: mul a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul26: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh1add a2, a0, a0 | ||||
| ; RV64ZBA-NEXT: sh2add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul26: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.w a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 26 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul36(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul36: | ||||
| ; RV64I: # %bb.0: | ||||
|
|
@@ -722,6 +789,58 @@ define i64 @addmul40(i64 %a, i64 %b) { | |||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul38(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul38: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: li a2, 38 | ||||
| ; RV64I-NEXT: mul a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul38: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh3add a2, a0, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul38: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.d a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 38 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul42(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul42: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: li a2, 42 | ||||
| ; RV64I-NEXT: mul a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul42: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh2add a2, a0, a0 | ||||
| ; RV64ZBA-NEXT: sh2add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul42: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.w a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.w a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 42 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul72(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul72: | ||||
| ; RV64I: # %bb.0: | ||||
|
|
@@ -747,6 +866,84 @@ define i64 @addmul72(i64 %a, i64 %b) { | |||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul74(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul74: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: li a2, 74 | ||||
| ; RV64I-NEXT: mul a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul74: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh3add a2, a0, a0 | ||||
| ; RV64ZBA-NEXT: sh2add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul74: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.d a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.w a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 74 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul82(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul82: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: li a2, 82 | ||||
| ; RV64I-NEXT: mul a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul82: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh2add a2, a0, a0 | ||||
| ; RV64ZBA-NEXT: sh3add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul82: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.w a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 82 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @addmul146(i64 %a, i64 %b) { | ||||
| ; RV64I-LABEL: addmul146: | ||||
| ; RV64I: # %bb.0: | ||||
| ; RV64I-NEXT: li a2, 146 | ||||
| ; RV64I-NEXT: mul a0, a0, a2 | ||||
| ; RV64I-NEXT: add a0, a0, a1 | ||||
| ; RV64I-NEXT: ret | ||||
| ; | ||||
| ; RV64ZBA-LABEL: addmul146: | ||||
| ; RV64ZBA: # %bb.0: | ||||
| ; RV64ZBA-NEXT: sh3add a2, a0, a0 | ||||
| ; RV64ZBA-NEXT: sh3add a0, a2, a0 | ||||
| ; RV64ZBA-NEXT: sh1add a0, a0, a1 | ||||
| ; RV64ZBA-NEXT: ret | ||||
| ; | ||||
| ; RV64XANDESPERF-LABEL: addmul146: | ||||
| ; RV64XANDESPERF: # %bb.0: | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.d a2, a0, a0 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.d a0, a0, a2 | ||||
| ; RV64XANDESPERF-NEXT: nds.lea.h a0, a1, a0 | ||||
| ; RV64XANDESPERF-NEXT: ret | ||||
| %c = mul i64 %a, 146 | ||||
| %d = add i64 %c, %b | ||||
| ret i64 %d | ||||
| } | ||||
|
|
||||
| define i64 @mul50(i64 %a) { | ||||
| ; RV64I-LABEL: mul50: | ||||
| ; RV64I: # %bb.0: | ||||
|
|
||||
Uh oh!
There was an error while loading. Please reload this page.