[llvm] c87e917 - [InstCombine] add tests for binop with phi operands; NFC

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 12 11:47:36 PST 2022


Author: Sanjay Patel
Date: 2022-01-12T14:46:30-05:00
New Revision: c87e917fb23d42ffb2a18b3bb5eccf8d2bc26eb6

URL: https://github.com/llvm/llvm-project/commit/c87e917fb23d42ffb2a18b3bb5eccf8d2bc26eb6
DIFF: https://github.com/llvm/llvm-project/commit/c87e917fb23d42ffb2a18b3bb5eccf8d2bc26eb6.diff

LOG: [InstCombine] add tests for binop with phi operands; NFC

Added: 
    llvm/test/Transforms/InstCombine/binop-phi-operands.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/binop-phi-operands.ll b/llvm/test/Transforms/InstCombine/binop-phi-operands.ll
new file mode 100644
index 0000000000000..fe9bfbdcc9682
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/binop-phi-operands.ll
@@ -0,0 +1,711 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+declare void @use(i32)
+
+define i32 @add_const_incoming0_speculative(i1 %b, i32 %x, i32 %y) {
+; CHECK-LABEL: @add_const_incoming0_speculative(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i32 [ 42, [[IF]] ], [ [[X:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i32 [ 17, [[IF]] ], [ [[Y:%.*]], [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = add i32 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i32 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i32 [ 42, %if ], [ %x, %entry ]
+  %p1 = phi i32 [ 17, %if ], [ %y, %entry ]
+  %r = add i32 %p0, %p1
+  ret i32 %r
+}
+
+define i32 @add_const_incoming0_nonspeculative(i1 %b, i32 %x, i32 %y) {
+; CHECK-LABEL: @add_const_incoming0_nonspeculative(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i32 [ 42, [[ENTRY:%.*]] ], [ [[X:%.*]], [[IF]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i32 [ 17, [[ENTRY]] ], [ [[Y:%.*]], [[IF]] ]
+; CHECK-NEXT:    [[R:%.*]] = add i32 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i32 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i32 [ 42, %entry ], [ %x, %if ]
+  %p1 = phi i32 [ 17, %entry ], [ %y, %if ]
+  %r = add i32 %p0, %p1
+  ret i32 %r
+}
+
+define i32 @sub_const_incoming0(i1 %b, i32 %x, i32 %y) {
+; CHECK-LABEL: @sub_const_incoming0(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i32 [ 42, [[IF]] ], [ [[X:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i32 [ 17, [[IF]] ], [ [[Y:%.*]], [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = sub i32 [[P1]], [[P0]]
+; CHECK-NEXT:    ret i32 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i32 [ 42, %if ], [ %x, %entry ]
+  %p1 = phi i32 [ 17, %if ], [ %y, %entry ]
+  %r = sub i32 %p1, %p0
+  ret i32 %r
+}
+
+define i32 @sub_const_incoming1(i1 %b, i32 %x, i32 %y) {
+; CHECK-LABEL: @sub_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i32 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i32 [ [[Y:%.*]], [[IF]] ], [ 17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = sub i32 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i32 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i32 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i32 [ %y, %if ], [ 17, %entry ]
+  %r = sub i32 %p0, %p1
+  ret i32 %r
+}
+
+define i8 @mul_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @mul_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ 17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = mul i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ 17, %entry ]
+  %r = mul i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @and_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @and_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ 17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = and i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ 17, %entry ]
+  %r = and i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @xor_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @xor_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ 17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = xor i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ 17, %entry ]
+  %r = xor i8 %p0, %p1
+  ret i8 %r
+}
+
+define i64 @or_const_incoming1(i1 %b, i64 %x, i64 %y) {
+; CHECK-LABEL: @or_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i64 [ [[X:%.*]], [[IF]] ], [ 3, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i64 [ [[Y:%.*]], [[IF]] ], [ 16, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = or i64 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i64 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i64 [ %x, %if ], [ 3, %entry ]
+  %p1 = phi i64 [ %y, %if ], [ 16, %entry ]
+  %r = or i64 %p0, %p1
+  ret i64 %r
+}
+
+define i64 @or_const_incoming01(i1 %b, i64 %x, i64 %y) {
+; CHECK-LABEL: @or_const_incoming01(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i64 [ 3, [[ENTRY:%.*]] ], [ [[X:%.*]], [[IF]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i64 [ 16, [[ENTRY]] ], [ [[Y:%.*]], [[IF]] ]
+; CHECK-NEXT:    [[R:%.*]] = or i64 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i64 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i64 [ 3, %entry ], [ %x, %if]
+  %p1 = phi i64 [ %y, %if ], [ 16, %entry ]
+  %r = or i64 %p0, %p1
+  ret i64 %r
+}
+
+define i64 @or_const_incoming10(i1 %b, i64 %x, i64 %y) {
+; CHECK-LABEL: @or_const_incoming10(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i64 [ [[Y:%.*]], [[IF]] ], [ 16, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i64 [ [[X:%.*]], [[IF]] ], [ 3, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = or i64 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i64 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i64 [ %y, %if ], [ 16, %entry ]
+  %p1 = phi i64 [ 3, %entry ], [ %x, %if]
+  %r = or i64 %p0, %p1
+  ret i64 %r
+}
+
+define i8 @ashr_const_incoming0_speculative(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @ashr_const_incoming0_speculative(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ 42, [[IF]] ], [ [[X:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ 3, [[IF]] ], [ [[Y:%.*]], [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = ashr i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ 42, %if ], [ %x, %entry ]
+  %p1 = phi i8 [ 3, %if ], [ %y, %entry ]
+  %r = ashr i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @ashr_const_incoming0(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @ashr_const_incoming0(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ 42, [[ENTRY:%.*]] ], [ [[X:%.*]], [[IF]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ 3, [[ENTRY]] ], [ [[Y:%.*]], [[IF]] ]
+; CHECK-NEXT:    [[R:%.*]] = ashr i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ 42, %entry ], [ %x, %if ]
+  %p1 = phi i8 [ 3, %entry ], [ %y, %if ]
+  %r = ashr i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @lshr_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @lshr_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ 3, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = lshr i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ 3, %entry ]
+  %r = lshr i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @shl_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @shl_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ 3, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = shl nuw nsw i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ 3, %entry ]
+  %r = shl nsw nuw i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @sdiv_not_safe_to_speculate(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @sdiv_not_safe_to_speculate(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ 42, [[IF]] ], [ [[X:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ 3, [[IF]] ], [ [[Y:%.*]], [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = sdiv exact i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ 42, %if ], [ %x, %entry ]
+  %p1 = phi i8 [ 3, %if ], [ %y, %entry ]
+  %r = sdiv exact i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @sdiv_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @sdiv_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ -42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ 17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = sdiv i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ -42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ 17, %entry ]
+  %r = sdiv i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @udiv_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @udiv_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ -42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ 17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = udiv i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ -42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ 17, %entry ]
+  %r = udiv i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @srem_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @srem_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ -17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = srem i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ -17, %entry ]
+  %r = srem i8 %p0, %p1
+  ret i8 %r
+}
+
+define i8 @urem_const_incoming1(i1 %b, i8 %x, i8 %y) {
+; CHECK-LABEL: @urem_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i8 [ [[X:%.*]], [[IF]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i8 [ [[Y:%.*]], [[IF]] ], [ -17, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = urem i8 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i8 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i8 [ %x, %if ], [ 42, %entry ]
+  %p1 = phi i8 [ %y, %if ], [ -17, %entry ]
+  %r = urem i8 %p0, %p1
+  ret i8 %r
+}
+
+define float @fmul_const_incoming1(i1 %b, float %x, float %y) {
+; CHECK-LABEL: @fmul_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi float [ [[X:%.*]], [[IF]] ], [ 4.200000e+01, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi float [ [[Y:%.*]], [[IF]] ], [ 1.700000e+01, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = fmul float [[P0]], [[P1]]
+; CHECK-NEXT:    ret float [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi float [ %x, %if ], [ 42.0, %entry ]
+  %p1 = phi float [ %y, %if ], [ 17.0, %entry ]
+  %r = fmul float %p0, %p1
+  ret float %r
+}
+
+define float @fadd_const_incoming1(i1 %b, float %x, float %y) {
+; CHECK-LABEL: @fadd_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi float [ [[X:%.*]], [[IF]] ], [ 4.200000e+01, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi float [ [[Y:%.*]], [[IF]] ], [ 1.700000e+01, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = fadd fast float [[P0]], [[P1]]
+; CHECK-NEXT:    ret float [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi float [ %x, %if ], [ 42.0, %entry ]
+  %p1 = phi float [ %y, %if ], [ 17.0, %entry ]
+  %r = fadd fast float %p0, %p1
+  ret float %r
+}
+
+define float @fsub_const_incoming1(i1 %b, float %x, float %y) {
+; CHECK-LABEL: @fsub_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi float [ [[X:%.*]], [[IF]] ], [ 4.200000e+01, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi float [ [[Y:%.*]], [[IF]] ], [ 1.700000e+01, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = fsub nnan ninf float [[P0]], [[P1]]
+; CHECK-NEXT:    ret float [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi float [ %x, %if ], [ 42.0, %entry ]
+  %p1 = phi float [ %y, %if ], [ 17.0, %entry ]
+  %r = fsub ninf nnan float %p0, %p1
+  ret float %r
+}
+
+define float @frem_const_incoming1(i1 %b, float %x, float %y) {
+; CHECK-LABEL: @frem_const_incoming1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi float [ [[X:%.*]], [[IF]] ], [ 4.200000e+01, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi float [ [[Y:%.*]], [[IF]] ], [ 1.700000e+01, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = frem nsz float [[P0]], [[P1]]
+; CHECK-NEXT:    ret float [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi float [ %x, %if ], [ 42.0, %entry ]
+  %p1 = phi float [ %y, %if ], [ 17.0, %entry ]
+  %r = frem nsz float %p0, %p1
+  ret float %r
+}
+
+define i32 @add_const_incoming0_use1(i1 %b, i32 %x, i32 %y) {
+; CHECK-LABEL: @add_const_incoming0_use1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i32 [ 42, [[IF]] ], [ [[X:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i32 [ 17, [[IF]] ], [ [[Y:%.*]], [[ENTRY]] ]
+; CHECK-NEXT:    call void @use(i32 [[P0]])
+; CHECK-NEXT:    [[R:%.*]] = add i32 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i32 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i32 [ 42, %if ], [ %x, %entry ]
+  %p1 = phi i32 [ 17, %if ], [ %y, %entry ]
+  call void @use(i32 %p0)
+  %r = add i32 %p0, %p1
+  ret i32 %r
+}
+
+define i32 @add_const_incoming0_use2(i1 %b, i32 %x, i32 %y) {
+; CHECK-LABEL: @add_const_incoming0_use2(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i32 [ 42, [[IF]] ], [ [[X:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i32 [ 17, [[IF]] ], [ [[Y:%.*]], [[ENTRY]] ]
+; CHECK-NEXT:    call void @use(i32 [[P1]])
+; CHECK-NEXT:    [[R:%.*]] = add i32 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i32 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i32 [ 42, %if ], [ %x, %entry ]
+  %p1 = phi i32 [ 17, %if ], [ %y, %entry ]
+  call void @use(i32 %p1)
+  %r = add i32 %p0, %p1
+  ret i32 %r
+}
+
+define i64 @or_notconst_incoming(i1 %b, i64 %x, i64 %y) {
+; CHECK-LABEL: @or_notconst_incoming(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[IF:%.*]], label [[THEN:%.*]]
+; CHECK:       if:
+; CHECK-NEXT:    br label [[THEN]]
+; CHECK:       then:
+; CHECK-NEXT:    [[P0:%.*]] = phi i64 [ 42, [[IF]] ], [ [[X:%.*]], [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[P1:%.*]] = phi i64 [ [[Y:%.*]], [[IF]] ], [ 43, [[ENTRY]] ]
+; CHECK-NEXT:    [[R:%.*]] = or i64 [[P0]], [[P1]]
+; CHECK-NEXT:    ret i64 [[R]]
+;
+entry:
+  br i1 %b, label %if, label %then
+
+if:
+  br label %then
+
+then:
+  %p0 = phi i64 [ 42, %if ], [ %x, %entry ]
+  %p1 = phi i64 [ %y, %if ], [ 43, %entry ]
+  %r = or i64 %p0, %p1
+  ret i64 %r
+}
+
+define { i64, i32 } @ParseRetVal(i1 %b, { i64, i32 } ()* %x) {
+; CHECK-LABEL: @ParseRetVal(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[B:%.*]], label [[T:%.*]], label [[F:%.*]]
+; CHECK:       t:
+; CHECK-NEXT:    [[T4:%.*]] = tail call { i64, i32 } [[X:%.*]]()
+; CHECK-NEXT:    [[T5:%.*]] = extractvalue { i64, i32 } [[T4]], 0
+; CHECK-NEXT:    [[T6:%.*]] = extractvalue { i64, i32 } [[T4]], 1
+; CHECK-NEXT:    [[T7:%.*]] = and i64 [[T5]], -4294967296
+; CHECK-NEXT:    [[T8:%.*]] = and i64 [[T5]], 4294901760
+; CHECK-NEXT:    [[T9:%.*]] = and i64 [[T5]], 65280
+; CHECK-NEXT:    [[T10:%.*]] = and i64 [[T5]], 255
+; CHECK-NEXT:    br label [[F]]
+; CHECK:       f:
+; CHECK-NEXT:    [[T12:%.*]] = phi i64 [ [[T10]], [[T]] ], [ 0, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[T13:%.*]] = phi i64 [ [[T9]], [[T]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[T14:%.*]] = phi i64 [ [[T8]], [[T]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[T15:%.*]] = phi i64 [ [[T7]], [[T]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[T16:%.*]] = phi i32 [ [[T6]], [[T]] ], [ 0, [[ENTRY]] ]
+; CHECK-NEXT:    [[T17:%.*]] = or i64 [[T13]], [[T12]]
+; CHECK-NEXT:    [[T18:%.*]] = or i64 [[T17]], [[T14]]
+; CHECK-NEXT:    [[T19:%.*]] = or i64 [[T18]], [[T15]]
+; CHECK-NEXT:    [[T20:%.*]] = insertvalue { i64, i32 } poison, i64 [[T19]], 0
+; CHECK-NEXT:    [[T21:%.*]] = insertvalue { i64, i32 } [[T20]], i32 [[T16]], 1
+; CHECK-NEXT:    ret { i64, i32 } [[T21]]
+;
+entry:
+  br i1 %b, label %t, label %f
+
+t:
+  %t4 = tail call { i64, i32 } %x()
+  %t5 = extractvalue { i64, i32 } %t4, 0
+  %t6 = extractvalue { i64, i32 } %t4, 1
+  %t7 = and i64 %t5, -4294967296
+  %t8 = and i64 %t5, 4294901760
+  %t9 = and i64 %t5, 65280
+  %t10 = and i64 %t5, 255
+  br label %f
+
+f:
+  %t12 = phi i64 [ %t10, %t ], [ 0, %entry ]
+  %t13 = phi i64 [ %t9, %t ], [ 0, %entry ]
+  %t14 = phi i64 [ %t8, %t ], [ 0, %entry ]
+  %t15 = phi i64 [ %t7, %t ], [ 0, %entry ]
+  %t16 = phi i32 [ %t6, %t ], [ 0, %entry ]
+  %t17 = or i64 %t13, %t12
+  %t18 = or i64 %t17, %t14
+  %t19 = or i64 %t18, %t15
+  %t20 = insertvalue { i64, i32 } poison, i64 %t19, 0
+  %t21 = insertvalue { i64, i32 } %t20, i32 %t16, 1
+  ret { i64, i32 } %t21
+}


        


More information about the llvm-commits mailing list