Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / trapping-load-unreachable.ll
blob0dc61c64dfa43cfb42ebab336cf69b4385377cbb
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
3 ; PR2967
5 target datalayout =
6 "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32"
7 target triple = "i386-pc-linux-gnu"
9 define void @test1(i32 %x) nounwind {
10 ; CHECK-LABEL: @test1(
11 ; CHECK-NEXT:  entry:
12 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[X:%.*]], 0
13 ; CHECK-NEXT:    [[TMP1:%.*]] = xor i1 [[TMP0]], true
14 ; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP1]])
15 ; CHECK-NEXT:    ret void
17 entry:
18   %0 = icmp eq i32 %x, 0          ; <i1> [#uses=1]
19   br i1 %0, label %bb, label %return
21 bb:             ; preds = %entry
22   %1 = load volatile i32, ptr null
23   unreachable
25   br label %return
26 return:         ; preds = %entry
27   ret void
30 define void @test1_no_null_opt(i32 %x) nounwind #0 {
31 ; CHECK-LABEL: @test1_no_null_opt(
32 ; CHECK-NEXT:  entry:
33 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[X:%.*]], 0
34 ; CHECK-NEXT:    [[TMP1:%.*]] = xor i1 [[TMP0]], true
35 ; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP1]])
36 ; CHECK-NEXT:    ret void
38 entry:
39   %0 = icmp eq i32 %x, 0          ; <i1> [#uses=1]
40   br i1 %0, label %bb, label %return
42 bb:             ; preds = %entry
43   %1 = load volatile i32, ptr null
44   unreachable
46   br label %return
47 return:         ; preds = %entry
48   ret void
51 ; rdar://7958343
52 define void @test2() nounwind {
53 ; CHECK-LABEL: @test2(
54 ; CHECK-NEXT:  entry:
55 ; CHECK-NEXT:    unreachable
57 entry:
58   store i32 4,ptr null
59   ret void
63 define void @test2_no_null_opt() nounwind #0 {
64 ; CHECK-LABEL: @test2_no_null_opt(
65 ; CHECK-NEXT:  entry:
66 ; CHECK-NEXT:    store i32 4, ptr null, align 4
67 ; CHECK-NEXT:    ret void
69 entry:
70   store i32 4,ptr null
71   ret void
74 ; PR7369
75 define void @test3() nounwind {
76 ; CHECK-LABEL: @test3(
77 ; CHECK-NEXT:  entry:
78 ; CHECK-NEXT:    store volatile i32 4, ptr null, align 4
79 ; CHECK-NEXT:    ret void
81 entry:
82   store volatile i32 4, ptr null
83   ret void
87 define void @test3_no_null_opt() nounwind #0 {
88 ; CHECK-LABEL: @test3_no_null_opt(
89 ; CHECK-NEXT:  entry:
90 ; CHECK-NEXT:    store volatile i32 4, ptr null, align 4
91 ; CHECK-NEXT:    ret void
93 entry:
94   store volatile i32 4, ptr null
95   ret void
99 ; Check store before unreachable.
100 define void @test4(i1 %C, ptr %P) {
101 ; CHECK-LABEL: @test4(
102 ; CHECK-NEXT:  entry:
103 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]
104 ; CHECK:       T:
105 ; CHECK-NEXT:    store volatile i32 0, ptr [[P:%.*]], align 4
106 ; CHECK-NEXT:    unreachable
107 ; CHECK:       F:
108 ; CHECK-NEXT:    ret void
110 entry:
111   br i1 %C, label %T, label %F
113   store volatile i32 0, ptr %P
114   unreachable
116   ret void
119 ; Check cmpxchg before unreachable.
120 define void @test5(i1 %C, ptr %P) {
121 ; CHECK-LABEL: @test5(
122 ; CHECK-NEXT:  entry:
123 ; CHECK-NEXT:    [[TMP0:%.*]] = xor i1 [[C:%.*]], true
124 ; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP0]])
125 ; CHECK-NEXT:    ret void
127 entry:
128   br i1 %C, label %T, label %F
130   cmpxchg volatile ptr %P, i32 0, i32 1 seq_cst seq_cst
131   unreachable
133   ret void
136 ; Check atomicrmw before unreachable.
137 define void @test6(i1 %C, ptr %P) {
138 ; CHECK-LABEL: @test6(
139 ; CHECK-NEXT:  entry:
140 ; CHECK-NEXT:    [[TMP0:%.*]] = xor i1 [[C:%.*]], true
141 ; CHECK-NEXT:    call void @llvm.assume(i1 [[TMP0]])
142 ; CHECK-NEXT:    ret void
144 entry:
145   br i1 %C, label %T, label %F
147   atomicrmw volatile xchg ptr %P, i32 0 seq_cst
148   unreachable
150   ret void
153 attributes #0 = { null_pointer_is_valid }