; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -enable-scalar-pre=false -passes=gvn -S < %s | FileCheck %s --check-prefixes=CHECK ; RUN: opt -enable-scalar-pre=true -passes=gvn -S < %s | FileCheck %s --check-prefixes=CHECK-ENABLED ; RUN: opt -passes='gvn' -S < %s | FileCheck %s --check-prefixes=CHECK ; RUN: opt -passes='gvn' -S < %s | FileCheck %s --check-prefixes=CHECK-ENABLED define void @test_scalar_pre_option(ptr %arr, i8 %cond) { ; CHECK-LABEL: define void @test_scalar_pre_option( ; CHECK-SAME: ptr [[ARR:%.*]], i8 [[COND:%.*]]) { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i8 [[COND]], 0 ; CHECK-NEXT: [[TMP7_PRE:%.*]] = load i32, ptr [[ARR]], align 4 ; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label %[[IF_END:.*]], label %[[IF_THEN:.*]] ; CHECK: [[IF_THEN]]: ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP7_PRE]], 2 ; CHECK-NEXT: [[GETELEM:%.*]] = getelementptr inbounds nuw i8, ptr [[ARR]], i64 8 ; CHECK-NEXT: store i32 [[ADD]], ptr [[GETELEM]], align 4 ; CHECK-NEXT: br label %[[IF_END]] ; CHECK: [[IF_END]]: ; CHECK-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP7_PRE]], 2 ; CHECK-NEXT: [[GETELEM1:%.*]] = getelementptr inbounds nuw i8, ptr [[ARR]], i64 12 ; CHECK-NEXT: store i32 [[ADD8]], ptr [[GETELEM1]], align 4 ; CHECK-NEXT: ret void ; ; CHECK-ENABLED-LABEL: define void @test_scalar_pre_option( ; CHECK-ENABLED-SAME: ptr [[ARR:%.*]], i8 [[COND:%.*]]) { ; CHECK-ENABLED-NEXT: [[ENTRY:.*:]] ; CHECK-ENABLED-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i8 [[COND]], 0 ; CHECK-ENABLED-NEXT: [[TMP7_PRE:%.*]] = load i32, ptr [[ARR]], align 4 ; CHECK-ENABLED-NEXT: br i1 [[TOBOOL_NOT]], label %[[ENTRY_IF_END_CRIT_EDGE:.*]], label %[[IF_THEN:.*]] ; CHECK-ENABLED: [[ENTRY_IF_END_CRIT_EDGE]]: ; CHECK-ENABLED-NEXT: [[DOTPRE:%.*]] = add nsw i32 [[TMP7_PRE]], 2 ; CHECK-ENABLED-NEXT: br label %[[IF_END:.*]] ; CHECK-ENABLED: [[IF_THEN]]: ; CHECK-ENABLED-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP7_PRE]], 2 ; CHECK-ENABLED-NEXT: [[GETELEM:%.*]] = getelementptr inbounds nuw i8, ptr [[ARR]], i64 8 ; CHECK-ENABLED-NEXT: store i32 [[ADD]], ptr [[GETELEM]], align 4 ; CHECK-ENABLED-NEXT: br label %[[IF_END]] ; CHECK-ENABLED: [[IF_END]]: ; CHECK-ENABLED-NEXT: [[ADD8_PRE_PHI:%.*]] = phi i32 [ [[DOTPRE]], %[[ENTRY_IF_END_CRIT_EDGE]] ], [ [[ADD]], %[[IF_THEN]] ] ; CHECK-ENABLED-NEXT: [[GETELEM1:%.*]] = getelementptr inbounds nuw i8, ptr [[ARR]], i64 12 ; CHECK-ENABLED-NEXT: store i32 [[ADD8_PRE_PHI]], ptr [[GETELEM1]], align 4 ; CHECK-ENABLED-NEXT: ret void ; entry: %tobool.not = icmp eq i8 %cond, 0 %tmp7.pre = load i32, ptr %arr, align 4 br i1 %tobool.not, label %if.end, label %if.then if.then: ; preds = %entry %add = add nsw i32 %tmp7.pre, 2 %getElem = getelementptr inbounds nuw i8, ptr %arr, i64 8 store i32 %add, ptr %getElem, align 4 br label %if.end if.end: ; preds = %if.then, %entry %add8 = add nsw i32 %tmp7.pre, 2 %getElem1 = getelementptr inbounds nuw i8, ptr %arr, i64 12 store i32 %add8, ptr %getElem1, align 4 ret void }