CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
831 lines
38 KiB
LLVM
831 lines
38 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: opt -S -passes=indvars < %s | FileCheck %s
|
|
|
|
define void @optimize_trap(i32 %block_size) {
|
|
; CHECK-LABEL: define void @optimize_trap(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[BLOCK_SIZE]], -1
|
|
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP1]], i32 3)
|
|
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 3, [[UMIN]]
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: br i1 [[TMP2]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @llvm.trap()
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP4:%.*]] = xor i8 [[TMP3]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP4]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @llvm.trap()
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @optimize_two_trap(i32 %block_size, i32 %onebound, i32 %otherbound) {
|
|
; CHECK-LABEL: define void @optimize_two_trap(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]], i32 [[ONEBOUND:%.*]], i32 [[OTHERBOUND:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: [[TMP7:%.*]] = zext i32 [[ONEBOUND]] to i64
|
|
; CHECK-NEXT: [[TMP8:%.*]] = add nuw nsw i64 [[TMP7]], 1
|
|
; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[OTHERBOUND]] to i64
|
|
; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 1
|
|
; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP3]], i64 [[TMP8]])
|
|
; CHECK-NEXT: [[TMP4:%.*]] = add i32 [[BLOCK_SIZE]], -1
|
|
; CHECK-NEXT: [[TMP5:%.*]] = zext i32 [[TMP4]] to i64
|
|
; CHECK-NEXT: [[UMIN1:%.*]] = call i64 @llvm.umin.i64(i64 [[UMIN]], i64 [[TMP5]])
|
|
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP8]], [[UMIN1]]
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[TMP3]], [[UMIN1]]
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END5:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: br i1 [[TMP6]], label %[[IF_THEN:.*]], label %[[IF_END4:.*]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @llvm.trap()
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: br i1 [[CMP2]], label %[[IF_THEN2:.*]], label %[[IF_END5]]
|
|
; CHECK: [[IF_THEN2]]:
|
|
; CHECK-NEXT: call void @llvm.trap()
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END5]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[TMP0]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP1]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end5 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, %onebound
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @llvm.trap()
|
|
unreachable
|
|
|
|
if.end4:
|
|
%cmp2 = icmp samesign ugt i32 %i.015, %otherbound
|
|
br i1 %cmp2, label %if.then2, label %if.end5
|
|
|
|
if.then2: ; preds = %if.end4
|
|
call void @llvm.trap()
|
|
unreachable
|
|
|
|
if.end5: ; preds = %if.end4
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_atomic(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_atomic(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @llvm.trap()
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP4:%.*]] = xor i8 [[TMP3]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store atomic i8 [[TMP4]], ptr [[ARRAYIDX7]] unordered, align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @llvm.trap()
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store atomic i8 %1, ptr %arrayidx7 unordered, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_volatile(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_volatile(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @llvm.trap()
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP4:%.*]] = xor i8 [[TMP3]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store volatile i8 [[TMP4]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @llvm.trap()
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store volatile i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_call(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_call(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @llvm.trap()
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP4:%.*]] = xor i8 [[TMP3]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: call void @x(ptr null)
|
|
; CHECK-NEXT: store volatile i8 [[TMP4]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @llvm.trap()
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
call void @x(ptr null)
|
|
store volatile i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @optimize_ubsan_trap(i32 %block_size) {
|
|
; CHECK-LABEL: define void @optimize_ubsan_trap(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[BLOCK_SIZE]], -1
|
|
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP1]], i32 3)
|
|
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 3, [[UMIN]]
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: br i1 [[TMP2]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @llvm.ubsantrap(i8 1)
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP4:%.*]] = xor i8 [[TMP3]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP4]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @llvm.ubsantrap(i8 1)
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_arbitrary_call(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_arbitrary_call(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @noreturn_with_argmem(ptr [[FOO_ARR]])
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP4:%.*]] = xor i8 [[TMP3]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP4]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @noreturn_with_argmem(ptr %foo_arr)
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_two_exits(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_two_exits(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[P:%.*]] = call i1 @pred()
|
|
; CHECK-NEXT: br i1 [[P]], label %[[FOR_BODY_CONT:.*]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
; CHECK: [[FOR_BODY_CONT]]:
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @noreturn(ptr [[FOO_ARR]])
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[TMP0]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP1]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body:
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%p = call i1 @pred()
|
|
br i1 %p, label %for.body.cont, label %for.cond.cleanup.loopexit
|
|
|
|
for.body.cont: ; preds = %for.body.preheader, %if.end4
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @noreturn(ptr %foo_arr)
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_two_exits2(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_two_exits2(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[FOR_BODY_CONT:.*]]
|
|
; CHECK: [[FOR_BODY_CONT]]:
|
|
; CHECK-NEXT: [[P:%.*]] = call i1 @pred()
|
|
; CHECK-NEXT: br i1 [[P]], label %[[IF_END4]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: call void @noreturn(ptr [[FOO_ARR]])
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[TMP0]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP1]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body:
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %for.body.cont
|
|
|
|
for.body.cont: ; preds = %for.body.preheader, %if.end4
|
|
%p = call i1 @pred()
|
|
br i1 %p, label %if.end4, label %for.cond.cleanup.loopexit
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @noreturn(ptr %foo_arr)
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_dependent_ubsan_trap(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_dependent_ubsan_trap(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: [[I_015_LCSSA:%.*]] = phi i32 [ [[I_015]], %[[FOR_BODY]] ]
|
|
; CHECK-NEXT: call void @noreturn_with_i32(i32 [[I_015_LCSSA]])
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[TMP0]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP1]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
call void @noreturn_with_i32(i32 %i.015)
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
define void @no_optimize_dependent_load_trap(i32 %block_size) {
|
|
; CHECK-LABEL: define void @no_optimize_dependent_load_trap(
|
|
; CHECK-SAME: i32 [[BLOCK_SIZE:%.*]]) {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: [[FOO_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: [[BAR_ARR:%.*]] = alloca [2 x i8], align 16
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[FOO_ARR]])
|
|
; CHECK-NEXT: [[CMP14_NOT:%.*]] = icmp eq i32 [[BLOCK_SIZE]], 0
|
|
; CHECK-NEXT: br i1 [[CMP14_NOT]], label %[[FOR_COND_CLEANUP:.*]], label %[[FOR_BODY_PREHEADER:.*]]
|
|
; CHECK: [[FOR_BODY_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
|
|
; CHECK: [[FOR_COND_CLEANUP_LOOPEXIT:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND_CLEANUP]]
|
|
; CHECK: [[FOR_COND_CLEANUP]]:
|
|
; CHECK-NEXT: call void @x(ptr nonnull [[BAR_ARR]])
|
|
; CHECK-NEXT: ret void
|
|
; CHECK: [[FOR_BODY]]:
|
|
; CHECK-NEXT: [[I_015:%.*]] = phi i32 [ [[INC:%.*]], %[[IF_END4:.*]] ], [ 0, %[[FOR_BODY_PREHEADER]] ]
|
|
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ugt i32 [[I_015]], 2
|
|
; CHECK-NEXT: br i1 [[CMP1]], label %[[IF_THEN:.*]], label %[[IF_END4]]
|
|
; CHECK: [[IF_THEN]]:
|
|
; CHECK-NEXT: [[I_015_LCSSA:%.*]] = load i8, ptr [[FOO_ARR]], align 1
|
|
; CHECK-NEXT: call void @noreturn_with_i8(i8 [[I_015_LCSSA]])
|
|
; CHECK-NEXT: unreachable
|
|
; CHECK: [[IF_END4]]:
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [1024 x i8], ptr [[FOO_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
|
|
; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[TMP0]], 54
|
|
; CHECK-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds nuw [1025 x i8], ptr [[BAR_ARR]], i64 0, i32 [[I_015]]
|
|
; CHECK-NEXT: store i8 [[TMP1]], ptr [[ARRAYIDX7]], align 1
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_015]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[INC]], [[BLOCK_SIZE]]
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_BODY]], label %[[FOR_COND_CLEANUP_LOOPEXIT]]
|
|
;
|
|
entry:
|
|
%foo_arr = alloca [2 x i8], align 16
|
|
%bar_arr = alloca [2 x i8], align 16
|
|
call void @x(ptr nonnull %foo_arr)
|
|
%cmp14.not = icmp eq i32 %block_size, 0
|
|
br i1 %cmp14.not, label %for.cond.cleanup, label %for.body.preheader
|
|
|
|
for.body.preheader: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.cond.cleanup.loopexit: ; preds = %if.end4
|
|
br label %for.cond.cleanup
|
|
|
|
for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry
|
|
call void @x(ptr nonnull %bar_arr)
|
|
ret void
|
|
|
|
for.body: ; preds = %for.body.preheader, %if.end4
|
|
%i.015 = phi i32 [ %inc, %if.end4 ], [ 0, %for.body.preheader ]
|
|
%cmp1 = icmp samesign ugt i32 %i.015, 2
|
|
br i1 %cmp1, label %if.then, label %if.end4
|
|
|
|
if.then: ; preds = %for.body
|
|
%r = load i8, ptr %foo_arr, align 1
|
|
call void @noreturn_with_i8(i8 %r)
|
|
unreachable
|
|
|
|
if.end4: ; preds = %for.body
|
|
%arrayidx = getelementptr inbounds nuw [1024 x i8], ptr %foo_arr, i64 0, i32 %i.015
|
|
%0 = load i8, ptr %arrayidx, align 1
|
|
%1 = xor i8 %0, 54
|
|
%arrayidx7 = getelementptr inbounds nuw [1025 x i8], ptr %bar_arr, i64 0, i32 %i.015
|
|
store i8 %1, ptr %arrayidx7, align 1
|
|
%inc = add nuw nsw i32 %i.015, 1
|
|
%cmp = icmp ult i32 %inc, %block_size
|
|
br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit
|
|
}
|
|
|
|
|
|
declare void @x(ptr noundef) local_unnamed_addr
|
|
declare i1 @pred() local_unnamed_addr
|
|
|
|
declare void @llvm.trap() #0
|
|
declare void @noreturn(ptr) #0
|
|
declare void @noreturn_with_i32(i32) #0
|
|
declare void @noreturn_with_i8(i8) #0
|
|
declare void @noreturn_with_argmem(ptr) #1
|
|
|
|
attributes #0 = { cold noreturn nounwind memory(inaccessiblemem: write) }
|
|
attributes #1 = { cold noreturn nounwind memory(argmem: read) }
|