aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorQuentin Carbonneaux <[email protected]>2024-04-11 10:28:41 +0200
committerQuentin Carbonneaux <[email protected]>2024-04-11 14:14:53 +0200
commit4a809d69b5647aabc8f6a9e22e0bc889f9c779ed (patch)
tree31168efce4b56685c1564ea49b93a56bc27c9569 /test
parent8e8f7064366996a7fcc8d84267958cfaf5ee8194 (diff)
fold scaled offsets in addresses
Diffstat (limited to 'test')
-rw-r--r--test/isel4.ssa64
1 files changed, 64 insertions, 0 deletions
diff --git a/test/isel4.ssa b/test/isel4.ssa
new file mode 100644
index 0000000..874807e
--- /dev/null
+++ b/test/isel4.ssa
@@ -0,0 +1,64 @@
+# amd64 address-folding stress
+
+export function w $f0(l %a, l %b) {
+@start
+ %c =l add %b, 2
+ %d =l mul %c, 4
+ %e =l add %a, %d
+ %q =l loadw %e
+ ret %q
+}
+
+export function w $f1(l %a, l %b) {
+@start
+ %c =l add 1, %b
+ %f =l add %c, 1
+ %d =l mul %f, 4
+ %e =l add %d, %a
+ %q =l loadw %e
+ ret %q
+}
+
+export function w $f2(l %a, l %b) {
+@start
+ %l =l mul %b, 4
+ %d =l add 8, %l
+ %e =l add %a, %d
+ %q =l loadw %e
+ ret %q
+}
+
+# fixme: folding is not good here
+export function w $f3(l %a, l %b) {
+@start
+ %l =l mul %b, 4
+ %d =l add 4, %l
+ %f =l add 4, %d
+ %e =l add %a, %f
+ %q =l loadw %e
+ ret %q
+}
+
+export function w $f4(l %a, l %b) {
+@start
+ %c =l add 1, %b
+ %d =l mul %c, 4
+ %e =l add 4, %d
+ %f =l add %e, %a
+ %q =l loadw %f
+ ret %q
+}
+
+# >>> driver
+# int a[] = {1, 2, 3, 4};
+# typedef int loadf(int *, long long);
+# extern loadf f0, f1, f2, f3, f4;
+# loadf *fns[] = {&f0, &f1, &f2, &f3, &f4, 0};
+# int main() {
+# loadf **f;
+# int n;
+# for (n=1,f=fns; *f; f++,n++)
+# if ((*f)(a, 1) != 4) return n;
+# return 0;
+# }
+# <<<