From 772658a9d0243e7ae215c80c48fef00d2cbfe388 Mon Sep 17 00:00:00 2001 From: luxufan Date: Fri, 3 Mar 2023 15:21:28 +0800 Subject: [PATCH] [InstCombine][NFC] Precommit test case of PR61137 --- llvm/test/Transforms/InstCombine/phi.ll | 150 ++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) diff --git a/llvm/test/Transforms/InstCombine/phi.ll b/llvm/test/Transforms/InstCombine/phi.ll index bd0e649..75eece9 100644 --- a/llvm/test/Transforms/InstCombine/phi.ll +++ b/llvm/test/Transforms/InstCombine/phi.ll @@ -1500,3 +1500,153 @@ latch: exit: ret void } + +define i32 @add_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) { +; CHECK-LABEL: @add_two_phi_node_can_fold( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: br label [[IF_END]] +; CHECK: if.end: +; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 0, [[ENTRY]] ] +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[Y]], [[X]] +; CHECK-NEXT: ret i32 [[ADD]] +; +entry: + br i1 %c, label %if.then, label %if.end + +if.then: + br label %if.end + +if.end: + %x = phi i32 [ 0, %if.then ], [ %j, %entry ] + %y = phi i32 [ %i, %if.then ], [ 0, %entry ] + %add = add i32 %y, %x + ret i32 %add +} + +define i32 @add_two_phi_node_cannt_fold(i1 %c, i32 %i, i32 %j) { +; CHECK-LABEL: @add_two_phi_node_cannt_fold( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: br label [[IF_END]] +; CHECK: if.end: +; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 1, [[ENTRY]] ] +; CHECK-NEXT: [[ADD:%.*]] = add i32 [[Y]], [[X]] +; CHECK-NEXT: ret i32 [[ADD]] +; +entry: + br i1 %c, label %if.then, label %if.end + +if.then: + br label %if.end + +if.end: + %x = phi i32 [ 0, %if.then ], [ %j, %entry ] + %y = phi i32 [ %i, %if.then ], [ 1, %entry ] + %add = add i32 %y, %x + ret i32 %add +} + +define i32 @or_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) { +; CHECK-LABEL: @or_two_phi_node_can_fold( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: br label [[IF_END]] +; CHECK: if.end: +; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 0, [[ENTRY]] ] +; CHECK-NEXT: [[ADD:%.*]] = or i32 [[Y]], [[X]] +; CHECK-NEXT: ret i32 [[ADD]] +; +entry: + br i1 %c, label %if.then, label %if.end + +if.then: + br label %if.end + +if.end: + %x = phi i32 [ 0, %if.then ], [ %j, %entry ] + %y = phi i32 [ %i, %if.then ], [ 0, %entry ] + %add = or i32 %y, %x + ret i32 %add +} + +define i32 @and_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) { +; CHECK-LABEL: @and_two_phi_node_can_fold( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: br label [[IF_END]] +; CHECK: if.end: +; CHECK-NEXT: [[X:%.*]] = phi i32 [ -1, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ -1, [[ENTRY]] ] +; CHECK-NEXT: [[ADD:%.*]] = and i32 [[Y]], [[X]] +; CHECK-NEXT: ret i32 [[ADD]] +; +entry: + br i1 %c, label %if.then, label %if.end + +if.then: + br label %if.end + +if.end: + %x = phi i32 [ -1, %if.then ], [ %j, %entry ] + %y = phi i32 [ %i, %if.then ], [ -1, %entry ] + %add = and i32 %y, %x + ret i32 %add +} + +define i32 @mul_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) { +; CHECK-LABEL: @mul_two_phi_node_can_fold( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: br label [[IF_END]] +; CHECK: if.end: +; CHECK-NEXT: [[X:%.*]] = phi i32 [ 1, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 1, [[ENTRY]] ] +; CHECK-NEXT: [[ADD:%.*]] = mul i32 [[Y]], [[X]] +; CHECK-NEXT: ret i32 [[ADD]] +; +entry: + br i1 %c, label %if.then, label %if.end + +if.then: + br label %if.end + +if.end: + %x = phi i32 [ 1, %if.then ], [ %j, %entry ] + %y = phi i32 [ %i, %if.then ], [ 1, %entry ] + %add = mul i32 %y, %x + ret i32 %add +} + +define i32 @xor_two_phi_node_can_fold(i1 %c, i32 %i, i32 %j) { +; CHECK-LABEL: @xor_two_phi_node_can_fold( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: br label [[IF_END]] +; CHECK: if.end: +; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[IF_THEN]] ], [ [[J:%.*]], [[ENTRY:%.*]] ] +; CHECK-NEXT: [[Y:%.*]] = phi i32 [ [[I:%.*]], [[IF_THEN]] ], [ 0, [[ENTRY]] ] +; CHECK-NEXT: [[ADD:%.*]] = xor i32 [[Y]], [[X]] +; CHECK-NEXT: ret i32 [[ADD]] +; +entry: + br i1 %c, label %if.then, label %if.end + +if.then: + br label %if.end + +if.end: + %x = phi i32 [ 0, %if.then ], [ %j, %entry ] + %y = phi i32 [ %i, %if.then ], [ 0, %entry ] + %add = xor i32 %y, %x + ret i32 %add +} -- 2.7.4