; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; RUN: opt < %s -passes=reassociate -S | FileCheck %s ; We cannot preserve nuw flags for mul define i4 @nuw_preserve_negative(i4 %a, i4 %b, i4 %c) { ; CHECK-LABEL: define i4 @nuw_preserve_negative( ; CHECK-SAME: i4 [[A:%.*]], i4 [[B:%.*]], i4 [[C:%.*]]) { ; CHECK-NEXT: [[V0:%.*]] = mul i4 [[B]], [[A]] ; CHECK-NEXT: [[V1:%.*]] = mul i4 [[V0]], [[C]] ; CHECK-NEXT: ret i4 [[V1]] ; %v0 = mul nuw i4 %a, %c %v1 = mul nuw i4 %v0, %b ret i4 %v1 } ; TODO: we can add nuw flags if we know all operands are non-zero. define i4 @nuw_preserve_non_zero(i4 %a, i4 %b, i4 %c) { ; CHECK-LABEL: define i4 @nuw_preserve_non_zero( ; CHECK-SAME: i4 [[A:%.*]], i4 [[B:%.*]], i4 [[C:%.*]]) { ; CHECK-NEXT: [[A0:%.*]] = add nuw i4 [[A]], 1 ; CHECK-NEXT: [[B0:%.*]] = add nuw i4 [[B]], 1 ; CHECK-NEXT: [[C0:%.*]] = add nuw i4 [[C]], 1 ; CHECK-NEXT: [[V0:%.*]] = mul i4 [[B0]], [[A0]] ; CHECK-NEXT: [[V1:%.*]] = mul i4 [[V0]], [[C0]] ; CHECK-NEXT: ret i4 [[V1]] ; %a0 = add nuw i4 %a, 1 %b0 = add nuw i4 %b, 1 %c0 = add nuw i4 %c, 1 %v0 = mul nuw i4 %a0, %c0 %v1 = mul nuw i4 %v0, %b0 ret i4 %v1 }