; RUN: opt -attributor --attributor-disable=false -S < %s | FileCheck %s ; TODO: Add max-iteration check ; ModuleID = 'value-simplify.ll' source_filename = "value-simplify.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" declare void @f(i32) ; Test1: Replace argument with constant define internal void @test1(i32 %a) { ; CHECK: tail call void @f(i32 1) tail call void @f(i32 %a) ret void } define void @test1_helper() { tail call void @test1(i32 1) ret void } ; TEST 2 : Simplify return value define i32 @return0() { ret i32 0 } define i32 @return1() { ret i32 1 } ; CHECK: define i32 @test2_1(i1 %c) define i32 @test2_1(i1 %c) { br i1 %c, label %if.true, label %if.false if.true: %call = tail call i32 @return0() ; FIXME: %ret0 should be replaced with i32 1. ; CHECK: %ret0 = add i32 0, 1 %ret0 = add i32 %call, 1 br label %end if.false: %ret1 = tail call i32 @return1() br label %end end: ; FIXME: %ret should be replaced with i32 1. ; CHECK: %ret = phi i32 [ %ret0, %if.true ], [ 1, %if.false ] %ret = phi i32 [ %ret0, %if.true ], [ %ret1, %if.false ] ; FIXME: ret i32 1 ; CHECK: ret i32 %ret ret i32 %ret } ; CHECK: define i32 @test2_2(i1 %c) define i32 @test2_2(i1 %c) { ; FIXME: %ret should be replaced with i32 1. %ret = tail call i32 @test2_1(i1 %c) ; FIXME: ret i32 1 ; CHECK: ret i32 %ret ret i32 %ret } declare void @use(i32) ; CHECK: define void @test3(i1 %c) define void @test3(i1 %c) { br i1 %c, label %if.true, label %if.false if.true: br label %end if.false: %ret1 = tail call i32 @return1() br label %end end: ; CHECK: %r = phi i32 [ 1, %if.true ], [ 1, %if.false ] %r = phi i32 [ 1, %if.true ], [ %ret1, %if.false ] ; CHECK: tail call void @use(i32 1) tail call void @use(i32 %r) ret void } define void @test-select-phi(i1 %c) { %select-same = select i1 %c, i32 1, i32 1 ; CHECK: tail call void @use(i32 1) tail call void @use(i32 %select-same) %select-not-same = select i1 %c, i32 1, i32 0 ; CHECK: tail call void @use(i32 %select-not-same) tail call void @use(i32 %select-not-same) br i1 %c, label %if-true, label %if-false if-true: br label %end if-false: br label %end end: %phi-same = phi i32 [ 1, %if-true ], [ 1, %if-false ] %phi-not-same = phi i32 [ 0, %if-true ], [ 1, %if-false ] %phi-same-prop = phi i32 [ 1, %if-true ], [ %select-same, %if-false ] %phi-same-undef = phi i32 [ 1, %if-true ], [ undef, %if-false ] %select-not-same-undef = select i1 %c, i32 %phi-not-same, i32 undef ; CHECK: tail call void @use(i32 1) tail call void @use(i32 %phi-same) ; CHECK: tail call void @use(i32 %phi-not-same) tail call void @use(i32 %phi-not-same) ; CHECK: tail call void @use(i32 1) tail call void @use(i32 %phi-same-prop) ; CHECK: tail call void @use(i32 1) tail call void @use(i32 %phi-same-undef) ; CHECK: tail call void @use(i32 %select-not-same-undef) tail call void @use(i32 %select-not-same-undef) ret void }