1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00
llvm-mirror/test/CodeGen/WebAssembly/aliases.ll
Sam Clegg 7eacd92326 [WebAssembly] MC: Fix for data aliases with offsets (getelementptr)
For some reason we hadn't seen such cases in the wild which makes
me think that clang and rustc don't generate these.  In the bug which
reproduces it only occurs with LTO so my guess is that some LTO pass
is creating this alias + gep.

See: https://github.com/emscripten-core/emscripten/issues/8731

Differential Revision: https://reviews.llvm.org/D79462
2020-06-17 16:25:50 -07:00

72 lines
1.7 KiB
LLVM

; Based llvm/test/CodeGen/X86/aliases.ll
; RUN: llc < %s -mtriple=wasm32-unknown-uknown -asm-verbose=false | FileCheck %s
@bar = global i32 42
; CHECK-DAG: .globl foo1
; CHECK-DAG: .set foo1, bar
@foo1 = alias i32, i32* @bar
; CHECK-DAG: .globl foo2
; CHECK-DAG: .set foo2, bar
@foo2 = alias i32, i32* @bar
%FunTy = type i32()
define i32 @foo_f() {
ret i32 0
}
; CHECK-DAG: .weak bar_f
; CHECK-DAG: .type bar_f,@function
; CHECK-DAG: .set bar_f, foo_f
@bar_f = weak alias %FunTy, %FunTy* @foo_f
; CHECK-DAG: .weak bar_l
; CHECK-DAG: .set bar_l, bar
@bar_l = linkonce_odr alias i32, i32* @bar
; CHECK-DAG: .set bar_i, bar
@bar_i = internal alias i32, i32* @bar
; CHECK-DAG: .globl A
@A = alias i64, bitcast (i32* @bar to i64*)
; CHECK-DAG: .globl bar_h
; CHECK-DAG: .hidden bar_h
; CHECK-DAG: .set bar_h, bar
@bar_h = hidden alias i32, i32* @bar
; CHECK-DAG: .globl bar_p
; CHECK-DAG: .protected bar_p
; CHECK-DAG: .set bar_p, bar
@bar_p = protected alias i32, i32* @bar
; CHECK-DAG: .set test2, bar+4
@test2 = alias i32, getelementptr(i32, i32* @bar, i32 1)
; CHECK-DAG: .set test3, 42
@test3 = alias i32, inttoptr(i32 42 to i32*)
; CHECK-DAG: .set test4, bar
@test4 = alias i32, inttoptr(i64 ptrtoint (i32* @bar to i64) to i32*)
; CHECK-DAG: .set test5, test2-bar
@test5 = alias i32, inttoptr(i32 sub (i32 ptrtoint (i32* @test2 to i32),
i32 ptrtoint (i32* @bar to i32)) to i32*)
; CHECK-DAG: .globl test
define i32 @test() {
entry:
%tmp = load i32, i32* @foo1
%tmp1 = load i32, i32* @foo2
%tmp0 = load i32, i32* @bar_i
%tmp2 = call i32 @foo_f()
%tmp3 = add i32 %tmp, %tmp2
%tmp4 = call i32 @bar_f()
%tmp5 = add i32 %tmp3, %tmp4
%tmp6 = add i32 %tmp1, %tmp5
%tmp7 = add i32 %tmp6, %tmp0
ret i32 %tmp7
}