|
5 | 5 | ; RUN: opt < %s -passes='bounds-checking<rt-abort>' -S | FileCheck %s --check-prefixes=RTABORT
|
6 | 6 | ; RUN: opt < %s -passes='bounds-checking<min-rt>' -S | FileCheck %s --check-prefixes=MINRT
|
7 | 7 | ; RUN: opt < %s -passes='bounds-checking<min-rt-abort>' -S | FileCheck %s --check-prefixes=MINRTABORT
|
| 8 | +; |
| 9 | +; merge defaults to true |
| 10 | +; RUN: opt < %s -passes='bounds-checking<merge=true>' -S | FileCheck %s --check-prefixes=TR |
| 11 | +; RUN: opt < %s -passes='bounds-checking<trap;merge=true>' -S | FileCheck %s --check-prefixes=TR |
| 12 | +; RUN: opt < %s -passes='bounds-checking<rt;merge=true>' -S | FileCheck %s --check-prefixes=RT |
| 13 | +; RUN: opt < %s -passes='bounds-checking<rt-abort;merge=true>' -S | FileCheck %s --check-prefixes=RTABORT |
| 14 | +; RUN: opt < %s -passes='bounds-checking<min-rt;merge=true>' -S | FileCheck %s --check-prefixes=MINRT |
| 15 | +; RUN: opt < %s -passes='bounds-checking<min-rt-abort;merge=true>' -S | FileCheck %s --check-prefixes=MINRTABORT |
| 16 | +; |
| 17 | +; RUN: opt < %s -passes='bounds-checking<merge=false>' -S | FileCheck %s --check-prefixes=TR-NOMERGE |
| 18 | +; RUN: opt < %s -passes='bounds-checking<trap;merge=false>' -S | FileCheck %s --check-prefixes=TR-NOMERGE |
| 19 | +; RUN: opt < %s -passes='bounds-checking<rt;merge=false>' -S | FileCheck %s --check-prefixes=RT-NOMERGE |
| 20 | +; RUN: opt < %s -passes='bounds-checking<rt-abort;merge=false>' -S | FileCheck %s --check-prefixes=RTABORT-NOMERGE |
| 21 | +; RUN: opt < %s -passes='bounds-checking<min-rt;merge=false>' -S | FileCheck %s --check-prefixes=MINRT-NOMERGE |
| 22 | +; RUN: opt < %s -passes='bounds-checking<min-rt-abort;merge=false>' -S | FileCheck %s --check-prefixes=MINRTABORT-NOMERGE |
8 | 23 |
|
9 | 24 | target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
10 | 25 |
|
@@ -88,8 +103,100 @@ define void @f1(i64 %x) nounwind {
|
88 | 103 | ; MINRTABORT: [[TRAP]]:
|
89 | 104 | ; MINRTABORT-NEXT: call void @__ubsan_handle_local_out_of_bounds_minimal_abort() #[[ATTR1:[0-9]+]]
|
90 | 105 | ; MINRTABORT-NEXT: unreachable
|
| 106 | +; |
| 107 | +; TR-NOMERGE-LABEL: define void @f1( |
| 108 | +; TR-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| 109 | +; TR-NOMERGE-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]] |
| 110 | +; TR-NOMERGE-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8 |
| 111 | +; TR-NOMERGE-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0 |
| 112 | +; TR-NOMERGE-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16 |
| 113 | +; TR-NOMERGE-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]] |
| 114 | +; TR-NOMERGE-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]] |
| 115 | +; TR-NOMERGE-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]] |
| 116 | +; TR-NOMERGE: [[BB7]]: |
| 117 | +; TR-NOMERGE-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4 |
| 118 | +; TR-NOMERGE-NEXT: ret void |
| 119 | +; TR-NOMERGE: [[TRAP]]: |
| 120 | +; TR-NOMERGE-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR2:[0-9]+]] |
| 121 | +; TR-NOMERGE-NEXT: unreachable |
| 122 | +; |
| 123 | +; RT-NOMERGE-LABEL: define void @f1( |
| 124 | +; RT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| 125 | +; RT-NOMERGE-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]] |
| 126 | +; RT-NOMERGE-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8 |
| 127 | +; RT-NOMERGE-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0 |
| 128 | +; RT-NOMERGE-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16 |
| 129 | +; RT-NOMERGE-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]] |
| 130 | +; RT-NOMERGE-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]] |
| 131 | +; RT-NOMERGE-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]] |
| 132 | +; RT-NOMERGE: [[BB7]]: |
| 133 | +; RT-NOMERGE-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4 |
| 134 | +; RT-NOMERGE-NEXT: ret void |
| 135 | +; RT-NOMERGE: [[TRAP]]: |
| 136 | +; RT-NOMERGE-NEXT: call void @__ubsan_handle_local_out_of_bounds() #[[ATTR1:[0-9]+]] |
| 137 | +; RT-NOMERGE-NEXT: br label %[[BB7]] |
| 138 | +; |
| 139 | +; RTABORT-NOMERGE-LABEL: define void @f1( |
| 140 | +; RTABORT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| 141 | +; RTABORT-NOMERGE-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]] |
| 142 | +; RTABORT-NOMERGE-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8 |
| 143 | +; RTABORT-NOMERGE-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0 |
| 144 | +; RTABORT-NOMERGE-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16 |
| 145 | +; RTABORT-NOMERGE-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]] |
| 146 | +; RTABORT-NOMERGE-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]] |
| 147 | +; RTABORT-NOMERGE-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]] |
| 148 | +; RTABORT-NOMERGE: [[BB7]]: |
| 149 | +; RTABORT-NOMERGE-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4 |
| 150 | +; RTABORT-NOMERGE-NEXT: ret void |
| 151 | +; RTABORT-NOMERGE: [[TRAP]]: |
| 152 | +; RTABORT-NOMERGE-NEXT: call void @__ubsan_handle_local_out_of_bounds_abort() #[[ATTR2:[0-9]+]] |
| 153 | +; RTABORT-NOMERGE-NEXT: unreachable |
| 154 | +; |
| 155 | +; MINRT-NOMERGE-LABEL: define void @f1( |
| 156 | +; MINRT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| 157 | +; MINRT-NOMERGE-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]] |
| 158 | +; MINRT-NOMERGE-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8 |
| 159 | +; MINRT-NOMERGE-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0 |
| 160 | +; MINRT-NOMERGE-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16 |
| 161 | +; MINRT-NOMERGE-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]] |
| 162 | +; MINRT-NOMERGE-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]] |
| 163 | +; MINRT-NOMERGE-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]] |
| 164 | +; MINRT-NOMERGE: [[BB7]]: |
| 165 | +; MINRT-NOMERGE-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4 |
| 166 | +; MINRT-NOMERGE-NEXT: ret void |
| 167 | +; MINRT-NOMERGE: [[TRAP]]: |
| 168 | +; MINRT-NOMERGE-NEXT: call void @__ubsan_handle_local_out_of_bounds_minimal() #[[ATTR1:[0-9]+]] |
| 169 | +; MINRT-NOMERGE-NEXT: br label %[[BB7]] |
| 170 | +; |
| 171 | +; MINRTABORT-NOMERGE-LABEL: define void @f1( |
| 172 | +; MINRTABORT-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] { |
| 173 | +; MINRTABORT-NOMERGE-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]] |
| 174 | +; MINRTABORT-NOMERGE-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8 |
| 175 | +; MINRTABORT-NOMERGE-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0 |
| 176 | +; MINRTABORT-NOMERGE-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16 |
| 177 | +; MINRTABORT-NOMERGE-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]] |
| 178 | +; MINRTABORT-NOMERGE-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]] |
| 179 | +; MINRTABORT-NOMERGE-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]] |
| 180 | +; MINRTABORT-NOMERGE: [[BB7]]: |
| 181 | +; MINRTABORT-NOMERGE-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4 |
| 182 | +; MINRTABORT-NOMERGE-NEXT: ret void |
| 183 | +; MINRTABORT-NOMERGE: [[TRAP]]: |
| 184 | +; MINRTABORT-NOMERGE-NEXT: call void @__ubsan_handle_local_out_of_bounds_minimal_abort() #[[ATTR2:[0-9]+]] |
| 185 | +; MINRTABORT-NOMERGE-NEXT: unreachable |
91 | 186 | ;
|
92 | 187 | %1 = alloca i128, i64 %x
|
93 | 188 | %3 = load i128, ptr %1, align 4
|
94 | 189 | ret void
|
95 | 190 | }
|
| 191 | + |
| 192 | +; TR: attributes #[[ATTR2]] = { noreturn nounwind } |
| 193 | +; RT: attributes #[[ATTR0]] = { nounwind } |
| 194 | +; RTABORT: attributes #[[ATTR1]] = { noreturn nounwind } |
| 195 | +; MINRT: attributes #[[ATTR0]] = { nounwind } |
| 196 | +; MINRTABORT: attributes #[[ATTR1]] = { noreturn nounwind } |
| 197 | + |
| 198 | +; TR-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind } |
| 199 | +; RT-NOMERGE: attributes #[[ATTR1]] = { nomerge nounwind } |
| 200 | +; RTABORT-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind } |
| 201 | +; MINRT-NOMERGE: attributes #[[ATTR1]] = { nomerge nounwind } |
| 202 | +; MINRTABORT-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind } |
0 commit comments