From: Nikita Popov Date: Fri, 1 Jan 2021 15:12:44 +0000 (+0100) Subject: [CVP] Add tests for union of conditions (NFC) X-Git-Tag: llvmorg-13-init~2276 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=13b1c9abaf46a7163bfc8fc0a765fbee051ccc80;p=platform%2Fupstream%2Fllvm.git [CVP] Add tests for union of conditions (NFC) We currently handle intersected conditions, but not unioned conditions. --- diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll index bec6f94..f04a20b 100644 --- a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll +++ b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll @@ -1255,6 +1255,139 @@ exit: ret void } +define void @or_union(i32 %a, i1* %p) { +; CHECK-LABEL: @or_union( +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 10 +; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[A]], 12 +; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[OR]], label [[GUARD:%.*]], label [[EXIT:%.*]] +; CHECK: guard: +; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[A]], 9 +; CHECK-NEXT: store i1 [[C1]], i1* [[P:%.*]], align 1 +; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[A]], 10 +; CHECK-NEXT: store i1 [[C2]], i1* [[P]], align 1 +; CHECK-NEXT: [[C3:%.*]] = icmp eq i32 [[A]], 11 +; CHECK-NEXT: store i1 [[C3]], i1* [[P]], align 1 +; CHECK-NEXT: [[C4:%.*]] = icmp eq i32 [[A]], 12 +; CHECK-NEXT: store i1 [[C4]], i1* [[P]], align 1 +; CHECK-NEXT: [[C5:%.*]] = icmp eq i32 [[A]], 13 +; CHECK-NEXT: store i1 [[C5]], i1* [[P]], align 1 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; + %cmp1 = icmp eq i32 %a, 10 + %cmp2 = icmp eq i32 %a, 12 + %or = or i1 %cmp1, %cmp2 + br i1 %or, label %guard, label %exit + +guard: + %c1 = icmp eq i32 %a, 9 + store i1 %c1, i1* %p + %c2 = icmp eq i32 %a, 10 + store i1 %c2, i1* %p + %c3 = icmp eq i32 %a, 11 + store i1 %c3, i1* %p + %c4 = icmp eq i32 %a, 12 + store i1 %c4, i1* %p + %c5 = icmp eq i32 %a, 13 + store i1 %c5, i1* %p + br label %exit + +exit: + ret void +} + +define i1 @or_union_unknown_cond(i32 %a, i1 %c) { +; CHECK-LABEL: @or_union_unknown_cond( +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 10 +; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP1]], [[C:%.*]] +; CHECK-NEXT: br i1 [[OR]], label [[GUARD:%.*]], label [[EXIT:%.*]] +; CHECK: guard: +; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[A]], 10 +; CHECK-NEXT: ret i1 [[CMP2]] +; CHECK: exit: +; CHECK-NEXT: ret i1 false +; + %cmp1 = icmp eq i32 %a, 10 + %or = or i1 %cmp1, %c + br i1 %or, label %guard, label %exit + +guard: + %cmp2 = icmp eq i32 %a, 10 + ret i1 %cmp2 + +exit: + ret i1 false +} + +define void @and_union(i32 %a, i1* %p) { +; CHECK-LABEL: @and_union( +; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[A:%.*]], 10 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[A]], 12 +; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: br i1 [[AND]], label [[EXIT:%.*]], label [[GUARD:%.*]] +; CHECK: guard: +; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[A]], 9 +; CHECK-NEXT: store i1 [[C1]], i1* [[P:%.*]], align 1 +; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[A]], 10 +; CHECK-NEXT: store i1 [[C2]], i1* [[P]], align 1 +; CHECK-NEXT: [[C3:%.*]] = icmp eq i32 [[A]], 11 +; CHECK-NEXT: store i1 [[C3]], i1* [[P]], align 1 +; CHECK-NEXT: [[C4:%.*]] = icmp eq i32 [[A]], 12 +; CHECK-NEXT: store i1 [[C4]], i1* [[P]], align 1 +; CHECK-NEXT: [[C5:%.*]] = icmp eq i32 [[A]], 13 +; CHECK-NEXT: store i1 [[C5]], i1* [[P]], align 1 +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; + %cmp1 = icmp ne i32 %a, 10 + %cmp2 = icmp ne i32 %a, 12 + %and = and i1 %cmp1, %cmp2 + br i1 %and, label %exit, label %guard + +guard: + %c1 = icmp eq i32 %a, 9 + store i1 %c1, i1* %p + %c2 = icmp eq i32 %a, 10 + store i1 %c2, i1* %p + %c3 = icmp eq i32 %a, 11 + store i1 %c3, i1* %p + %c4 = icmp eq i32 %a, 12 + store i1 %c4, i1* %p + %c5 = icmp eq i32 %a, 13 + store i1 %c5, i1* %p + br label %exit + +exit: + ret void +} + +define i1 @and_union_unknown_cond(i32 %a, i1 %c) { +; CHECK-LABEL: @and_union_unknown_cond( +; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[A:%.*]], 10 +; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP1]], [[C:%.*]] +; CHECK-NEXT: br i1 [[AND]], label [[EXIT:%.*]], label [[GUARD:%.*]] +; CHECK: guard: +; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[A]], 10 +; CHECK-NEXT: ret i1 [[CMP2]] +; CHECK: exit: +; CHECK-NEXT: ret i1 false +; + %cmp1 = icmp ne i32 %a, 10 + %and = and i1 %cmp1, %c + br i1 %and, label %exit, label %guard + +guard: + %cmp2 = icmp eq i32 %a, 10 + ret i1 %cmp2 + +exit: + ret i1 false +} + + declare i32 @llvm.uadd.sat.i32(i32, i32) declare i32 @llvm.usub.sat.i32(i32, i32) declare i32 @llvm.sadd.sat.i32(i32, i32)