1c83180c1SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2c83180c1SFlorian Hahn; RUN: opt -p constraint-elimination -S %s | FileCheck %s 3c83180c1SFlorian Hahn 4c83180c1SFlorian Hahn; Tests for https://github.com/llvm/llvm-project/issues/78621. 5c83180c1SFlorian Hahn 6c83180c1SFlorian Hahndefine i1 @umin_not_used(i32 %arg) { 7c83180c1SFlorian Hahn; CHECK-LABEL: define i1 @umin_not_used( 8c83180c1SFlorian Hahn; CHECK-SAME: i32 [[ARG:%.*]]) { 9*3d91d961SFlorian Hahn; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i32 [[ARG]], 0 10c83180c1SFlorian Hahn; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[ARG]], 3 11c83180c1SFlorian Hahn; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umin.i32(i32 [[SHL]], i32 80) 12c83180c1SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = shl nuw nsw i32 [[ARG]], 3 13*3d91d961SFlorian Hahn; CHECK-NEXT: ret i1 [[ICMP]] 14c83180c1SFlorian Hahn; 15c83180c1SFlorian Hahn %icmp = icmp slt i32 %arg, 0 16c83180c1SFlorian Hahn %shl = shl nuw nsw i32 %arg, 3 17c83180c1SFlorian Hahn call i32 @llvm.umin.i32(i32 %shl, i32 80) 18c83180c1SFlorian Hahn %cmp2 = shl nuw nsw i32 %arg, 3 19c83180c1SFlorian Hahn ret i1 %icmp 20c83180c1SFlorian Hahn} 21c83180c1SFlorian Hahn 22c83180c1SFlorian Hahndefine i1 @umin_poison_is_UB_via_call(i32 %arg) { 23c83180c1SFlorian Hahn; CHECK-LABEL: define i1 @umin_poison_is_UB_via_call( 24c83180c1SFlorian Hahn; CHECK-SAME: i32 [[ARG:%.*]]) { 25c83180c1SFlorian Hahn; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[ARG]], 3 26c83180c1SFlorian Hahn; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SHL]], i32 80) 27c83180c1SFlorian Hahn; CHECK-NEXT: call void @noundef(i32 noundef [[MIN]]) 28c83180c1SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = shl nuw nsw i32 [[ARG]], 3 29c83180c1SFlorian Hahn; CHECK-NEXT: ret i1 false 30c83180c1SFlorian Hahn; 31c83180c1SFlorian Hahn %icmp = icmp slt i32 %arg, 0 32c83180c1SFlorian Hahn %shl = shl nuw nsw i32 %arg, 3 33c83180c1SFlorian Hahn %min = call i32 @llvm.umin.i32(i32 %shl, i32 80) 34c83180c1SFlorian Hahn call void @noundef(i32 noundef %min) 35c83180c1SFlorian Hahn %cmp2 = shl nuw nsw i32 %arg, 3 36c83180c1SFlorian Hahn ret i1 %icmp 37c83180c1SFlorian Hahn} 38c83180c1SFlorian Hahn 39c83180c1SFlorian Hahndefine i1 @umin_poison_call_before_UB(i32 %arg) { 40c83180c1SFlorian Hahn; CHECK-LABEL: define i1 @umin_poison_call_before_UB( 41c83180c1SFlorian Hahn; CHECK-SAME: i32 [[ARG:%.*]]) { 42*3d91d961SFlorian Hahn; CHECK-NEXT: [[ICMP:%.*]] = icmp slt i32 [[ARG]], 0 43c83180c1SFlorian Hahn; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[ARG]], 3 44c83180c1SFlorian Hahn; CHECK-NEXT: [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SHL]], i32 80) 45c83180c1SFlorian Hahn; CHECK-NEXT: call void @fn() 46c83180c1SFlorian Hahn; CHECK-NEXT: call void @noundef(i32 noundef [[MIN]]) 47c83180c1SFlorian Hahn; CHECK-NEXT: [[CMP2:%.*]] = shl nuw nsw i32 [[ARG]], 3 48*3d91d961SFlorian Hahn; CHECK-NEXT: ret i1 [[ICMP]] 49c83180c1SFlorian Hahn; 50c83180c1SFlorian Hahn %icmp = icmp slt i32 %arg, 0 51c83180c1SFlorian Hahn %shl = shl nuw nsw i32 %arg, 3 52c83180c1SFlorian Hahn %min = call i32 @llvm.umin.i32(i32 %shl, i32 80) 53c83180c1SFlorian Hahn call void @fn() 54c83180c1SFlorian Hahn call void @noundef(i32 noundef %min) 55c83180c1SFlorian Hahn %cmp2 = shl nuw nsw i32 %arg, 3 56c83180c1SFlorian Hahn ret i1 %icmp 57c83180c1SFlorian Hahn} 58c83180c1SFlorian Hahn 59c83180c1SFlorian Hahndeclare i32 @llvm.umin.i32(i32, i32) #0 60c83180c1SFlorian Hahn 61c83180c1SFlorian Hahndeclare void @noundef(i32 noundef) 62c83180c1SFlorian Hahndeclare void @fn() 63