Index: test/CodeGen/Mips/GlobalISel/llvm-ir/current.txt =================================================================== --- /dev/null +++ test/CodeGen/Mips/GlobalISel/llvm-ir/current.txt @@ -0,0 +1,1342 @@ +llc -march=mipsel -global-isel -O0 -stop-after=legalizer -simplify-mir -debug /test.ll -o - + +Features: +CPU:mips32 + + +Features:-mips16 +CPU:mips32 + + +Features:+mips16 +CPU:mips32 + + discovered a new reachable node %entry + discovered a new reachable node %entry + discovered a new reachable node %entry + discovered a new reachable node %entry +Target Transform Info Pass Added + +Features: +CPU:mips32 + +Target Transform Info Pass Added + discovered a new reachable node %entry + discovered a new reachable node %entry +Target Transform Info Pass Added +Target Transform Info Pass Added + discovered a new reachable node %entry +[SafeStack] Function: trunc +[SafeStack] safestack is not requested for this function + discovered a new reachable node %entry +Checking DILocation from %0 = load i32, i32* %i32_ptr_a, align 4 was copied to G_LOAD +Checking DILocation from %tobool = trunc i32 %0 to i1 was copied to G_TRUNC +Checking DILocation from %frombool2 = sext i1 %tobool to i8 was copied to G_SEXT +Checking DILocation from %fromchar3 = zext i8 %frombool2 to i32 was copied to G_ZEXT +Checking DILocation from store i32 %fromchar3, i32* %i32_ptr_b, align 4 was copied to G_STORE +Checking DILocation from ret void was copied to RetRA +Generic MI Combiner for: trunc + +Try combining %0:_(p0) = COPY $a0 + +Try combining %1:_(p0) = COPY $a1 + +Try combining %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + +Try combining %3:_(s1) = G_TRUNC %2:_(s32) + +Try combining %4:_(s8) = G_SEXT %3:_(s1) + +Try combining %5:_(s32) = G_ZEXT %4:_(s8) + +Try combining G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + +Try combining RetRA +Legalize Machine IR for: trunc +InstList : + ---------------------------------------------------------- + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + -------------------------------------------------------- + +Legalizing: G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) +.. opcode G_STORE is aliased to G_LOAD +Applying legalizer ruleset to: G_STORE, Tys={s32, p0, }, Opcode=G_STORE, MMOs={32, } +Rule.Predicate = typePairAndMemSizeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + -------------------------------------------------------- + +Legalizing: %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) +Applying legalizer ruleset to: G_LOAD, Tys={s32, p0, }, Opcode=G_LOAD, MMOs={32, } +Rule.Predicate = typePairAndMemSizeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function trunc: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1 + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + %3:_(s1) = G_TRUNC %2:_(s32) + %4:_(s8) = G_SEXT %3:_(s1) + %5:_(s32) = G_ZEXT %4:_(s8) + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +# End machine code for function trunc. + +ArtifactList : + ---------------------------------------------------------- + %3:_(s1) = G_TRUNC %2:_(s32) + %4:_(s8) = G_SEXT %3:_(s1) + %5:_(s32) = G_ZEXT %4:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %5:_(s32) = G_ZEXT %4:_(s8) + +Unable to combine: %5:_(s32) = G_ZEXT %4:_(s8) + +ArtifactList : + ---------------------------------------------------------- + %3:_(s1) = G_TRUNC %2:_(s32) + %4:_(s8) = G_SEXT %3:_(s1) + -------------------------------------------------------- + +Inspecting Artifact : %4:_(s8) = G_SEXT %3:_(s1) + +Applying legalizer ruleset to: G_SHL, Tys={s8, s8, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s8, s8, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +Applying legalizer ruleset to: G_CONSTANT, Tys={s8, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Combine MI: %4:_(s8) = G_SEXT %3:_(s1) + Changing + %3:_(s1) = G_TRUNC %2:_(s32) + . . . + %4:_(s8) = G_SEXT %3:_(s1) +CSEInfo::Recording new MI G_CONSTANT +Into: + %6:_(s8) = G_CONSTANT i8 7 + %7:_(s8) = G_TRUNC %2:_(s32) + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %4:_(s8) = G_ASHR %8:_, %6:_(s8) + . . . + %4:_(s8) = G_SEXT %3:_(s1) + +Erasing dead instr as result of combine: %4:_(s8) = G_SEXT %3:_(s1) + +Erasing dead instr as result of combine: %3:_(s1) = G_TRUNC %2:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %7:_(s8) = G_TRUNC %2:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %7:_(s8) = G_TRUNC %2:_(s32) + +Unable to combine: %7:_(s8) = G_TRUNC %2:_(s32) + +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %4:_(s8) = G_ASHR %8:_, %6:_(s8) + %7:_(s8) = G_TRUNC %2:_(s32) + -------------------------------------------------------- + +Legalizing: %7:_(s8) = G_TRUNC %2:_(s32) +Applying legalizer ruleset to: G_TRUNC, Tys={s8, s32, }, Opcode=G_TRUNC, MMOs={} +Rule.Predicate =unknown Predicate.. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %4:_(s8) = G_ASHR %8:_, %6:_(s8) + -------------------------------------------------------- + +Legalizing: %4:_(s8) = G_ASHR %8:_, %6:_(s8) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s8, s8, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +.. Widen scalar + Changing + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + . . . + %4:_(s8) = G_ASHR %8:_, %6:_(s8) +Into: + %9:_(s32) = G_ZEXT %6:_(s8) + . . . + %4:_(s8) = G_ASHR %8:_, %9:_(s32) + +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %4:_(s8) = G_ASHR %8:_, %9:_(s32) + -------------------------------------------------------- + +Legalizing: %4:_(s8) = G_ASHR %8:_, %9:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s8, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %9:_(s32) = G_ZEXT %6:_(s8) + . . . + %4:_(s8) = G_ASHR %8:_, %9:_(s32) +Into: + %10:_(s32) = G_SEXT %8:_(s8) + . . . + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + . . . + %4:_(s8) = G_TRUNC %11:_(s32) + +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + -------------------------------------------------------- + +Legalizing: %11:_(s32) = G_ASHR %10:_, %9:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + -------------------------------------------------------- + +Legalizing: %8:_(s8) = G_SHL %7:_, %6:_(s8) +Applying legalizer ruleset to: G_SHL, Tys={s8, s8, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +.. Widen scalar + Changing + %7:_(s8) = G_TRUNC %2:_(s32) + %6:_(s8) = G_CONSTANT i8 7 + . . . + %8:_(s8) = G_SHL %7:_, %6:_(s8) +Into: + %12:_(s32) = G_ZEXT %6:_(s8) + . . . + %8:_(s8) = G_SHL %7:_, %12:_(s32) + +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %12:_(s32) + -------------------------------------------------------- + +Legalizing: %8:_(s8) = G_SHL %7:_, %12:_(s32) +Applying legalizer ruleset to: G_SHL, Tys={s8, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + %7:_(s8) = G_TRUNC %2:_(s32) + %12:_(s32) = G_ZEXT %6:_(s8) + . . . + %8:_(s8) = G_SHL %7:_, %12:_(s32) +Into: + %13:_(s32) = G_ANYEXT %7:_(s8) + . . . + %14:_(s32) = G_SHL %13:_, %12:_(s32) + . . . + %8:_(s8) = G_TRUNC %14:_(s32) + +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + %14:_(s32) = G_SHL %13:_, %12:_(s32) + -------------------------------------------------------- + +Legalizing: %14:_(s32) = G_SHL %13:_, %12:_(s32) +Applying legalizer ruleset to: G_SHL, Tys={s32, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + -------------------------------------------------------- + +Legalizing: %6:_(s8) = G_CONSTANT i8 7 +Applying legalizer ruleset to: G_CONSTANT, Tys={s8, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + . . . + %6:_(s8) = G_CONSTANT i8 7 +CSEInfo::Recording new MI %6:_(s8) = G_CONSTANT i8 7 +Into: + . . . + %15:_(s32) = G_CONSTANT i32 7 + . . . + %6:_(s8) = G_TRUNC %15:_(s32) + +CSEInfo::Recording new MI %15:_(s32) = G_CONSTANT i32 7 +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + %15:_(s32) = G_CONSTANT i32 7 + -------------------------------------------------------- + +Legalizing: %15:_(s32) = G_CONSTANT i32 7 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ZEXT %4:_(s8) + -------------------------------------------------------- + +Legalizing: %5:_(s32) = G_ZEXT %4:_(s8) +Applying legalizer ruleset to: G_ZEXT, Tys={s32, s8, }, Opcode=G_ZEXT, MMOs={} +Rule.Predicate =unknown Predicate.. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function trunc: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1 + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + %15:_(s32) = G_CONSTANT i32 7 + %6:_(s8) = G_TRUNC %15:_(s32) + %7:_(s8) = G_TRUNC %2:_(s32) + %12:_(s32) = G_ZEXT %6:_(s8) + %13:_(s32) = G_ANYEXT %7:_(s8) + %14:_(s32) = G_SHL %13:_, %12:_(s32) + %8:_(s8) = G_TRUNC %14:_(s32) + %9:_(s32) = G_ZEXT %6:_(s8) + %10:_(s32) = G_SEXT %8:_(s8) + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + %4:_(s8) = G_TRUNC %11:_(s32) + %5:_(s32) = G_ZEXT %4:_(s8) + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +# End machine code for function trunc. + +ArtifactList : + ---------------------------------------------------------- + %9:_(s32) = G_ZEXT %6:_(s8) + %10:_(s32) = G_SEXT %8:_(s8) + %4:_(s8) = G_TRUNC %11:_(s32) + %12:_(s32) = G_ZEXT %6:_(s8) + %13:_(s32) = G_ANYEXT %7:_(s8) + %8:_(s8) = G_TRUNC %14:_(s32) + %6:_(s8) = G_TRUNC %15:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %6:_(s8) = G_TRUNC %15:_(s32) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %9:_(s32) = G_ZEXT %6:_(s8) + Changing + %6:_(s8) = G_TRUNC %15:_(s32) + . . . + %9:_(s32) = G_ZEXT %6:_(s8) +CSEInfo::Handling recorded MI %15:_(s32) = G_CONSTANT i32 7 +CSEInfo::Recording new MI G_CONSTANT +Into: + %16:_(s32) = G_CONSTANT i32 255 + %17:_(s32) = COPY %15:_(s32) + %9:_(s32) = G_AND %17:_, %16:_ + . . . + %9:_(s32) = G_ZEXT %6:_(s8) + +%9:_(s32) = G_ZEXT %6:_(s8) +Is dead, eagerly deleting +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %12:_(s32) = G_ZEXT %6:_(s8) + Changing + %6:_(s8) = G_TRUNC %15:_(s32) + . . . + %12:_(s32) = G_ZEXT %6:_(s8) +CSEInfo::Found Instr %16:_(s32) = G_CONSTANT i32 255 +Into: + %18:_(s32) = COPY %15:_(s32) + %12:_(s32) = G_AND %18:_, %16:_ + . . . + %12:_(s32) = G_ZEXT %6:_(s8) + +Erasing dead instr as result of combine: %12:_(s32) = G_ZEXT %6:_(s8) + +Erasing dead instr as result of combine: %6:_(s8) = G_TRUNC %15:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %10:_(s32) = G_SEXT %8:_(s8) + %4:_(s8) = G_TRUNC %11:_(s32) + %13:_(s32) = G_ANYEXT %7:_(s8) + %8:_(s8) = G_TRUNC %14:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %8:_(s8) = G_TRUNC %14:_(s32) + +Applying legalizer ruleset to: G_SHL, Tys={s32, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %10:_(s32) = G_SEXT %8:_(s8) + Changing + %8:_(s8) = G_TRUNC %14:_(s32) + . . . + %10:_(s32) = G_SEXT %8:_(s8) +CSEInfo::Recording new MI G_CONSTANT +Into: + %19:_(s32) = G_CONSTANT i32 24 + %20:_(s32) = COPY %14:_(s32) + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + . . . + %10:_(s32) = G_SEXT %8:_(s8) + +Erasing dead instr as result of combine: %10:_(s32) = G_SEXT %8:_(s8) + +Erasing dead instr as result of combine: %8:_(s8) = G_TRUNC %14:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %4:_(s8) = G_TRUNC %11:_(s32) + %13:_(s32) = G_ANYEXT %7:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %13:_(s32) = G_ANYEXT %7:_(s8) + +.. Combine MI: %13:_(s32) = G_ANYEXT %7:_(s8) + Changing + %7:_(s8) = G_TRUNC %2:_(s32) + . . . + %13:_(s32) = G_ANYEXT %7:_(s8) +Into: + %13:_(s32) = COPY %2:_(s32) + . . . + %13:_(s32) = G_ANYEXT %7:_(s8) + +Erasing dead instr as result of combine: %13:_(s32) = G_ANYEXT %7:_(s8) + +Erasing dead instr as result of combine: %7:_(s8) = G_TRUNC %2:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %4:_(s8) = G_TRUNC %11:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %4:_(s8) = G_TRUNC %11:_(s32) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %5:_(s32) = G_ZEXT %4:_(s8) + Changing + %4:_(s8) = G_TRUNC %11:_(s32) + . . . + %5:_(s32) = G_ZEXT %4:_(s8) +CSEInfo::Found Instr %16:_(s32) = G_CONSTANT i32 255 +Into: + %22:_(s32) = COPY %11:_(s32) + %5:_(s32) = G_AND %22:_, %16:_ + . . . + %5:_(s32) = G_ZEXT %4:_(s8) + +Erasing dead instr as result of combine: %5:_(s32) = G_ZEXT %4:_(s8) + +Erasing dead instr as result of combine: %4:_(s8) = G_TRUNC %11:_(s32) + +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %9:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + %5:_(s32) = G_AND %22:_, %16:_ + -------------------------------------------------------- + +Legalizing: %5:_(s32) = G_AND %22:_, %16:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %9:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + -------------------------------------------------------- + +Legalizing: %10:_(s32) = G_ASHR %21:_, %19:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %9:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %21:_(s32) = G_SHL %20:_, %19:_(s32) + -------------------------------------------------------- + +Legalizing: %21:_(s32) = G_SHL %20:_, %19:_(s32) +Applying legalizer ruleset to: G_SHL, Tys={s32, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %9:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + -------------------------------------------------------- + +Legalizing: %19:_(s32) = G_CONSTANT i32 24 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %9:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + -------------------------------------------------------- + +Legalizing: %12:_(s32) = G_AND %18:_, %16:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %9:_(s32) = G_AND %17:_, %16:_ + -------------------------------------------------------- + +Legalizing: %9:_(s32) = G_AND %17:_, %16:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + -------------------------------------------------------- + +Legalizing: %16:_(s32) = G_CONSTANT i32 255 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function trunc: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1 + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + %15:_(s32) = G_CONSTANT i32 7 + %16:_(s32) = G_CONSTANT i32 255 + %18:_(s32) = COPY %15:_(s32) + %12:_(s32) = G_AND %18:_, %16:_ + %13:_(s32) = COPY %2:_(s32) + %14:_(s32) = G_SHL %13:_, %12:_(s32) + %17:_(s32) = COPY %15:_(s32) + %9:_(s32) = G_AND %17:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %20:_(s32) = COPY %14:_(s32) + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + %22:_(s32) = COPY %11:_(s32) + %5:_(s32) = G_AND %22:_, %16:_ + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +# End machine code for function trunc. + +CSEInfo::CSE Hit for Opc 85 : 2 + discovered a new reachable node %entry +[SafeStack] Function: merge +[SafeStack] safestack is not requested for this function + discovered a new reachable node %entry +Checking DILocation from %add = add i32 %y, %x was copied to G_ADD +Checking DILocation from %conv = sext i32 %add to i64 was copied to G_SEXT +Checking DILocation from %add1 = add i64 %conv, %z was copied to G_ADD +Checking DILocation from ret i64 %add1 was copied to G_UNMERGE_VALUES +Checking DILocation from ret i64 %add1 was copied to COPY +Checking DILocation from ret i64 %add1 was copied to COPY +Checking DILocation from ret i64 %add1 was copied to RetRA implicit $v0, implicit $v1 +Generic MI Combiner for: merge + +Try combining %0:_(s32) = COPY $a0 + +Try combining %1:_(s32) = COPY $a1 + +Try combining %3:_(s32) = COPY $a2 + +Try combining %4:_(s32) = COPY $a3 + +Try combining %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + +Try combining %5:_(s32) = G_ADD %1:_, %0:_ + +Try combining %6:_(s64) = G_SEXT %5:_(s32) + +Try combining %7:_(s64) = G_ADD %6:_, %2:_ + +Try combining %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + +Try combining $v0 = COPY %8:_(s32) + +Try combining $v1 = COPY %9:_(s32) + +Try combining RetRA implicit $v0, implicit $v1 +Legalize Machine IR for: merge +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %7:_(s64) = G_ADD %6:_, %2:_ + -------------------------------------------------------- + +Legalizing: %7:_(s64) = G_ADD %6:_, %2:_ +Applying legalizer ruleset to: G_ADD, Tys={s64, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = widerThan .. match :.. .. NarrowScalar, 0, s32 +.. Narrow scalar + Changing + %6:_(s64) = G_SEXT %5:_(s32) + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + . . . + %7:_(s64) = G_ADD %6:_, %2:_ +CSEInfo::Recording new MI G_CONSTANT +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %17:_(s32), %18:_(s1) = G_UADDE %11:_, %13:_, %16:_ + -------------------------------------------------------- + +Legalizing: %17:_(s32), %18:_(s1) = G_UADDE %11:_, %13:_, %16:_ +.. opcode G_UADDE is aliased to G_UADDO +Applying legalizer ruleset to: G_UADDE, Tys={s32, s1, }, Opcode=G_UADDE, MMOs={} +Rule.Predicate = typePairInSet .. match :.. .. Lower, 0, s32 +.. Lower +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %19:_(s32) = G_ADD %11:_, %13:_ + %17:_(s32) = G_ADD %19:_, %20:_ + %18:_(s1) = G_ICMP intpred(ult), %17:_(s32), %11:_ + -------------------------------------------------------- + +%18:_(s1) = G_ICMP intpred(ult), %17:_(s32), %11:_ +Is dead; erasing. +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %19:_(s32) = G_ADD %11:_, %13:_ + %17:_(s32) = G_ADD %19:_, %20:_ + -------------------------------------------------------- + +Legalizing: %17:_(s32) = G_ADD %19:_, %20:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %19:_(s32) = G_ADD %11:_, %13:_ + -------------------------------------------------------- + +Legalizing: %19:_(s32) = G_ADD %11:_, %13:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + -------------------------------------------------------- + +Legalizing: %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ +.. opcode G_UADDE is aliased to G_UADDO +Applying legalizer ruleset to: G_UADDE, Tys={s32, s1, }, Opcode=G_UADDE, MMOs={} +Rule.Predicate = typePairInSet .. match :.. .. Lower, 0, s32 +.. Lower +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + %15:_(s32) = G_ADD %21:_, %22:_ + %16:_(s1) = G_ICMP intpred(ult), %15:_(s32), %10:_ + -------------------------------------------------------- + +Legalizing: %16:_(s1) = G_ICMP intpred(ult), %15:_(s32), %10:_ +Applying legalizer ruleset to: G_ICMP, Tys={s1, s32, }, Opcode=G_ICMP, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = widerThan .. no match for action :NarrowScalar +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + %15:_(s32) = G_ADD %21:_, %22:_ + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + . . . + %16:_(s1) = G_ICMP intpred(ult), %15:_(s32), %10:_ +Into: + . . . + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + . . . + %16:_(s1) = G_TRUNC %23:_(s32) + +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + %15:_(s32) = G_ADD %21:_, %22:_ + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + -------------------------------------------------------- + +Legalizing: %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ +Applying legalizer ruleset to: G_ICMP, Tys={s32, s32, }, Opcode=G_ICMP, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + %15:_(s32) = G_ADD %21:_, %22:_ + -------------------------------------------------------- + +Legalizing: %15:_(s32) = G_ADD %21:_, %22:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + -------------------------------------------------------- + +Legalizing: %21:_(s32) = G_ADD %10:_, %12:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + -------------------------------------------------------- + +Legalizing: %14:_(s1) = G_CONSTANT i1 false +Applying legalizer ruleset to: G_CONSTANT, Tys={s1, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + . . . + %14:_(s1) = G_CONSTANT i1 false +CSEInfo::Recording new MI %14:_(s1) = G_CONSTANT i1 false +Into: + . . . + %24:_(s32) = G_CONSTANT i32 0 + . . . + %14:_(s1) = G_TRUNC %24:_(s32) + +CSEInfo::Recording new MI %24:_(s32) = G_CONSTANT i32 0 +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %24:_(s32) = G_CONSTANT i32 0 + -------------------------------------------------------- + +Legalizing: %24:_(s32) = G_CONSTANT i32 0 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + -------------------------------------------------------- + +Legalizing: %5:_(s32) = G_ADD %1:_, %0:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function merge: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1, $a2, $a3 + %0:_(s32) = COPY $a0 + %1:_(s32) = COPY $a1 + %3:_(s32) = COPY $a2 + %4:_(s32) = COPY $a3 + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + %5:_(s32) = G_ADD %1:_, %0:_ + %6:_(s64) = G_SEXT %5:_(s32) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + %24:_(s32) = G_CONSTANT i32 0 + %14:_(s1) = G_TRUNC %24:_(s32) + %21:_(s32) = G_ADD %10:_, %12:_ + %22:_(s32) = G_ZEXT %14:_(s1) + %15:_(s32) = G_ADD %21:_, %22:_ + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + %16:_(s1) = G_TRUNC %23:_(s32) + %19:_(s32) = G_ADD %11:_, %13:_ + %20:_(s32) = G_ZEXT %16:_(s1) + %17:_(s32) = G_ADD %19:_, %20:_ + %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + $v0 = COPY %8:_(s32) + $v1 = COPY %9:_(s32) + RetRA implicit $v0, implicit $v1 + +# End machine code for function merge. + +ArtifactList : + ---------------------------------------------------------- + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + %20:_(s32) = G_ZEXT %16:_(s1) + %22:_(s32) = G_ZEXT %14:_(s1) + %16:_(s1) = G_TRUNC %23:_(s32) + %14:_(s1) = G_TRUNC %24:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %14:_(s1) = G_TRUNC %24:_(s32) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %22:_(s32) = G_ZEXT %14:_(s1) + Changing + %14:_(s1) = G_TRUNC %24:_(s32) + . . . + %22:_(s32) = G_ZEXT %14:_(s1) +CSEInfo::Handling recorded MI %24:_(s32) = G_CONSTANT i32 0 +CSEInfo::Recording new MI G_CONSTANT +Into: + %25:_(s32) = G_CONSTANT i32 1 + %26:_(s32) = COPY %24:_(s32) + %22:_(s32) = G_AND %26:_, %25:_ + . . . + %22:_(s32) = G_ZEXT %14:_(s1) + +Erasing dead instr as result of combine: %22:_(s32) = G_ZEXT %14:_(s1) + +Erasing dead instr as result of combine: %14:_(s1) = G_TRUNC %24:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + %20:_(s32) = G_ZEXT %16:_(s1) + %16:_(s1) = G_TRUNC %23:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %16:_(s1) = G_TRUNC %23:_(s32) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %20:_(s32) = G_ZEXT %16:_(s1) + Changing + %16:_(s1) = G_TRUNC %23:_(s32) + . . . + %20:_(s32) = G_ZEXT %16:_(s1) +CSEInfo::Found Instr %25:_(s32) = G_CONSTANT i32 1 +Into: + %27:_(s32) = COPY %23:_(s32) + %20:_(s32) = G_AND %27:_, %25:_ + . . . + %20:_(s32) = G_ZEXT %16:_(s1) + +Erasing dead instr as result of combine: %20:_(s32) = G_ZEXT %16:_(s1) + +Erasing dead instr as result of combine: %16:_(s1) = G_TRUNC %23:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + +Unable to combine: %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + -------------------------------------------------------- + +Inspecting Artifact : %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + + Changing + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + . . . + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) +Doing Merge/Unmerge coombine with MRI.replaceRegWith(,) Observer does not catch this atm: +Into: + . . . + %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2:_(s64) + +Erasing dead instr as result of combine: %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2:_(s64) + +Erasing dead instr as result of combine: %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + -------------------------------------------------------- + +Inspecting Artifact : %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + +Unable to combine: %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + -------------------------------------------------------- + +Inspecting Artifact : %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + + Changing + %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + . . . + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) +Doing Merge/Unmerge coombine with MRI.replaceRegWith(,) Observer does not catch this atm: +Into: + . . . + %15:_(s32), %17:_(s32) = G_UNMERGE_VALUES %7:_(s64) + +Erasing dead instr as result of combine: %15:_(s32), %17:_(s32) = G_UNMERGE_VALUES %7:_(s64) + +Erasing dead instr as result of combine: %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %6:_(s64) = G_SEXT %5:_(s32) + +Unable to combine: %6:_(s64) = G_SEXT %5:_(s32) + +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %6:_(s64) = G_SEXT %5:_(s32) + -------------------------------------------------------- + +Legalizing: %6:_(s64) = G_SEXT %5:_(s32) +.. opcode G_SEXT is aliased to G_ZEXT +Applying legalizer ruleset to: G_SEXT, Tys={s64, s32, }, Opcode=G_SEXT, MMOs={} +Rule.Predicate =unknown Predicate.. no match for action :Legal +Rule.Predicate = widerThan .. match :.. .. NarrowScalar, 0, s32 +.. Narrow scalar + Changing + %5:_(s32) = G_ADD %1:_, %0:_ + . . . + %6:_(s64) = G_SEXT %5:_(s32) +CSEInfo::Recording new MI G_CONSTANT +Into: + %28:_(s32) = COPY %5:_(s32) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28:_, %30:_(s32) + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + . . . + %6:_(s64) = G_SEXT %5:_(s32) + +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28:_, %30:_(s32) + -------------------------------------------------------- + +Legalizing: %29:_(s32) = G_ASHR %28:_, %30:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %30:_(s32) = G_CONSTANT i32 31 + -------------------------------------------------------- + +Legalizing: %30:_(s32) = G_CONSTANT i32 31 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + -------------------------------------------------------- + +Legalizing: %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) +Applying legalizer ruleset to: G_UNMERGE_VALUES, Tys={s32, s64, }, Opcode=G_UNMERGE_VALUES, MMOs={} +Rule.Predicate = typePairInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + -------------------------------------------------------- + +Legalizing: %20:_(s32) = G_AND %27:_, %25:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + -------------------------------------------------------- + +Legalizing: %22:_(s32) = G_AND %26:_, %25:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + -------------------------------------------------------- + +Legalizing: %25:_(s32) = G_CONSTANT i32 1 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function merge: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1, $a2, $a3 + %0:_(s32) = COPY $a0 + %1:_(s32) = COPY $a1 + %3:_(s32) = COPY $a2 + %4:_(s32) = COPY $a3 + %5:_(s32) = G_ADD %1:_, %0:_ + %28:_(s32) = COPY %5:_(s32) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28:_, %30:_(s32) + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %24:_(s32) = G_CONSTANT i32 0 + %21:_(s32) = G_ADD %10:_, %3:_ + %25:_(s32) = G_CONSTANT i32 1 + %26:_(s32) = COPY %24:_(s32) + %22:_(s32) = G_AND %26:_, %25:_ + %15:_(s32) = G_ADD %21:_, %22:_ + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + %19:_(s32) = G_ADD %11:_, %4:_ + %27:_(s32) = COPY %23:_(s32) + %20:_(s32) = G_AND %27:_, %25:_ + %17:_(s32) = G_ADD %19:_, %20:_ + $v0 = COPY %15:_(s32) + $v1 = COPY %17:_(s32) + RetRA implicit $v0, implicit $v1 + +# End machine code for function merge. + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + +Unable to combine: %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + +InstList : + ---------------------------------------------------------- + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + -------------------------------------------------------- + +Legalizing: %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) +Applying legalizer ruleset to: G_MERGE_VALUES, Tys={s64, s32, }, Opcode=G_MERGE_VALUES, MMOs={} +Rule.Predicate = typePairInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function merge: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1, $a2, $a3 + %0:_(s32) = COPY $a0 + %1:_(s32) = COPY $a1 + %3:_(s32) = COPY $a2 + %4:_(s32) = COPY $a3 + %5:_(s32) = G_ADD %1:_, %0:_ + %28:_(s32) = COPY %5:_(s32) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28:_, %30:_(s32) + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %24:_(s32) = G_CONSTANT i32 0 + %21:_(s32) = G_ADD %10:_, %3:_ + %25:_(s32) = G_CONSTANT i32 1 + %26:_(s32) = COPY %24:_(s32) + %22:_(s32) = G_AND %26:_, %25:_ + %15:_(s32) = G_ADD %21:_, %22:_ + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + %19:_(s32) = G_ADD %11:_, %4:_ + %27:_(s32) = COPY %23:_(s32) + %20:_(s32) = G_AND %27:_, %25:_ + %17:_(s32) = G_ADD %19:_, %20:_ + $v0 = COPY %15:_(s32) + $v1 = COPY %17:_(s32) + RetRA implicit $v0, implicit $v1 + +# End machine code for function merge. + +CSEInfo::CSE Hit for Opc 85 : 1 +--- | + ; ModuleID = '/home/rtrk/giselprintf_git/printf.ll' + source_filename = "/home/rtrk/giselprintf_git/printf.ll" + target datalayout = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" + + define void @trunc(i32* %i32_ptr_a, i32* %i32_ptr_b) { + entry: + %0 = load i32, i32* %i32_ptr_a, align 4 + %tobool = trunc i32 %0 to i1 + %frombool2 = sext i1 %tobool to i8 + %fromchar3 = zext i8 %frombool2 to i32 + store i32 %fromchar3, i32* %i32_ptr_b, align 4 + ret void + } + + define i64 @merge(i32 %x, i32 %y, i64 %z) { + entry: + %add = add i32 %y, %x + %conv = sext i32 %add to i64 + %add1 = add i64 %conv, %z + ret i64 %add1 + } + +... +--- +name: trunc +alignment: 2 +legalized: true +tracksRegLiveness: true +registers: + - { id: 0, class: _ } + - { id: 1, class: _ } + - { id: 2, class: _ } + - { id: 3, class: _ } + - { id: 4, class: _ } + - { id: 5, class: _ } + - { id: 6, class: _ } + - { id: 7, class: _ } + - { id: 8, class: _ } + - { id: 9, class: _ } + - { id: 10, class: _ } + - { id: 11, class: _ } + - { id: 12, class: _ } + - { id: 13, class: _ } + - { id: 14, class: _ } + - { id: 15, class: _ } + - { id: 16, class: _ } + - { id: 17, class: _ } + - { id: 18, class: _ } + - { id: 19, class: _ } + - { id: 20, class: _ } + - { id: 21, class: _ } + - { id: 22, class: _ } +frameInfo: + maxAlignment: 1 +machineFunctionInfo: {} +body: | + bb.1.entry: + liveins: $a0, $a1 + + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0(p0) :: (load 4 from %ir.i32_ptr_a) + %15:_(s32) = G_CONSTANT i32 7 + %16:_(s32) = G_CONSTANT i32 255 + %18:_(s32) = COPY %15(s32) + %12:_(s32) = G_AND %18, %16 + %13:_(s32) = COPY %2(s32) + %14:_(s32) = G_SHL %13, %12(s32) + %17:_(s32) = COPY %15(s32) + %9:_(s32) = G_AND %17, %16 + %19:_(s32) = G_CONSTANT i32 24 + %20:_(s32) = COPY %14(s32) + %21:_(s32) = G_SHL %20, %19(s32) + %10:_(s32) = G_ASHR %21, %19(s32) + %11:_(s32) = G_ASHR %10, %9(s32) + %22:_(s32) = COPY %11(s32) + %5:_(s32) = G_AND %22, %16 + G_STORE %5(s32), %1(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +... +--- +name: merge +alignment: 2 +legalized: true +tracksRegLiveness: true +registers: + - { id: 0, class: _ } + - { id: 1, class: _ } + - { id: 2, class: _ } + - { id: 3, class: _ } + - { id: 4, class: _ } + - { id: 5, class: _ } + - { id: 6, class: _ } + - { id: 7, class: _ } + - { id: 8, class: _ } + - { id: 9, class: _ } + - { id: 10, class: _ } + - { id: 11, class: _ } + - { id: 12, class: _ } + - { id: 13, class: _ } + - { id: 14, class: _ } + - { id: 15, class: _ } + - { id: 16, class: _ } + - { id: 17, class: _ } + - { id: 18, class: _ } + - { id: 19, class: _ } + - { id: 20, class: _ } + - { id: 21, class: _ } + - { id: 22, class: _ } + - { id: 23, class: _ } + - { id: 24, class: _ } + - { id: 25, class: _ } + - { id: 26, class: _ } + - { id: 27, class: _ } + - { id: 28, class: _ } + - { id: 29, class: _ } + - { id: 30, class: _ } +frameInfo: + maxAlignment: 1 +machineFunctionInfo: {} +body: | + bb.1.entry: + liveins: $a0, $a1, $a2, $a3 + + %0:_(s32) = COPY $a0 + %1:_(s32) = COPY $a1 + %3:_(s32) = COPY $a2 + %4:_(s32) = COPY $a3 + %5:_(s32) = G_ADD %1, %0 + %28:_(s32) = COPY %5(s32) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28, %30(s32) + %6:_(s64) = G_MERGE_VALUES %28(s32), %29(s32) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6(s64) + %24:_(s32) = G_CONSTANT i32 0 + %21:_(s32) = G_ADD %10, %3 + %25:_(s32) = G_CONSTANT i32 1 + %26:_(s32) = COPY %24(s32) + %22:_(s32) = G_AND %26, %25 + %15:_(s32) = G_ADD %21, %22 + %23:_(s32) = G_ICMP intpred(ult), %15(s32), %10 + %19:_(s32) = G_ADD %11, %4 + %27:_(s32) = COPY %23(s32) + %20:_(s32) = G_AND %27, %25 + %17:_(s32) = G_ADD %19, %20 + $v0 = COPY %15(s32) + $v1 = COPY %17(s32) + RetRA implicit $v0, implicit $v1 + +... \ No newline at end of file Index: test/CodeGen/Mips/GlobalISel/llvm-ir/withD61787.txt =================================================================== --- /dev/null +++ test/CodeGen/Mips/GlobalISel/llvm-ir/withD61787.txt @@ -0,0 +1,1242 @@ +llc -march=mipsel -global-isel -O0 -stop-after=legalizer -simplify-mir -debug /test.ll -o - + +Features: +CPU:mips32 + + +Features:-mips16 +CPU:mips32 + + +Features:+mips16 +CPU:mips32 + + discovered a new reachable node %entry + discovered a new reachable node %entry + discovered a new reachable node %entry + discovered a new reachable node %entry +Target Transform Info Pass Added + +Features: +CPU:mips32 + +Target Transform Info Pass Added + discovered a new reachable node %entry + discovered a new reachable node %entry +Target Transform Info Pass Added +Target Transform Info Pass Added + discovered a new reachable node %entry +[SafeStack] Function: trunc +[SafeStack] safestack is not requested for this function + discovered a new reachable node %entry +Checking DILocation from %0 = load i32, i32* %i32_ptr_a, align 4 was copied to G_LOAD +Checking DILocation from %tobool = trunc i32 %0 to i1 was copied to G_TRUNC +Checking DILocation from %frombool2 = sext i1 %tobool to i8 was copied to G_SEXT +Checking DILocation from %fromchar3 = zext i8 %frombool2 to i32 was copied to G_ZEXT +Checking DILocation from store i32 %fromchar3, i32* %i32_ptr_b, align 4 was copied to G_STORE +Checking DILocation from ret void was copied to RetRA +Generic MI Combiner for: trunc + +Try combining %0:_(p0) = COPY $a0 + +Try combining %1:_(p0) = COPY $a1 + +Try combining %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + +Try combining %3:_(s1) = G_TRUNC %2:_(s32) + +Try combining %4:_(s8) = G_SEXT %3:_(s1) + +Try combining %5:_(s32) = G_ZEXT %4:_(s8) + +Try combining G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + +Try combining RetRA +Legalize Machine IR for: trunc +InstList : + ---------------------------------------------------------- + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + -------------------------------------------------------- + +Legalizing: G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) +.. opcode G_STORE is aliased to G_LOAD +Applying legalizer ruleset to: G_STORE, Tys={s32, p0, }, Opcode=G_STORE, MMOs={32, } +Rule.Predicate = typePairAndMemSizeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + -------------------------------------------------------- + +Legalizing: %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) +Applying legalizer ruleset to: G_LOAD, Tys={s32, p0, }, Opcode=G_LOAD, MMOs={32, } +Rule.Predicate = typePairAndMemSizeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function trunc: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1 + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + %3:_(s1) = G_TRUNC %2:_(s32) + %4:_(s8) = G_SEXT %3:_(s1) + %5:_(s32) = G_ZEXT %4:_(s8) + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +# End machine code for function trunc. + +ArtifactList : + ---------------------------------------------------------- + %4:_(s8) = G_SEXT %3:_(s1) + %5:_(s32) = G_ZEXT %4:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %5:_(s32) = G_ZEXT %4:_(s8) + +Detected chain to unprocessed instr: %4:_(s8) = G_SEXT %3:_(s1) + +Try combine later for: %5:_(s32) = G_ZEXT %4:_(s8) + +ArtifactList : + ---------------------------------------------------------- + %4:_(s8) = G_SEXT %3:_(s1) + -------------------------------------------------------- + +Inspecting Artifact : %4:_(s8) = G_SEXT %3:_(s1) + +Applying legalizer ruleset to: G_SHL, Tys={s8, s8, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s8, s8, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +Applying legalizer ruleset to: G_CONSTANT, Tys={s8, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Combine MI: %4:_(s8) = G_SEXT %3:_(s1) + Changing + %3:_(s1) = G_TRUNC %2:_(s32) + . . . + %4:_(s8) = G_SEXT %3:_(s1) +CSEInfo::Recording new MI G_CONSTANT +Into: + %6:_(s8) = G_CONSTANT i8 7 + %7:_(s8) = G_TRUNC %2:_(s32) + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %4:_(s8) = G_ASHR %8:_, %6:_(s8) + . . . + %4:_(s8) = G_SEXT %3:_(s1) + +Erasing dead instr as result of combine: %4:_(s8) = G_SEXT %3:_(s1) + +Erasing dead instr as result of combine: %3:_(s1) = G_TRUNC %2:_(s32) + +InstList : + ---------------------------------------------------------- + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %4:_(s8) = G_ASHR %8:_, %6:_(s8) + -------------------------------------------------------- + +Legalizing: %4:_(s8) = G_ASHR %8:_, %6:_(s8) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s8, s8, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +.. Widen scalar + Changing + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %6:_(s8) = G_CONSTANT i8 7 + . . . + %4:_(s8) = G_ASHR %8:_, %6:_(s8) +Into: + %9:_(s32) = G_ZEXT %6:_(s8) + . . . + %4:_(s8) = G_ASHR %8:_, %9:_(s32) + +InstList : + ---------------------------------------------------------- + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %4:_(s8) = G_ASHR %8:_, %9:_(s32) + -------------------------------------------------------- + +Legalizing: %4:_(s8) = G_ASHR %8:_, %9:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s8, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %9:_(s32) = G_ZEXT %6:_(s8) + . . . + %4:_(s8) = G_ASHR %8:_, %9:_(s32) +Into: + %10:_(s32) = G_SEXT %8:_(s8) + . . . + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + . . . + %4:_(s8) = G_TRUNC %11:_(s32) + +InstList : + ---------------------------------------------------------- + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + -------------------------------------------------------- + +Legalizing: %11:_(s32) = G_ASHR %10:_, %9:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %6:_(s8) + -------------------------------------------------------- + +Legalizing: %8:_(s8) = G_SHL %7:_, %6:_(s8) +Applying legalizer ruleset to: G_SHL, Tys={s8, s8, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 1, s32 +.. Widen scalar + Changing + %7:_(s8) = G_TRUNC %2:_(s32) + %6:_(s8) = G_CONSTANT i8 7 + . . . + %8:_(s8) = G_SHL %7:_, %6:_(s8) +Into: + %12:_(s32) = G_ZEXT %6:_(s8) + . . . + %8:_(s8) = G_SHL %7:_, %12:_(s32) + +InstList : + ---------------------------------------------------------- + %6:_(s8) = G_CONSTANT i8 7 + %8:_(s8) = G_SHL %7:_, %12:_(s32) + -------------------------------------------------------- + +Legalizing: %8:_(s8) = G_SHL %7:_, %12:_(s32) +Applying legalizer ruleset to: G_SHL, Tys={s8, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + %7:_(s8) = G_TRUNC %2:_(s32) + %12:_(s32) = G_ZEXT %6:_(s8) + . . . + %8:_(s8) = G_SHL %7:_, %12:_(s32) +Into: + %13:_(s32) = G_ANYEXT %7:_(s8) + . . . + %14:_(s32) = G_SHL %13:_, %12:_(s32) + . . . + %8:_(s8) = G_TRUNC %14:_(s32) + +InstList : + ---------------------------------------------------------- + %6:_(s8) = G_CONSTANT i8 7 + %14:_(s32) = G_SHL %13:_, %12:_(s32) + -------------------------------------------------------- + +Legalizing: %14:_(s32) = G_SHL %13:_, %12:_(s32) +Applying legalizer ruleset to: G_SHL, Tys={s32, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %6:_(s8) = G_CONSTANT i8 7 + -------------------------------------------------------- + +Legalizing: %6:_(s8) = G_CONSTANT i8 7 +Applying legalizer ruleset to: G_CONSTANT, Tys={s8, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + . . . + %6:_(s8) = G_CONSTANT i8 7 +CSEInfo::Recording new MI %6:_(s8) = G_CONSTANT i8 7 +Into: + . . . + %15:_(s32) = G_CONSTANT i32 7 + . . . + %6:_(s8) = G_TRUNC %15:_(s32) + +CSEInfo::Recording new MI %15:_(s32) = G_CONSTANT i32 7 +InstList : + ---------------------------------------------------------- + %15:_(s32) = G_CONSTANT i32 7 + -------------------------------------------------------- + +Legalizing: %15:_(s32) = G_CONSTANT i32 7 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function trunc: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1 + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + %15:_(s32) = G_CONSTANT i32 7 + %6:_(s8) = G_TRUNC %15:_(s32) + %7:_(s8) = G_TRUNC %2:_(s32) + %12:_(s32) = G_ZEXT %6:_(s8) + %13:_(s32) = G_ANYEXT %7:_(s8) + %14:_(s32) = G_SHL %13:_, %12:_(s32) + %8:_(s8) = G_TRUNC %14:_(s32) + %9:_(s32) = G_ZEXT %6:_(s8) + %10:_(s32) = G_SEXT %8:_(s8) + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + %4:_(s8) = G_TRUNC %11:_(s32) + %5:_(s32) = G_ZEXT %4:_(s8) + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +# End machine code for function trunc. + +ArtifactList : + ---------------------------------------------------------- + %9:_(s32) = G_ZEXT %6:_(s8) + %10:_(s32) = G_SEXT %8:_(s8) + %12:_(s32) = G_ZEXT %6:_(s8) + %13:_(s32) = G_ANYEXT %7:_(s8) + %5:_(s32) = G_ZEXT %4:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %5:_(s32) = G_ZEXT %4:_(s8) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %5:_(s32) = G_ZEXT %4:_(s8) + Changing + %4:_(s8) = G_TRUNC %11:_(s32) + . . . + %5:_(s32) = G_ZEXT %4:_(s8) +CSEInfo::Handling recorded MI %15:_(s32) = G_CONSTANT i32 7 +CSEInfo::Recording new MI G_CONSTANT +Into: + %16:_(s32) = G_CONSTANT i32 255 + %17:_(s32) = COPY %11:_(s32) + %5:_(s32) = G_AND %17:_, %16:_ + . . . + %5:_(s32) = G_ZEXT %4:_(s8) + +Erasing dead instr as result of combine: %5:_(s32) = G_ZEXT %4:_(s8) + +Erasing dead instr as result of combine: %4:_(s8) = G_TRUNC %11:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %9:_(s32) = G_ZEXT %6:_(s8) + %10:_(s32) = G_SEXT %8:_(s8) + %12:_(s32) = G_ZEXT %6:_(s8) + %13:_(s32) = G_ANYEXT %7:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %13:_(s32) = G_ANYEXT %7:_(s8) + +.. Combine MI: %13:_(s32) = G_ANYEXT %7:_(s8) + Changing + %7:_(s8) = G_TRUNC %2:_(s32) + . . . + %13:_(s32) = G_ANYEXT %7:_(s8) +Into: + %13:_(s32) = COPY %2:_(s32) + . . . + %13:_(s32) = G_ANYEXT %7:_(s8) + +Erasing dead instr as result of combine: %13:_(s32) = G_ANYEXT %7:_(s8) + +Erasing dead instr as result of combine: %7:_(s8) = G_TRUNC %2:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %9:_(s32) = G_ZEXT %6:_(s8) + %10:_(s32) = G_SEXT %8:_(s8) + %12:_(s32) = G_ZEXT %6:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %12:_(s32) = G_ZEXT %6:_(s8) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %12:_(s32) = G_ZEXT %6:_(s8) + Changing + %6:_(s8) = G_TRUNC %15:_(s32) + . . . + %12:_(s32) = G_ZEXT %6:_(s8) +CSEInfo::Found Instr %16:_(s32) = G_CONSTANT i32 255 +Into: + %18:_(s32) = COPY %15:_(s32) + %12:_(s32) = G_AND %18:_, %16:_ + . . . + %12:_(s32) = G_ZEXT %6:_(s8) + +Erasing dead instr as result of combine: %12:_(s32) = G_ZEXT %6:_(s8) + +ArtifactList : + ---------------------------------------------------------- + %9:_(s32) = G_ZEXT %6:_(s8) + %10:_(s32) = G_SEXT %8:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %10:_(s32) = G_SEXT %8:_(s8) + +Applying legalizer ruleset to: G_SHL, Tys={s32, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %10:_(s32) = G_SEXT %8:_(s8) + Changing + %8:_(s8) = G_TRUNC %14:_(s32) + . . . + %10:_(s32) = G_SEXT %8:_(s8) +CSEInfo::Recording new MI G_CONSTANT +Into: + %19:_(s32) = G_CONSTANT i32 24 + %20:_(s32) = COPY %14:_(s32) + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + . . . + %10:_(s32) = G_SEXT %8:_(s8) + +Erasing dead instr as result of combine: %10:_(s32) = G_SEXT %8:_(s8) + +Erasing dead instr as result of combine: %8:_(s8) = G_TRUNC %14:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %9:_(s32) = G_ZEXT %6:_(s8) + -------------------------------------------------------- + +Inspecting Artifact : %9:_(s32) = G_ZEXT %6:_(s8) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %9:_(s32) = G_ZEXT %6:_(s8) + Changing + %6:_(s8) = G_TRUNC %15:_(s32) + . . . + %9:_(s32) = G_ZEXT %6:_(s8) +CSEInfo::Found Instr %16:_(s32) = G_CONSTANT i32 255 +Into: + %22:_(s32) = COPY %15:_(s32) + %9:_(s32) = G_AND %22:_, %16:_ + . . . + %9:_(s32) = G_ZEXT %6:_(s8) + +Erasing dead instr as result of combine: %9:_(s32) = G_ZEXT %6:_(s8) + +Erasing dead instr as result of combine: %6:_(s8) = G_TRUNC %15:_(s32) + +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %5:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + %9:_(s32) = G_AND %22:_, %16:_ + -------------------------------------------------------- + +Legalizing: %9:_(s32) = G_AND %22:_, %16:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %5:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + -------------------------------------------------------- + +Legalizing: %10:_(s32) = G_ASHR %21:_, %19:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %5:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %21:_(s32) = G_SHL %20:_, %19:_(s32) + -------------------------------------------------------- + +Legalizing: %21:_(s32) = G_SHL %20:_, %19:_(s32) +Applying legalizer ruleset to: G_SHL, Tys={s32, s32, }, Opcode=G_SHL, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %5:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + -------------------------------------------------------- + +Legalizing: %19:_(s32) = G_CONSTANT i32 24 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %5:_(s32) = G_AND %17:_, %16:_ + %12:_(s32) = G_AND %18:_, %16:_ + -------------------------------------------------------- + +Legalizing: %12:_(s32) = G_AND %18:_, %16:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + %5:_(s32) = G_AND %17:_, %16:_ + -------------------------------------------------------- + +Legalizing: %5:_(s32) = G_AND %17:_, %16:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %16:_(s32) = G_CONSTANT i32 255 + -------------------------------------------------------- + +Legalizing: %16:_(s32) = G_CONSTANT i32 255 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function trunc: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1 + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0:_(p0) :: (load 4 from %ir.i32_ptr_a) + %15:_(s32) = G_CONSTANT i32 7 + %16:_(s32) = G_CONSTANT i32 255 + %18:_(s32) = COPY %15:_(s32) + %12:_(s32) = G_AND %18:_, %16:_ + %13:_(s32) = COPY %2:_(s32) + %14:_(s32) = G_SHL %13:_, %12:_(s32) + %22:_(s32) = COPY %15:_(s32) + %9:_(s32) = G_AND %22:_, %16:_ + %19:_(s32) = G_CONSTANT i32 24 + %20:_(s32) = COPY %14:_(s32) + %21:_(s32) = G_SHL %20:_, %19:_(s32) + %10:_(s32) = G_ASHR %21:_, %19:_(s32) + %11:_(s32) = G_ASHR %10:_, %9:_(s32) + %17:_(s32) = COPY %11:_(s32) + %5:_(s32) = G_AND %17:_, %16:_ + G_STORE %5:_(s32), %1:_(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +# End machine code for function trunc. + +CSEInfo::CSE Hit for Opc 85 : 2 + discovered a new reachable node %entry +[SafeStack] Function: merge +[SafeStack] safestack is not requested for this function + discovered a new reachable node %entry +Checking DILocation from %add = add i32 %y, %x was copied to G_ADD +Checking DILocation from %conv = sext i32 %add to i64 was copied to G_SEXT +Checking DILocation from %add1 = add i64 %conv, %z was copied to G_ADD +Checking DILocation from ret i64 %add1 was copied to G_UNMERGE_VALUES +Checking DILocation from ret i64 %add1 was copied to COPY +Checking DILocation from ret i64 %add1 was copied to COPY +Checking DILocation from ret i64 %add1 was copied to RetRA implicit $v0, implicit $v1 +Generic MI Combiner for: merge + +Try combining %0:_(s32) = COPY $a0 + +Try combining %1:_(s32) = COPY $a1 + +Try combining %3:_(s32) = COPY $a2 + +Try combining %4:_(s32) = COPY $a3 + +Try combining %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + +Try combining %5:_(s32) = G_ADD %1:_, %0:_ + +Try combining %6:_(s64) = G_SEXT %5:_(s32) + +Try combining %7:_(s64) = G_ADD %6:_, %2:_ + +Try combining %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + +Try combining $v0 = COPY %8:_(s32) + +Try combining $v1 = COPY %9:_(s32) + +Try combining RetRA implicit $v0, implicit $v1 +Legalize Machine IR for: merge +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %7:_(s64) = G_ADD %6:_, %2:_ + -------------------------------------------------------- + +Legalizing: %7:_(s64) = G_ADD %6:_, %2:_ +Applying legalizer ruleset to: G_ADD, Tys={s64, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = widerThan .. match :.. .. NarrowScalar, 0, s32 +.. Narrow scalar + Changing + %6:_(s64) = G_SEXT %5:_(s32) + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + . . . + %7:_(s64) = G_ADD %6:_, %2:_ +CSEInfo::Recording new MI G_CONSTANT +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %17:_(s32), %18:_(s1) = G_UADDE %11:_, %13:_, %16:_ + -------------------------------------------------------- + +Legalizing: %17:_(s32), %18:_(s1) = G_UADDE %11:_, %13:_, %16:_ +.. opcode G_UADDE is aliased to G_UADDO +Applying legalizer ruleset to: G_UADDE, Tys={s32, s1, }, Opcode=G_UADDE, MMOs={} +Rule.Predicate = typePairInSet .. match :.. .. Lower, 0, s32 +.. Lower +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %19:_(s32) = G_ADD %11:_, %13:_ + %17:_(s32) = G_ADD %19:_, %20:_ + %18:_(s1) = G_ICMP intpred(ult), %17:_(s32), %11:_ + -------------------------------------------------------- + +%18:_(s1) = G_ICMP intpred(ult), %17:_(s32), %11:_ +Is dead; erasing. +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %19:_(s32) = G_ADD %11:_, %13:_ + %17:_(s32) = G_ADD %19:_, %20:_ + -------------------------------------------------------- + +Legalizing: %17:_(s32) = G_ADD %19:_, %20:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + %19:_(s32) = G_ADD %11:_, %13:_ + -------------------------------------------------------- + +Legalizing: %19:_(s32) = G_ADD %11:_, %13:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ + -------------------------------------------------------- + +Legalizing: %15:_(s32), %16:_(s1) = G_UADDE %10:_, %12:_, %14:_ +.. opcode G_UADDE is aliased to G_UADDO +Applying legalizer ruleset to: G_UADDE, Tys={s32, s1, }, Opcode=G_UADDE, MMOs={} +Rule.Predicate = typePairInSet .. match :.. .. Lower, 0, s32 +.. Lower +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + %15:_(s32) = G_ADD %21:_, %22:_ + %16:_(s1) = G_ICMP intpred(ult), %15:_(s32), %10:_ + -------------------------------------------------------- + +Legalizing: %16:_(s1) = G_ICMP intpred(ult), %15:_(s32), %10:_ +Applying legalizer ruleset to: G_ICMP, Tys={s1, s32, }, Opcode=G_ICMP, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. no match for action :WidenScalar +Rule.Predicate = widerThan .. no match for action :NarrowScalar +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + %15:_(s32) = G_ADD %21:_, %22:_ + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + . . . + %16:_(s1) = G_ICMP intpred(ult), %15:_(s32), %10:_ +Into: + . . . + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + . . . + %16:_(s1) = G_TRUNC %23:_(s32) + +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + %15:_(s32) = G_ADD %21:_, %22:_ + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + -------------------------------------------------------- + +Legalizing: %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ +Applying legalizer ruleset to: G_ICMP, Tys={s32, s32, }, Opcode=G_ICMP, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + %15:_(s32) = G_ADD %21:_, %22:_ + -------------------------------------------------------- + +Legalizing: %15:_(s32) = G_ADD %21:_, %22:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + %21:_(s32) = G_ADD %10:_, %12:_ + -------------------------------------------------------- + +Legalizing: %21:_(s32) = G_ADD %10:_, %12:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %14:_(s1) = G_CONSTANT i1 false + -------------------------------------------------------- + +Legalizing: %14:_(s1) = G_CONSTANT i1 false +Applying legalizer ruleset to: G_CONSTANT, Tys={s1, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. no match for action :Legal +Rule.Predicate = narrowerThan .. match :.. .. WidenScalar, 0, s32 +.. Widen scalar + Changing + . . . + %14:_(s1) = G_CONSTANT i1 false +CSEInfo::Recording new MI %14:_(s1) = G_CONSTANT i1 false +Into: + . . . + %24:_(s32) = G_CONSTANT i32 0 + . . . + %14:_(s1) = G_TRUNC %24:_(s32) + +CSEInfo::Recording new MI %24:_(s32) = G_CONSTANT i32 0 +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + %24:_(s32) = G_CONSTANT i32 0 + -------------------------------------------------------- + +Legalizing: %24:_(s32) = G_CONSTANT i32 0 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %5:_(s32) = G_ADD %1:_, %0:_ + -------------------------------------------------------- + +Legalizing: %5:_(s32) = G_ADD %1:_, %0:_ +Applying legalizer ruleset to: G_ADD, Tys={s32, }, Opcode=G_ADD, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function merge: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1, $a2, $a3 + %0:_(s32) = COPY $a0 + %1:_(s32) = COPY $a1 + %3:_(s32) = COPY $a2 + %4:_(s32) = COPY $a3 + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + %5:_(s32) = G_ADD %1:_, %0:_ + %6:_(s64) = G_SEXT %5:_(s32) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + %24:_(s32) = G_CONSTANT i32 0 + %14:_(s1) = G_TRUNC %24:_(s32) + %21:_(s32) = G_ADD %10:_, %12:_ + %22:_(s32) = G_ZEXT %14:_(s1) + %15:_(s32) = G_ADD %21:_, %22:_ + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + %16:_(s1) = G_TRUNC %23:_(s32) + %19:_(s32) = G_ADD %11:_, %13:_ + %20:_(s32) = G_ZEXT %16:_(s1) + %17:_(s32) = G_ADD %19:_, %20:_ + %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + $v0 = COPY %8:_(s32) + $v1 = COPY %9:_(s32) + RetRA implicit $v0, implicit $v1 + +# End machine code for function merge. + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + %20:_(s32) = G_ZEXT %16:_(s1) + %22:_(s32) = G_ZEXT %14:_(s1) + -------------------------------------------------------- + +Inspecting Artifact : %22:_(s32) = G_ZEXT %14:_(s1) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %22:_(s32) = G_ZEXT %14:_(s1) + Changing + %14:_(s1) = G_TRUNC %24:_(s32) + . . . + %22:_(s32) = G_ZEXT %14:_(s1) +CSEInfo::Handling recorded MI %24:_(s32) = G_CONSTANT i32 0 +CSEInfo::Recording new MI G_CONSTANT +Into: + %25:_(s32) = G_CONSTANT i32 1 + %26:_(s32) = COPY %24:_(s32) + %22:_(s32) = G_AND %26:_, %25:_ + . . . + %22:_(s32) = G_ZEXT %14:_(s1) + +Erasing dead instr as result of combine: %22:_(s32) = G_ZEXT %14:_(s1) + +Erasing dead instr as result of combine: %14:_(s1) = G_TRUNC %24:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + %20:_(s32) = G_ZEXT %16:_(s1) + -------------------------------------------------------- + +Inspecting Artifact : %20:_(s32) = G_ZEXT %16:_(s1) + +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Combine MI: %20:_(s32) = G_ZEXT %16:_(s1) + Changing + %16:_(s1) = G_TRUNC %23:_(s32) + . . . + %20:_(s32) = G_ZEXT %16:_(s1) +CSEInfo::Found Instr %25:_(s32) = G_CONSTANT i32 1 +Into: + %27:_(s32) = COPY %23:_(s32) + %20:_(s32) = G_AND %27:_, %25:_ + . . . + %20:_(s32) = G_ZEXT %16:_(s1) + +Erasing dead instr as result of combine: %20:_(s32) = G_ZEXT %16:_(s1) + +Erasing dead instr as result of combine: %16:_(s1) = G_TRUNC %23:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + -------------------------------------------------------- + +Inspecting Artifact : %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) + + Changing + %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + . . . + %12:_(s32), %13:_(s32) = G_UNMERGE_VALUES %2:_(s64) +Doing Merge/Unmerge coombine with MRI.replaceRegWith(,) Observer does not catch this atm: +Into: + . . . + %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2:_(s64) + +Erasing dead instr as result of combine: %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2:_(s64) + +Erasing dead instr as result of combine: %2:_(s64) = G_MERGE_VALUES %3:_(s32), %4:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + -------------------------------------------------------- + +Inspecting Artifact : %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + +Detected chain to unprocessed instr: %6:_(s64) = G_SEXT %5:_(s32) + +Try combine later for: %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + -------------------------------------------------------- + +Inspecting Artifact : %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) + + Changing + %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + . . . + %8:_(s32), %9:_(s32) = G_UNMERGE_VALUES %7:_(s64) +Doing Merge/Unmerge coombine with MRI.replaceRegWith(,) Observer does not catch this atm: +Into: + . . . + %15:_(s32), %17:_(s32) = G_UNMERGE_VALUES %7:_(s64) + +Erasing dead instr as result of combine: %15:_(s32), %17:_(s32) = G_UNMERGE_VALUES %7:_(s64) + +Erasing dead instr as result of combine: %7:_(s64) = G_MERGE_VALUES %15:_(s32), %17:_(s32) + +ArtifactList : + ---------------------------------------------------------- + %6:_(s64) = G_SEXT %5:_(s32) + -------------------------------------------------------- + +Inspecting Artifact : %6:_(s64) = G_SEXT %5:_(s32) + +Unable to combine: %6:_(s64) = G_SEXT %5:_(s32) + +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + %6:_(s64) = G_SEXT %5:_(s32) + -------------------------------------------------------- + +Legalizing: %6:_(s64) = G_SEXT %5:_(s32) +.. opcode G_SEXT is aliased to G_ZEXT +Applying legalizer ruleset to: G_SEXT, Tys={s64, s32, }, Opcode=G_SEXT, MMOs={} +Rule.Predicate =unknown Predicate.. no match for action :Legal +Rule.Predicate = widerThan .. match :.. .. NarrowScalar, 0, s32 +.. Narrow scalar + Changing + %5:_(s32) = G_ADD %1:_, %0:_ + . . . + %6:_(s64) = G_SEXT %5:_(s32) +CSEInfo::Recording new MI G_CONSTANT +Into: + %28:_(s32) = COPY %5:_(s32) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28:_, %30:_(s32) + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + . . . + %6:_(s64) = G_SEXT %5:_(s32) + +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28:_, %30:_(s32) + -------------------------------------------------------- + +Legalizing: %29:_(s32) = G_ASHR %28:_, %30:_(s32) +.. opcode G_ASHR is aliased to G_SHL +Applying legalizer ruleset to: G_ASHR, Tys={s32, s32, }, Opcode=G_ASHR, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + %30:_(s32) = G_CONSTANT i32 31 + -------------------------------------------------------- + +Legalizing: %30:_(s32) = G_CONSTANT i32 31 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + %20:_(s32) = G_AND %27:_, %25:_ + -------------------------------------------------------- + +Legalizing: %20:_(s32) = G_AND %27:_, %25:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + %22:_(s32) = G_AND %26:_, %25:_ + -------------------------------------------------------- + +Legalizing: %22:_(s32) = G_AND %26:_, %25:_ +Applying legalizer ruleset to: G_AND, Tys={s32, }, Opcode=G_AND, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal +InstList : + ---------------------------------------------------------- + %25:_(s32) = G_CONSTANT i32 1 + -------------------------------------------------------- + +Legalizing: %25:_(s32) = G_CONSTANT i32 1 +Applying legalizer ruleset to: G_CONSTANT, Tys={s32, }, Opcode=G_CONSTANT, MMOs={} +Rule.Predicate = typeInSet .. match :.. .. Legal, 0, LLT_invalid +.. Already legal + +Arfifact combine begins : +# Machine code for function merge: IsSSA, TracksLiveness + +bb.1.entry: + liveins: $a0, $a1, $a2, $a3 + %0:_(s32) = COPY $a0 + %1:_(s32) = COPY $a1 + %3:_(s32) = COPY $a2 + %4:_(s32) = COPY $a3 + %5:_(s32) = G_ADD %1:_, %0:_ + %28:_(s32) = COPY %5:_(s32) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28:_, %30:_(s32) + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + %24:_(s32) = G_CONSTANT i32 0 + %21:_(s32) = G_ADD %10:_, %3:_ + %25:_(s32) = G_CONSTANT i32 1 + %26:_(s32) = COPY %24:_(s32) + %22:_(s32) = G_AND %26:_, %25:_ + %15:_(s32) = G_ADD %21:_, %22:_ + %23:_(s32) = G_ICMP intpred(ult), %15:_(s32), %10:_ + %19:_(s32) = G_ADD %11:_, %4:_ + %27:_(s32) = COPY %23:_(s32) + %20:_(s32) = G_AND %27:_, %25:_ + %17:_(s32) = G_ADD %19:_, %20:_ + $v0 = COPY %15:_(s32) + $v1 = COPY %17:_(s32) + RetRA implicit $v0, implicit $v1 + +# End machine code for function merge. + +ArtifactList : + ---------------------------------------------------------- + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + -------------------------------------------------------- + +Inspecting Artifact : %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) + + Changing + %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + . . . + %10:_(s32), %11:_(s32) = G_UNMERGE_VALUES %6:_(s64) +Doing Merge/Unmerge coombine with MRI.replaceRegWith(,) Observer does not catch this atm: +Into: + . . . + %28:_(s32), %29:_(s32) = G_UNMERGE_VALUES %6:_(s64) + +Erasing dead instr as result of combine: %28:_(s32), %29:_(s32) = G_UNMERGE_VALUES %6:_(s64) + +Erasing dead instr as result of combine: %6:_(s64) = G_MERGE_VALUES %28:_(s32), %29:_(s32) + +CSEInfo::CSE Hit for Opc 85 : 1 +--- | + ; ModuleID = '/home/rtrk/giselprintf_git/printf.ll' + source_filename = "/home/rtrk/giselprintf_git/printf.ll" + target datalayout = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" + + define void @trunc(i32* %i32_ptr_a, i32* %i32_ptr_b) { + entry: + %0 = load i32, i32* %i32_ptr_a, align 4 + %tobool = trunc i32 %0 to i1 + %frombool2 = sext i1 %tobool to i8 + %fromchar3 = zext i8 %frombool2 to i32 + store i32 %fromchar3, i32* %i32_ptr_b, align 4 + ret void + } + + define i64 @merge(i32 %x, i32 %y, i64 %z) { + entry: + %add = add i32 %y, %x + %conv = sext i32 %add to i64 + %add1 = add i64 %conv, %z + ret i64 %add1 + } + +... +--- +name: trunc +alignment: 2 +legalized: true +tracksRegLiveness: true +registers: + - { id: 0, class: _ } + - { id: 1, class: _ } + - { id: 2, class: _ } + - { id: 3, class: _ } + - { id: 4, class: _ } + - { id: 5, class: _ } + - { id: 6, class: _ } + - { id: 7, class: _ } + - { id: 8, class: _ } + - { id: 9, class: _ } + - { id: 10, class: _ } + - { id: 11, class: _ } + - { id: 12, class: _ } + - { id: 13, class: _ } + - { id: 14, class: _ } + - { id: 15, class: _ } + - { id: 16, class: _ } + - { id: 17, class: _ } + - { id: 18, class: _ } + - { id: 19, class: _ } + - { id: 20, class: _ } + - { id: 21, class: _ } + - { id: 22, class: _ } +frameInfo: + maxAlignment: 1 +machineFunctionInfo: {} +body: | + bb.1.entry: + liveins: $a0, $a1 + + %0:_(p0) = COPY $a0 + %1:_(p0) = COPY $a1 + %2:_(s32) = G_LOAD %0(p0) :: (load 4 from %ir.i32_ptr_a) + %15:_(s32) = G_CONSTANT i32 7 + %16:_(s32) = G_CONSTANT i32 255 + %18:_(s32) = COPY %15(s32) + %12:_(s32) = G_AND %18, %16 + %13:_(s32) = COPY %2(s32) + %14:_(s32) = G_SHL %13, %12(s32) + %22:_(s32) = COPY %15(s32) + %9:_(s32) = G_AND %22, %16 + %19:_(s32) = G_CONSTANT i32 24 + %20:_(s32) = COPY %14(s32) + %21:_(s32) = G_SHL %20, %19(s32) + %10:_(s32) = G_ASHR %21, %19(s32) + %11:_(s32) = G_ASHR %10, %9(s32) + %17:_(s32) = COPY %11(s32) + %5:_(s32) = G_AND %17, %16 + G_STORE %5(s32), %1(p0) :: (store 4 into %ir.i32_ptr_b) + RetRA + +... +--- +name: merge +alignment: 2 +legalized: true +tracksRegLiveness: true +registers: + - { id: 0, class: _ } + - { id: 1, class: _ } + - { id: 2, class: _ } + - { id: 3, class: _ } + - { id: 4, class: _ } + - { id: 5, class: _ } + - { id: 6, class: _ } + - { id: 7, class: _ } + - { id: 8, class: _ } + - { id: 9, class: _ } + - { id: 10, class: _ } + - { id: 11, class: _ } + - { id: 12, class: _ } + - { id: 13, class: _ } + - { id: 14, class: _ } + - { id: 15, class: _ } + - { id: 16, class: _ } + - { id: 17, class: _ } + - { id: 18, class: _ } + - { id: 19, class: _ } + - { id: 20, class: _ } + - { id: 21, class: _ } + - { id: 22, class: _ } + - { id: 23, class: _ } + - { id: 24, class: _ } + - { id: 25, class: _ } + - { id: 26, class: _ } + - { id: 27, class: _ } + - { id: 28, class: _ } + - { id: 29, class: _ } + - { id: 30, class: _ } +frameInfo: + maxAlignment: 1 +machineFunctionInfo: {} +body: | + bb.1.entry: + liveins: $a0, $a1, $a2, $a3 + + %0:_(s32) = COPY $a0 + %1:_(s32) = COPY $a1 + %3:_(s32) = COPY $a2 + %4:_(s32) = COPY $a3 + %5:_(s32) = G_ADD %1, %0 + %28:_(s32) = COPY %5(s32) + %30:_(s32) = G_CONSTANT i32 31 + %29:_(s32) = G_ASHR %28, %30(s32) + %24:_(s32) = G_CONSTANT i32 0 + %21:_(s32) = G_ADD %28, %3 + %25:_(s32) = G_CONSTANT i32 1 + %26:_(s32) = COPY %24(s32) + %22:_(s32) = G_AND %26, %25 + %15:_(s32) = G_ADD %21, %22 + %23:_(s32) = G_ICMP intpred(ult), %15(s32), %28 + %19:_(s32) = G_ADD %29, %4 + %27:_(s32) = COPY %23(s32) + %20:_(s32) = G_AND %27, %25 + %17:_(s32) = G_ADD %19, %20 + $v0 = COPY %15(s32) + $v1 = COPY %17(s32) + RetRA implicit $v0, implicit $v1 + +... \ No newline at end of file