201 lines
5.2 KiB
LLVM
201 lines
5.2 KiB
LLVM
|
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||
|
; RUN: opt < %s -basic-aa -dse -S | FileCheck %s
|
||
|
|
||
|
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
||
|
|
||
|
|
||
|
define void @test4(i32* noalias %P) {
|
||
|
; CHECK-LABEL: @test4(
|
||
|
; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4
|
||
|
; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
|
||
|
; CHECK: bb1:
|
||
|
; CHECK-NEXT: br label [[BB3:%.*]]
|
||
|
; CHECK: bb2:
|
||
|
; CHECK-NEXT: [[X:%.*]] = load i32, i32* [[P]], align 4
|
||
|
; CHECK-NEXT: br label [[BB3]]
|
||
|
; CHECK: bb3:
|
||
|
; CHECK-NEXT: store i32 1, i32* [[P]], align 4
|
||
|
; CHECK-NEXT: ret void
|
||
|
;
|
||
|
store i32 0, i32* %P
|
||
|
br i1 true, label %bb1, label %bb2
|
||
|
bb1:
|
||
|
br label %bb3
|
||
|
bb2:
|
||
|
%x = load i32, i32* %P
|
||
|
br label %bb3
|
||
|
bb3:
|
||
|
store i32 1, i32* %P
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @test5(i32* noalias %P) {
|
||
|
; CHECK-LABEL: @test5(
|
||
|
; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
|
||
|
; CHECK: bb1:
|
||
|
; CHECK-NEXT: br label [[BB3:%.*]]
|
||
|
; CHECK: bb2:
|
||
|
; CHECK-NEXT: br label [[BB3]]
|
||
|
; CHECK: bb3:
|
||
|
; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4
|
||
|
; CHECK-NEXT: ret void
|
||
|
;
|
||
|
br i1 true, label %bb1, label %bb2
|
||
|
bb1:
|
||
|
store i32 1, i32* %P
|
||
|
br label %bb3
|
||
|
bb2:
|
||
|
store i32 1, i32* %P
|
||
|
br label %bb3
|
||
|
bb3:
|
||
|
store i32 0, i32* %P
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @test8(i32* %P, i32* %Q) {
|
||
|
; CHECK-LABEL: @test8(
|
||
|
; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
|
||
|
; CHECK: bb1:
|
||
|
; CHECK-NEXT: br label [[BB3:%.*]]
|
||
|
; CHECK: bb2:
|
||
|
; CHECK-NEXT: store i32 1, i32* [[Q:%.*]], align 4
|
||
|
; CHECK-NEXT: br label [[BB3]]
|
||
|
; CHECK: bb3:
|
||
|
; CHECK-NEXT: store i32 0, i32* [[P:%.*]], align 4
|
||
|
; CHECK-NEXT: ret void
|
||
|
;
|
||
|
br i1 true, label %bb1, label %bb2
|
||
|
bb1:
|
||
|
store i32 1, i32* %P
|
||
|
br label %bb3
|
||
|
bb2:
|
||
|
store i32 1, i32* %Q
|
||
|
br label %bb3
|
||
|
bb3:
|
||
|
store i32 0, i32* %P
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @test10(i32* noalias %P) {
|
||
|
; CHECK-LABEL: @test10(
|
||
|
; CHECK-NEXT: store i32 1, i32* [[P:%.*]], align 4
|
||
|
; CHECK-NEXT: br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
|
||
|
; CHECK: bb1:
|
||
|
; CHECK-NEXT: br label [[BB3:%.*]]
|
||
|
; CHECK: bb2:
|
||
|
; CHECK-NEXT: br label [[BB3]]
|
||
|
; CHECK: bb3:
|
||
|
; CHECK-NEXT: ret void
|
||
|
;
|
||
|
%P2 = bitcast i32* %P to i8*
|
||
|
store i32 0, i32* %P
|
||
|
br i1 true, label %bb1, label %bb2
|
||
|
bb1:
|
||
|
br label %bb3
|
||
|
bb2:
|
||
|
br label %bb3
|
||
|
bb3:
|
||
|
store i8 1, i8* %P2
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
declare void @hoge()
|
||
|
|
||
|
; Check a function with a MemoryPhi with 3 incoming values.
|
||
|
define void @widget(i32* %Ptr, i1 %c1, i1 %c2, i32 %v1, i32 %v2, i32 %v3) {
|
||
|
; CHECK-LABEL: @widget(
|
||
|
; CHECK-NEXT: bb:
|
||
|
; CHECK-NEXT: tail call void @hoge()
|
||
|
; CHECK-NEXT: br i1 [[C1:%.*]], label [[BB3:%.*]], label [[BB1:%.*]]
|
||
|
; CHECK: bb1:
|
||
|
; CHECK-NEXT: br i1 [[C2:%.*]], label [[BB2:%.*]], label [[BB3]]
|
||
|
; CHECK: bb2:
|
||
|
; CHECK-NEXT: br label [[BB3]]
|
||
|
; CHECK: bb3:
|
||
|
; CHECK-NEXT: br label [[BB4:%.*]]
|
||
|
; CHECK: bb4:
|
||
|
; CHECK-NEXT: switch i32 [[V1:%.*]], label [[BB8:%.*]] [
|
||
|
; CHECK-NEXT: i32 0, label [[BB5:%.*]]
|
||
|
; CHECK-NEXT: i32 1, label [[BB6:%.*]]
|
||
|
; CHECK-NEXT: i32 2, label [[BB7:%.*]]
|
||
|
; CHECK-NEXT: ]
|
||
|
; CHECK: bb5:
|
||
|
; CHECK-NEXT: store i32 0, i32* [[PTR:%.*]], align 4
|
||
|
; CHECK-NEXT: br label [[BB8]]
|
||
|
; CHECK: bb6:
|
||
|
; CHECK-NEXT: store i32 1, i32* [[PTR]], align 4
|
||
|
; CHECK-NEXT: br label [[BB8]]
|
||
|
; CHECK: bb7:
|
||
|
; CHECK-NEXT: store i32 2, i32* [[PTR]], align 4
|
||
|
; CHECK-NEXT: br label [[BB8]]
|
||
|
; CHECK: bb8:
|
||
|
; CHECK-NEXT: br label [[BB4]]
|
||
|
;
|
||
|
bb:
|
||
|
tail call void @hoge()
|
||
|
br i1 %c1, label %bb3, label %bb1
|
||
|
|
||
|
bb1: ; preds = %bb
|
||
|
br i1 %c2, label %bb2, label %bb3
|
||
|
|
||
|
bb2: ; preds = %bb1
|
||
|
store i32 -1, i32* %Ptr, align 4
|
||
|
br label %bb3
|
||
|
|
||
|
bb3: ; preds = %bb2, %bb1, %bb
|
||
|
br label %bb4
|
||
|
|
||
|
bb4: ; preds = %bb8, %bb3
|
||
|
switch i32 %v1, label %bb8 [
|
||
|
i32 0, label %bb5
|
||
|
i32 1, label %bb6
|
||
|
i32 2, label %bb7
|
||
|
]
|
||
|
|
||
|
bb5: ; preds = %bb4
|
||
|
store i32 0, i32* %Ptr, align 4
|
||
|
br label %bb8
|
||
|
|
||
|
bb6: ; preds = %bb4
|
||
|
store i32 1, i32* %Ptr, align 4
|
||
|
br label %bb8
|
||
|
|
||
|
bb7: ; preds = %bb4
|
||
|
store i32 2, i32* %Ptr, align 4
|
||
|
br label %bb8
|
||
|
|
||
|
bb8: ; preds = %bb7, %bb6, %bb5, %bb4
|
||
|
br label %bb4
|
||
|
}
|
||
|
|
||
|
|
||
|
declare void @fn1_test11()
|
||
|
declare void @fn2_test11()
|
||
|
|
||
|
define void @test11(i1 %c, i8** %ptr.1) {
|
||
|
; CHECK-LABEL: @test11(
|
||
|
; CHECK-NEXT: entry:
|
||
|
; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]]
|
||
|
; CHECK: if.then:
|
||
|
; CHECK-NEXT: tail call void @fn2_test11() #0
|
||
|
; CHECK-NEXT: br label [[EXIT]]
|
||
|
; CHECK: exit:
|
||
|
; CHECK-NEXT: store i8* null, i8** [[PTR_1:%.*]], align 8
|
||
|
; CHECK-NEXT: tail call void @fn2_test11() #0
|
||
|
; CHECK-NEXT: ret void
|
||
|
;
|
||
|
entry:
|
||
|
br i1 %c, label %if.then, label %exit
|
||
|
|
||
|
if.then: ; preds = %entry
|
||
|
tail call void @fn2_test11() #1
|
||
|
br label %exit
|
||
|
|
||
|
exit:
|
||
|
store i8* null, i8** %ptr.1, align 8
|
||
|
tail call void @fn2_test11() #1
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
attributes #1 = { nounwind }
|