Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[WebAssembly] Disable offset folding for function addresses
Wasm does not support function addresses with offsets, but isel can generate folded SDValues in the form of (@func + offset) without this patch. Fixes https://bugs.llvm.org/show_bug.cgi?id=43133. Reviewed By: dschuff, sbc100 Differential Revision: https://reviews.llvm.org/D107940
- Loading branch information
Showing
3 changed files
with
43 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
; RUN: llc < %s -verify-machineinstrs | FileCheck %s | ||
|
||
; Wasm does not currently support function addresses with offsets, so we | ||
; shouldn't try to create a folded SDNode like (function + offset). This is a | ||
; regression test for the folding bug and this should not crash in MCInstLower. | ||
|
||
target triple = "wasm32-unknown-unknown" | ||
|
||
; 'hidden' here should be present to reproduce the bug | ||
declare hidden void @ham(i8*) | ||
|
||
define void @bar(i8* %ptr) { | ||
bb1: | ||
br i1 undef, label %bb3, label %bb2 | ||
|
||
bb2: | ||
; While lowering this switch, isel creates (@ham + 1) expression as a course | ||
; of range optimization for switch, and tries to fold the expression, but | ||
; wasm does not support with function addresses with offsets. This folding | ||
; should be disabled. | ||
; CHECK: i32.const ham | ||
; CHECK-NEXT: i32.const 1 | ||
; CHECK-NEXT: i32.add | ||
switch i32 ptrtoint (void (i8*)* @ham to i32), label %bb4 [ | ||
i32 -1, label %bb3 | ||
i32 0, label %bb3 | ||
] | ||
|
||
bb3: | ||
unreachable | ||
|
||
bb4: | ||
%tmp = load i8, i8* %ptr | ||
unreachable | ||
} |