
This test is the last holdout that still uses the legacy loop simplify CFG pass. The issues originally pointed out in the test comments seem to have been fixed now as there are no MemorySSA verification failures.
64 lines
2.5 KiB
LLVM
64 lines
2.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -passes='loop-mssa(simple-loop-unswitch<nontrivial>,loop-reduce,loop-simplifycfg)' -verify-memoryssa -S %s | FileCheck %s
|
|
|
|
; Test case for PR47557.
|
|
|
|
; REQUIRES: x86-registered-target
|
|
|
|
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"
|
|
|
|
@a = external global i32, align 4
|
|
@c = external global [1 x i32], align 4
|
|
|
|
define ptr @test() {
|
|
; CHECK-LABEL: @test(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: switch i32 0, label [[ENTRY_SPLIT:%.*]] [
|
|
; CHECK-NEXT: i32 1, label [[FOR_BODY3SPLIT:%.*]]
|
|
; CHECK-NEXT: i32 2, label [[FOR_COND2_2_FOR_BODY3_CRIT_EDGE:%.*]]
|
|
; CHECK-NEXT: ]
|
|
; CHECK: entry.split:
|
|
; CHECK-NEXT: br label [[FOR_COND:%.*]]
|
|
; CHECK: for.cond:
|
|
; CHECK-NEXT: [[STOREMERGE:%.*]] = phi i64 [ 0, [[ENTRY_SPLIT]] ], [ [[INC7:%.*]], [[FOR_COND]] ]
|
|
; CHECK-NEXT: [[INC7]] = add nsw i64 [[STOREMERGE]], 1
|
|
; CHECK-NEXT: br label [[FOR_COND]]
|
|
; CHECK: for.body3split:
|
|
; CHECK-NEXT: br label [[FOR_BODY3:%.*]]
|
|
; CHECK: for.cond2.2.for.body3_crit_edge:
|
|
; CHECK-NEXT: br label [[FOR_BODY3]]
|
|
; CHECK: for.body3:
|
|
; CHECK-NEXT: [[STOREMERGE_LCSSA:%.*]] = phi i64 [ poison, [[FOR_COND2_2_FOR_BODY3_CRIT_EDGE]] ], [ poison, [[FOR_BODY3SPLIT]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [1 x i32], ptr @c, i64 0, i64 [[STOREMERGE_LCSSA]]
|
|
; CHECK-NEXT: ret ptr [[ARRAYIDX]]
|
|
;
|
|
entry: ; preds = %entry
|
|
br label %for.cond
|
|
|
|
for.cond: ; preds = %cleanup, %entry
|
|
%storemerge = phi i64 [ 0, %entry ], [ %inc7, %cleanup ]
|
|
br label %for.cond2.1
|
|
|
|
for.body3: ; preds = %for.cond2.2, %for.cond2.1
|
|
%arrayidx = getelementptr inbounds [1 x i32], ptr @c, i64 0, i64 %storemerge
|
|
ret ptr %arrayidx
|
|
|
|
cleanup: ; preds = %for.end5, %if.then
|
|
%inc7 = add nsw i64 %storemerge, 1
|
|
br label %for.cond
|
|
|
|
for.cond2.1: ; preds = %for.cond
|
|
br i1 true, label %for.inc.1, label %for.body3
|
|
|
|
for.inc.1: ; preds = %for.end.1
|
|
br i1 false, label %for.body.2, label %cleanup
|
|
|
|
for.body.2: ; preds = %for.inc.1
|
|
store i32 0, ptr @a, align 4
|
|
br label %for.cond2.2
|
|
|
|
for.cond2.2: ; preds = %for.body.2
|
|
br i1 true, label %cleanup, label %for.body3
|
|
}
|