From 9dc6eddb1d104b18af1bf06c6f8ee202a12b5014 Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Thu, 24 Aug 2017 02:43:17 +0000 Subject: [PATCH] NewGVN: We weren't properly simplifying selects with equal arguments due to a thinko. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311626 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/NewGVN.cpp | 2 +- test/Transforms/NewGVN/basic.ll | 34 ++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/Transforms/Scalar/NewGVN.cpp b/lib/Transforms/Scalar/NewGVN.cpp index e545163c96c..475ee67f531 100644 --- a/lib/Transforms/Scalar/NewGVN.cpp +++ b/lib/Transforms/Scalar/NewGVN.cpp @@ -1025,7 +1025,7 @@ const Expression *NewGVN::createExpression(Instruction *I) const { return SimplifiedE; } else if (isa(I)) { if (isa(E->getOperand(0)) || - E->getOperand(0) == E->getOperand(1)) { + E->getOperand(1) == E->getOperand(2)) { assert(E->getOperand(1)->getType() == I->getOperand(1)->getType() && E->getOperand(2)->getType() == I->getOperand(2)->getType()); Value *V = SimplifySelectInst(E->getOperand(0), E->getOperand(1), diff --git a/test/Transforms/NewGVN/basic.ll b/test/Transforms/NewGVN/basic.ll index 587e9abe033..90193bdbcda 100644 --- a/test/Transforms/NewGVN/basic.ll +++ b/test/Transforms/NewGVN/basic.ll @@ -1,17 +1,35 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -newgvn -S | FileCheck %s define i32 @main() { +; CHECK-LABEL: @main( +; CHECK-NEXT: block1: +; CHECK-NEXT: br label [[BLOCK2:%.*]] +; CHECK: block2: +; CHECK-NEXT: ret i32 0 +; block1: - %z1 = bitcast i32 0 to i32 - br label %block2 + %z1 = bitcast i32 0 to i32 + br label %block2 block2: %z2 = bitcast i32 0 to i32 ret i32 %z2 } -; CHECK: define i32 @main() { -; CHECK-NEXT: block1: -; CHECK-NEXT: br label %block2 -; CHECK: block2: -; CHECK-NEXT: ret i32 0 -; CHECK-NEXT: } +; Test that we simplify selects properly +define i64 @simplifyselect(i64 %x, i64 %y, i1 %c1, i1 %c2, i1 %zzz) { +; CHECK-LABEL: @simplifyselect( +; CHECK-NEXT: [[SHARED:%.*]] = add i64 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[R1:%.*]] = select i1 [[C1:%.*]], i64 [[SHARED]], i64 [[X]] +; CHECK-NEXT: [[R2:%.*]] = select i1 [[C2:%.*]], i64 [[SHARED]], i64 [[Y]] +; CHECK-NEXT: [[R:%.*]] = add i64 [[R1]], [[R2]] +; CHECK-NEXT: ret i64 [[R]] +; + %shared = add i64 %x, %y + %r1 = select i1 %c1, i64 %shared, i64 %x + %r2 = select i1 %c2, i64 %shared, i64 %y + %tmp = select i1 %c2, i64 %x, i64 0 + %r2_eq2 = select i1 %zzz, i64 %r2, i64 %r2 + %r = add i64 %r1, %r2_eq2 + ret i64 %r +} -- 2.50.1