97 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt -S -passes=correlated-propagation < %s | FileCheck %s3 4declare void @use(i1)5 6define void @test_icmp_from_implied_cond(i32 %a, i32 %b) {7; CHECK-LABEL: define void @test_icmp_from_implied_cond(8; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {9; CHECK-NEXT: [[A_CMP:%.*]] = icmp ugt i32 [[A]], 3210; CHECK-NEXT: br i1 [[A_CMP]], label [[END:%.*]], label [[L1:%.*]]11; CHECK: l1:12; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[B]], [[A]]13; CHECK-NEXT: br i1 [[COND]], label [[L2:%.*]], label [[END]]14; CHECK: l2:15; CHECK-NEXT: call void @use(i1 true)16; CHECK-NEXT: [[B_CMP2:%.*]] = icmp samesign ult i32 [[B]], 3117; CHECK-NEXT: call void @use(i1 [[B_CMP2]])18; CHECK-NEXT: ret void19; CHECK: end:20; CHECK-NEXT: ret void21;22 %a.cmp = icmp ugt i32 %a, 3223 br i1 %a.cmp, label %end, label %l124 25l1:26 %cond = icmp ult i32 %b, %a27 br i1 %cond, label %l2, label %end28 29l2:30 %b.cmp1 = icmp ult i32 %b, 3231 call void @use(i1 %b.cmp1)32 %b.cmp2 = icmp ult i32 %b, 3133 call void @use(i1 %b.cmp2)34 ret void35 36end:37 ret void38}39 40define i64 @test_sext_from_implied_cond(i32 %a, i32 %b) {41; CHECK-LABEL: define range(i64 0, 2147483647) i64 @test_sext_from_implied_cond(42; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {43; CHECK-NEXT: [[A_CMP:%.*]] = icmp slt i32 [[A]], 044; CHECK-NEXT: br i1 [[A_CMP]], label [[END:%.*]], label [[L1:%.*]]45; CHECK: l1:46; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[B]], [[A]]47; CHECK-NEXT: br i1 [[COND]], label [[L2:%.*]], label [[END]]48; CHECK: l2:49; CHECK-NEXT: [[SEXT:%.*]] = zext nneg i32 [[B]] to i6450; CHECK-NEXT: ret i64 [[SEXT]]51; CHECK: end:52; CHECK-NEXT: ret i64 053;54 %a.cmp = icmp slt i32 %a, 055 br i1 %a.cmp, label %end, label %l156 57l1:58 %cond = icmp ult i32 %b, %a59 br i1 %cond, label %l2, label %end60 61l2:62 %sext = sext i32 %b to i6463 ret i64 %sext64 65end:66 ret i64 067}68 69define void @test_icmp_from_implied_range(i16 %x, i32 %b) {70; CHECK-LABEL: define void @test_icmp_from_implied_range(71; CHECK-SAME: i16 [[X:%.*]], i32 [[B:%.*]]) {72; CHECK-NEXT: [[A:%.*]] = zext i16 [[X]] to i3273; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[B]], [[A]]74; CHECK-NEXT: br i1 [[COND]], label [[L1:%.*]], label [[END:%.*]]75; CHECK: l1:76; CHECK-NEXT: call void @use(i1 true)77; CHECK-NEXT: [[B_CMP2:%.*]] = icmp samesign ult i32 [[B]], 6553478; CHECK-NEXT: call void @use(i1 [[B_CMP2]])79; CHECK-NEXT: ret void80; CHECK: end:81; CHECK-NEXT: ret void82;83 %a = zext i16 %x to i3284 %cond = icmp ult i32 %b, %a85 br i1 %cond, label %l1, label %end86 87l1:88 %b.cmp1 = icmp ult i32 %b, 6553589 call void @use(i1 %b.cmp1)90 %b.cmp2 = icmp ult i32 %b, 6553491 call void @use(i1 %b.cmp2)92 ret void93 94end:95 ret void96}97