1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00
llvm-mirror/test/Analysis/MemorySSA/pr44027.ll
Alina Sbirlea 21c5787ed7 [MemorySSA] Moving at the end often means before terminator.
Moving accesses in MemorySSA at InsertionPlace::End, when an instruction is
moved into a block, almost always means insert at the end of the block, but
before the block terminator. This matters when the block terminator is a
MemoryAccess itself (an invoke), and the insertion must be done before
the terminator for the update to be correct.

Insert an additional position: InsertionPlace:BeforeTerminator and update
current usages where this applies.

Resolves PR44027.
2019-11-20 17:11:00 -08:00

28 lines
765 B
LLVM

; RUN: opt -gvn-hoist -verify-memoryssa -S < %s | FileCheck %s
; REQUIRES: asserts
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
declare i32 @wobble(...)
declare void @spam() align 2
; CHECK-LABEL: @f()
define void @f() personality i8* bitcast (i32 (...)* @wobble to i8*) {
bb:
%tmp = alloca i32*, align 8
invoke void @spam()
to label %bb16 unwind label %bb23
bb16: ; preds = %bb
%tmp17 = load i32*, i32** %tmp, align 8
%tmp18 = load i32*, i32** %tmp, align 8
unreachable
bb23: ; preds = %bb
%tmp24 = landingpad { i8*, i32 }
cleanup
unreachable
}