Issue |
135188
|
Summary |
[RISC-V] Machine Block Placement generates extra jump instructions that are not cleaned up.
|
Labels |
backend:RISC-V
|
Assignees |
|
Reporter |
stefanp-synopsys
|
This is a performance issue.
For the following code:
```
int compute1(int);
int compute2(int);
int test();
int branch(int check1, int check2, int check3, int check4, int in) {
int doadd = 1;
if (check1) {
in = compute1(in);
doadd = 1; // We do the add.
} else if (check2) {
in = compute2(in);
doadd = test(); // Unknown if we should do the add.
} else if (check3) {
in *= 7;
doadd = 0; // Do not do the add.
}
if (doadd)
in += 5;
// Do a multiply by 7 here to confuse the compiler.
if (check4) {
in *= 7;
}
return in;
}
```
We can compile for RISCV:
```
clang -O3 -S branch.c -target riscv64-arc-linux-gnu
```
In the final assembly we end up with basic blocks that look like this:
```
< ... more code up here ... >
64 .LBB0_8: # %if.end9
65 slli a0, a4, 3
66 subw a0, a0, a4
67 bnez a2, .LBB0_11
68 # %bb.9: # %if.end9
69 bnez a2, .LBB0_2
70 j .LBB0_12
71 .LBB0_10:
72 mv a0, s1
73 j .LBB0_2
74 .LBB0_11: # %if.end9
75 mv a4, a0
76 bnez a2, .LBB0_2
77 .LBB0_12:
78 addiw a0, a4, 5
79 j .LBB0_2
```
In the above we generate an unconditional jump (line 70) to `LBB0_12` and then from there we jump right back out to `LBB0_2` after a single instruction. I feel like `LBB0_12` should be duplicated into line 70. This would save a jump and only at the cost of a slight code size increase.
There should be a way to clean up situations where we have:
```
jump A
<...>
A:
<very few instructions, maybe 1 - 3>
jump B
```
I'm happy to provide a patch for this but I don't know how to approach the issue because machine block placement runs very late. Should this be an improvement in machine block placement?
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs