|
144 | 144 | ;; CHECK-NEXT: )
|
145 | 145 | ;; CHECK-NEXT: )
|
146 | 146 | (func $test1 (param $struct1 (ref null $struct1)) (param $struct2 (ref null $struct2))
|
147 |
| - ;; We can infer that this get must reference $global1 and make the reference |
148 |
| - ;; point to that. Note that we do not infer the value of 42 here, but leave |
149 |
| - ;; it for other passes to do. |
| 147 | + ;; Even though the value here is not known at compile time - it reads an |
| 148 | + ;; imported global - we can still infer that we are reading from $global1. |
150 | 149 | (drop
|
151 | 150 | (struct.get $struct1 0
|
152 | 151 | (local.get $struct1)
|
153 | 152 | )
|
154 | 153 | )
|
155 |
| - ;; Even though the value here is not known at compile time - it reads an |
156 |
| - ;; imported global - we can still infer that we are reading from $global2. |
| 154 | + ;; We can infer that this get must reference $global2 and make the reference |
| 155 | + ;; point to that. Note that we do not infer the value of 42 here, but leave |
| 156 | + ;; it for other passes to do. |
157 | 157 | (drop
|
158 | 158 | (struct.get $struct2 0
|
159 | 159 | (local.get $struct2)
|
|
1944 | 1944 | )
|
1945 | 1945 | )
|
1946 | 1946 | )
|
| 1947 | + |
| 1948 | +;; Test atomic gets. |
| 1949 | +(module |
| 1950 | + (rec |
| 1951 | + ;; CHECK: (rec |
| 1952 | + ;; CHECK-NEXT: (type $one (shared (struct (field i32)))) |
| 1953 | + (type $one (shared (struct (field i32)))) |
| 1954 | + ;; CHECK: (type $two (shared (struct (field i32)))) |
| 1955 | + (type $two (shared (struct (field i32)))) |
| 1956 | + ;; CHECK: (type $two-same (shared (struct (field i32)))) |
| 1957 | + (type $two-same (shared (struct (field i32)))) |
| 1958 | + ) |
| 1959 | + |
| 1960 | + ;; CHECK: (type $3 (func (param (ref $one)))) |
| 1961 | + |
| 1962 | + ;; CHECK: (type $4 (func (param (ref $two)))) |
| 1963 | + |
| 1964 | + ;; CHECK: (type $5 (func (param (ref $two-same)))) |
| 1965 | + |
| 1966 | + ;; CHECK: (global $one (ref $one) (struct.new $one |
| 1967 | + ;; CHECK-NEXT: (i32.const 42) |
| 1968 | + ;; CHECK-NEXT: )) |
| 1969 | + (global $one (ref $one) (struct.new $one (i32.const 42))) |
| 1970 | + |
| 1971 | + ;; CHECK: (global $two-a (ref $two) (struct.new $two |
| 1972 | + ;; CHECK-NEXT: (i32.const 42) |
| 1973 | + ;; CHECK-NEXT: )) |
| 1974 | + (global $two-a (ref $two) (struct.new $two (i32.const 42))) |
| 1975 | + |
| 1976 | + ;; CHECK: (global $two-b (ref $two) (struct.new $two |
| 1977 | + ;; CHECK-NEXT: (i32.const 1337) |
| 1978 | + ;; CHECK-NEXT: )) |
| 1979 | + (global $two-b (ref $two) (struct.new $two (i32.const 1337))) |
| 1980 | + |
| 1981 | + ;; CHECK: (global $two-same-a (ref $two-same) (struct.new $two-same |
| 1982 | + ;; CHECK-NEXT: (i32.const 42) |
| 1983 | + ;; CHECK-NEXT: )) |
| 1984 | + (global $two-same-a (ref $two-same) (struct.new $two-same (i32.const 42))) |
| 1985 | + |
| 1986 | + ;; CHECK: (global $two-same-b (ref $two-same) (struct.new $two-same |
| 1987 | + ;; CHECK-NEXT: (i32.const 42) |
| 1988 | + ;; CHECK-NEXT: )) |
| 1989 | + (global $two-same-b (ref $two-same) (struct.new $two-same (i32.const 42))) |
| 1990 | + |
| 1991 | + ;; CHECK: (func $one (type $3) (param $0 (ref $one)) |
| 1992 | + ;; CHECK-NEXT: (drop |
| 1993 | + ;; CHECK-NEXT: (struct.get $one 0 |
| 1994 | + ;; CHECK-NEXT: (block (result (ref $one)) |
| 1995 | + ;; CHECK-NEXT: (drop |
| 1996 | + ;; CHECK-NEXT: (ref.as_non_null |
| 1997 | + ;; CHECK-NEXT: (local.get $0) |
| 1998 | + ;; CHECK-NEXT: ) |
| 1999 | + ;; CHECK-NEXT: ) |
| 2000 | + ;; CHECK-NEXT: (global.get $one) |
| 2001 | + ;; CHECK-NEXT: ) |
| 2002 | + ;; CHECK-NEXT: ) |
| 2003 | + ;; CHECK-NEXT: ) |
| 2004 | + ;; CHECK-NEXT: (drop |
| 2005 | + ;; CHECK-NEXT: (struct.atomic.get acqrel $one 0 |
| 2006 | + ;; CHECK-NEXT: (block (result (ref $one)) |
| 2007 | + ;; CHECK-NEXT: (drop |
| 2008 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2009 | + ;; CHECK-NEXT: (local.get $0) |
| 2010 | + ;; CHECK-NEXT: ) |
| 2011 | + ;; CHECK-NEXT: ) |
| 2012 | + ;; CHECK-NEXT: (global.get $one) |
| 2013 | + ;; CHECK-NEXT: ) |
| 2014 | + ;; CHECK-NEXT: ) |
| 2015 | + ;; CHECK-NEXT: ) |
| 2016 | + ;; CHECK-NEXT: (drop |
| 2017 | + ;; CHECK-NEXT: (struct.atomic.get $one 0 |
| 2018 | + ;; CHECK-NEXT: (block (result (ref $one)) |
| 2019 | + ;; CHECK-NEXT: (drop |
| 2020 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2021 | + ;; CHECK-NEXT: (local.get $0) |
| 2022 | + ;; CHECK-NEXT: ) |
| 2023 | + ;; CHECK-NEXT: ) |
| 2024 | + ;; CHECK-NEXT: (global.get $one) |
| 2025 | + ;; CHECK-NEXT: ) |
| 2026 | + ;; CHECK-NEXT: ) |
| 2027 | + ;; CHECK-NEXT: ) |
| 2028 | + ;; CHECK-NEXT: ) |
| 2029 | + (func $one (param (ref $one)) |
| 2030 | + (drop |
| 2031 | + (struct.get $one 0 |
| 2032 | + (local.get 0) |
| 2033 | + ) |
| 2034 | + ) |
| 2035 | + (drop |
| 2036 | + (struct.atomic.get acqrel $one 0 |
| 2037 | + (local.get 0) |
| 2038 | + ) |
| 2039 | + ) |
| 2040 | + (drop |
| 2041 | + (struct.atomic.get $one 0 |
| 2042 | + (local.get 0) |
| 2043 | + ) |
| 2044 | + ) |
| 2045 | + ) |
| 2046 | + |
| 2047 | + ;; CHECK: (func $two (type $4) (param $0 (ref $two)) |
| 2048 | + ;; CHECK-NEXT: (drop |
| 2049 | + ;; CHECK-NEXT: (select |
| 2050 | + ;; CHECK-NEXT: (i32.const 42) |
| 2051 | + ;; CHECK-NEXT: (i32.const 1337) |
| 2052 | + ;; CHECK-NEXT: (ref.eq |
| 2053 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2054 | + ;; CHECK-NEXT: (local.get $0) |
| 2055 | + ;; CHECK-NEXT: ) |
| 2056 | + ;; CHECK-NEXT: (global.get $two-a) |
| 2057 | + ;; CHECK-NEXT: ) |
| 2058 | + ;; CHECK-NEXT: ) |
| 2059 | + ;; CHECK-NEXT: ) |
| 2060 | + ;; CHECK-NEXT: (drop |
| 2061 | + ;; CHECK-NEXT: (select |
| 2062 | + ;; CHECK-NEXT: (i32.const 42) |
| 2063 | + ;; CHECK-NEXT: (i32.const 1337) |
| 2064 | + ;; CHECK-NEXT: (ref.eq |
| 2065 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2066 | + ;; CHECK-NEXT: (local.get $0) |
| 2067 | + ;; CHECK-NEXT: ) |
| 2068 | + ;; CHECK-NEXT: (global.get $two-a) |
| 2069 | + ;; CHECK-NEXT: ) |
| 2070 | + ;; CHECK-NEXT: ) |
| 2071 | + ;; CHECK-NEXT: ) |
| 2072 | + ;; CHECK-NEXT: (drop |
| 2073 | + ;; CHECK-NEXT: (select |
| 2074 | + ;; CHECK-NEXT: (i32.const 42) |
| 2075 | + ;; CHECK-NEXT: (i32.const 1337) |
| 2076 | + ;; CHECK-NEXT: (ref.eq |
| 2077 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2078 | + ;; CHECK-NEXT: (local.get $0) |
| 2079 | + ;; CHECK-NEXT: ) |
| 2080 | + ;; CHECK-NEXT: (block (result (ref $two)) |
| 2081 | + ;; CHECK-NEXT: (atomic.fence) |
| 2082 | + ;; CHECK-NEXT: (global.get $two-a) |
| 2083 | + ;; CHECK-NEXT: ) |
| 2084 | + ;; CHECK-NEXT: ) |
| 2085 | + ;; CHECK-NEXT: ) |
| 2086 | + ;; CHECK-NEXT: ) |
| 2087 | + ;; CHECK-NEXT: ) |
| 2088 | + (func $two (param (ref $two)) |
| 2089 | + (drop |
| 2090 | + (struct.get $two 0 |
| 2091 | + (local.get 0) |
| 2092 | + ) |
| 2093 | + ) |
| 2094 | + (drop |
| 2095 | + ;; This is optimized normally because there cannot be any writes it |
| 2096 | + ;; synchronizes with. |
| 2097 | + (struct.atomic.get acqrel $two 0 |
| 2098 | + (local.get 0) |
| 2099 | + ) |
| 2100 | + ) |
| 2101 | + (drop |
| 2102 | + ;; This requires a fence to maintain its effect on the global order of |
| 2103 | + ;; seqcst operations. |
| 2104 | + (struct.atomic.get $two 0 |
| 2105 | + (local.get 0) |
| 2106 | + ) |
| 2107 | + ) |
| 2108 | + ) |
| 2109 | + |
| 2110 | + ;; CHECK: (func $two-same (type $5) (param $0 (ref $two-same)) |
| 2111 | + ;; CHECK-NEXT: (drop |
| 2112 | + ;; CHECK-NEXT: (block (result i32) |
| 2113 | + ;; CHECK-NEXT: (drop |
| 2114 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2115 | + ;; CHECK-NEXT: (local.get $0) |
| 2116 | + ;; CHECK-NEXT: ) |
| 2117 | + ;; CHECK-NEXT: ) |
| 2118 | + ;; CHECK-NEXT: (i32.const 42) |
| 2119 | + ;; CHECK-NEXT: ) |
| 2120 | + ;; CHECK-NEXT: ) |
| 2121 | + ;; CHECK-NEXT: (drop |
| 2122 | + ;; CHECK-NEXT: (block (result i32) |
| 2123 | + ;; CHECK-NEXT: (drop |
| 2124 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2125 | + ;; CHECK-NEXT: (local.get $0) |
| 2126 | + ;; CHECK-NEXT: ) |
| 2127 | + ;; CHECK-NEXT: ) |
| 2128 | + ;; CHECK-NEXT: (i32.const 42) |
| 2129 | + ;; CHECK-NEXT: ) |
| 2130 | + ;; CHECK-NEXT: ) |
| 2131 | + ;; CHECK-NEXT: (drop |
| 2132 | + ;; CHECK-NEXT: (block (result i32) |
| 2133 | + ;; CHECK-NEXT: (drop |
| 2134 | + ;; CHECK-NEXT: (ref.as_non_null |
| 2135 | + ;; CHECK-NEXT: (local.get $0) |
| 2136 | + ;; CHECK-NEXT: ) |
| 2137 | + ;; CHECK-NEXT: ) |
| 2138 | + ;; CHECK-NEXT: (atomic.fence) |
| 2139 | + ;; CHECK-NEXT: (i32.const 42) |
| 2140 | + ;; CHECK-NEXT: ) |
| 2141 | + ;; CHECK-NEXT: ) |
| 2142 | + ;; CHECK-NEXT: ) |
| 2143 | + (func $two-same (param (ref $two-same)) |
| 2144 | + (drop |
| 2145 | + (struct.get $two-same 0 |
| 2146 | + (local.get 0) |
| 2147 | + ) |
| 2148 | + ) |
| 2149 | + (drop |
| 2150 | + ;; This is optimized normally because there cannot be any writes it |
| 2151 | + ;; synchronizes with. |
| 2152 | + (struct.atomic.get acqrel $two-same 0 |
| 2153 | + (local.get 0) |
| 2154 | + ) |
| 2155 | + ) |
| 2156 | + (drop |
| 2157 | + ;; This requires a fence to maintain its effect on the global order of |
| 2158 | + ;; seqcst operations. |
| 2159 | + (struct.atomic.get $two-same 0 |
| 2160 | + (local.get 0) |
| 2161 | + ) |
| 2162 | + ) |
| 2163 | + ) |
| 2164 | +) |
0 commit comments